agents-inc 0.168.0 → 0.170.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +18 -15
  3. package/dist/{chunk-JIBCVXXL.js → chunk-3G7X2WKI.js} +4 -4
  4. package/dist/{chunk-JOEA52NR.js → chunk-44TE3RKH.js} +46 -2
  5. package/dist/chunk-44TE3RKH.js.map +1 -0
  6. package/dist/{chunk-NU2K5G54.js → chunk-52HDHJ7I.js} +11 -19
  7. package/dist/chunk-52HDHJ7I.js.map +1 -0
  8. package/dist/{chunk-EH2PGPLP.js → chunk-6HNXYYVF.js} +39 -22
  9. package/dist/chunk-6HNXYYVF.js.map +1 -0
  10. package/dist/{chunk-4UKMQUAU.js → chunk-6ZRH5RHC.js} +10 -11
  11. package/dist/chunk-6ZRH5RHC.js.map +1 -0
  12. package/dist/{chunk-5JUQKGCP.js → chunk-7RDMTR64.js} +14 -34
  13. package/dist/chunk-7RDMTR64.js.map +1 -0
  14. package/dist/{chunk-3LZNY46H.js → chunk-BMRUNMPV.js} +4 -4
  15. package/dist/{chunk-VVRI35SK.js → chunk-CLPUWOSA.js} +4 -4
  16. package/dist/{chunk-VVRI35SK.js.map → chunk-CLPUWOSA.js.map} +1 -1
  17. package/dist/{chunk-TW35AEB4.js → chunk-F2BHT5C4.js} +9 -7
  18. package/dist/chunk-F2BHT5C4.js.map +1 -0
  19. package/dist/{chunk-27AVGFXH.js → chunk-F5EBEATU.js} +2 -2
  20. package/dist/{chunk-GE7NUPMI.js → chunk-HED2DAXZ.js} +3 -3
  21. package/dist/{chunk-7PYXS2QU.js → chunk-KOLDW6SF.js} +3 -3
  22. package/dist/{chunk-7PYXS2QU.js.map → chunk-KOLDW6SF.js.map} +1 -1
  23. package/dist/{chunk-C2UISKIM.js → chunk-MQ6CGZNJ.js} +109 -422
  24. package/dist/chunk-MQ6CGZNJ.js.map +1 -0
  25. package/dist/{chunk-P6I72PR3.js → chunk-NCWDK6L7.js} +115 -196
  26. package/dist/chunk-NCWDK6L7.js.map +1 -0
  27. package/dist/{chunk-VRXX4D6K.js → chunk-NEZ4OAOL.js} +1 -1
  28. package/dist/chunk-NEZ4OAOL.js.map +1 -0
  29. package/dist/chunk-NIHUOWE4.js +106 -0
  30. package/dist/chunk-NIHUOWE4.js.map +1 -0
  31. package/dist/{chunk-OI2H6M5I.js → chunk-NQW25DCF.js} +2 -2
  32. package/dist/chunk-NQW25DCF.js.map +1 -0
  33. package/dist/{chunk-ZUGH4MQG.js → chunk-OYJQUA3D.js} +3 -3
  34. package/dist/{chunk-ZUGH4MQG.js.map → chunk-OYJQUA3D.js.map} +1 -1
  35. package/dist/{chunk-AG3ZVM3B.js → chunk-PJWGTNOX.js} +186 -210
  36. package/dist/chunk-PJWGTNOX.js.map +1 -0
  37. package/dist/{chunk-HR7TK2XW.js → chunk-RIPSGNLU.js} +3 -3
  38. package/dist/chunk-RIPSGNLU.js.map +1 -0
  39. package/dist/{chunk-4DRFEYCE.js → chunk-SZYQISA2.js} +7 -7
  40. package/dist/chunk-SZYQISA2.js.map +1 -0
  41. package/dist/{chunk-W6GO2CYX.js → chunk-USVBYQSQ.js} +2 -2
  42. package/dist/{chunk-H4ZKGGTE.js → chunk-V3KTSP3Q.js} +50 -42
  43. package/dist/chunk-V3KTSP3Q.js.map +1 -0
  44. package/dist/{chunk-KTLKR4YY.js → chunk-WTWMGH2C.js} +2 -2
  45. package/dist/commands/build/marketplace.js +23 -22
  46. package/dist/commands/build/marketplace.js.map +1 -1
  47. package/dist/commands/build/plugins.js +8 -9
  48. package/dist/commands/build/plugins.js.map +1 -1
  49. package/dist/commands/compile.js +19 -20
  50. package/dist/commands/compile.js.map +1 -1
  51. package/dist/commands/doctor.js +17 -18
  52. package/dist/commands/doctor.js.map +1 -1
  53. package/dist/commands/edit.js +118 -297
  54. package/dist/commands/edit.js.map +1 -1
  55. package/dist/commands/eject.js +21 -33
  56. package/dist/commands/eject.js.map +1 -1
  57. package/dist/commands/init.js +17 -45
  58. package/dist/commands/list.js +19 -17
  59. package/dist/commands/list.js.map +1 -1
  60. package/dist/commands/new/marketplace.js +11 -11
  61. package/dist/commands/new/marketplace.js.map +1 -1
  62. package/dist/commands/search.js +12 -13
  63. package/dist/commands/search.js.map +1 -1
  64. package/dist/commands/share.js +11 -12
  65. package/dist/commands/share.js.map +1 -1
  66. package/dist/commands/uninstall.js +18 -20
  67. package/dist/commands/uninstall.js.map +1 -1
  68. package/dist/commands/update.js +8 -9
  69. package/dist/commands/update.js.map +1 -1
  70. package/dist/components/common/removal-plan-confirm.js +2 -2
  71. package/dist/components/common/scroll-affordance.js +9 -0
  72. package/dist/components/common/select-list.js +2 -3
  73. package/dist/components/common/skill-agent-summary.js +11 -0
  74. package/dist/components/common/spinner.js +1 -1
  75. package/dist/{chunk-QWFG7Y3R.js → components/common/summary-panel.js} +57 -31
  76. package/dist/components/common/summary-panel.js.map +1 -0
  77. package/dist/config-exports.js +1 -1
  78. package/dist/hooks/init.js +18 -46
  79. package/dist/hooks/init.js.map +1 -1
  80. package/dist/load-agent-defs-YMDWBFDP.js +14 -0
  81. package/dist/recompile-project-agents-SZ76WNTW.js +18 -0
  82. package/dist/{source-loader-FRJTCSDL.js → source-loader-C5SQXZXI.js} +5 -5
  83. package/dist/src/agents/meta/codex-keeper/playbook.md +2 -3
  84. package/package.json +2 -3
  85. package/src/agents/meta/codex-keeper/playbook.md +2 -3
  86. package/src/schemas/project-config.schema.json +1 -1
  87. package/assets/demo.tape +0 -266
  88. package/dist/chunk-23DNVNFP.js +0 -292
  89. package/dist/chunk-23DNVNFP.js.map +0 -1
  90. package/dist/chunk-3DIDV6H3.js +0 -268
  91. package/dist/chunk-3DIDV6H3.js.map +0 -1
  92. package/dist/chunk-4DRFEYCE.js.map +0 -1
  93. package/dist/chunk-4HWOYYY7.js +0 -92
  94. package/dist/chunk-4HWOYYY7.js.map +0 -1
  95. package/dist/chunk-4UKMQUAU.js.map +0 -1
  96. package/dist/chunk-5JUQKGCP.js.map +0 -1
  97. package/dist/chunk-6WGXTB2L.js +0 -28
  98. package/dist/chunk-6WGXTB2L.js.map +0 -1
  99. package/dist/chunk-AG3ZVM3B.js.map +0 -1
  100. package/dist/chunk-C2UISKIM.js.map +0 -1
  101. package/dist/chunk-CMJBKQUH.js +0 -23
  102. package/dist/chunk-CMJBKQUH.js.map +0 -1
  103. package/dist/chunk-DJEO3F2H.js +0 -230
  104. package/dist/chunk-DJEO3F2H.js.map +0 -1
  105. package/dist/chunk-EH2PGPLP.js.map +0 -1
  106. package/dist/chunk-GRL73YPF.js +0 -197
  107. package/dist/chunk-GRL73YPF.js.map +0 -1
  108. package/dist/chunk-H4ZKGGTE.js.map +0 -1
  109. package/dist/chunk-HI6YB7XP.js +0 -59
  110. package/dist/chunk-HI6YB7XP.js.map +0 -1
  111. package/dist/chunk-HL3GYRMR.js +0 -17
  112. package/dist/chunk-HL3GYRMR.js.map +0 -1
  113. package/dist/chunk-HR7TK2XW.js.map +0 -1
  114. package/dist/chunk-JOEA52NR.js.map +0 -1
  115. package/dist/chunk-JPMV4E4E.js +0 -118
  116. package/dist/chunk-JPMV4E4E.js.map +0 -1
  117. package/dist/chunk-JVUN6AOO.js +0 -237
  118. package/dist/chunk-JVUN6AOO.js.map +0 -1
  119. package/dist/chunk-KQ3PDARZ.js +0 -25
  120. package/dist/chunk-KQ3PDARZ.js.map +0 -1
  121. package/dist/chunk-L3W2JWBA.js +0 -168
  122. package/dist/chunk-L3W2JWBA.js.map +0 -1
  123. package/dist/chunk-LFUJCRCT.js +0 -27
  124. package/dist/chunk-LFUJCRCT.js.map +0 -1
  125. package/dist/chunk-NU2K5G54.js.map +0 -1
  126. package/dist/chunk-OI2H6M5I.js.map +0 -1
  127. package/dist/chunk-P6I72PR3.js.map +0 -1
  128. package/dist/chunk-PCFUXQJA.js +0 -317
  129. package/dist/chunk-PCFUXQJA.js.map +0 -1
  130. package/dist/chunk-PLX2FLEQ.js +0 -48
  131. package/dist/chunk-PLX2FLEQ.js.map +0 -1
  132. package/dist/chunk-QWFG7Y3R.js.map +0 -1
  133. package/dist/chunk-SLBL3WIP.js +0 -121
  134. package/dist/chunk-SLBL3WIP.js.map +0 -1
  135. package/dist/chunk-TSIU7DME.js +0 -43
  136. package/dist/chunk-TSIU7DME.js.map +0 -1
  137. package/dist/chunk-TW35AEB4.js.map +0 -1
  138. package/dist/chunk-VRXX4D6K.js.map +0 -1
  139. package/dist/chunk-W5KEYSOL.js +0 -51
  140. package/dist/chunk-W5KEYSOL.js.map +0 -1
  141. package/dist/chunk-WNLF5EDZ.js +0 -1170
  142. package/dist/chunk-WNLF5EDZ.js.map +0 -1
  143. package/dist/chunk-WTJ3AY33.js +0 -31
  144. package/dist/chunk-WTJ3AY33.js.map +0 -1
  145. package/dist/chunk-X6ZZEYO3.js +0 -53
  146. package/dist/chunk-X6ZZEYO3.js.map +0 -1
  147. package/dist/chunk-XQHZPINL.js +0 -89
  148. package/dist/chunk-XQHZPINL.js.map +0 -1
  149. package/dist/chunk-YN3SWF53.js +0 -35
  150. package/dist/chunk-YN3SWF53.js.map +0 -1
  151. package/dist/components/wizard/category-grid.js +0 -13
  152. package/dist/components/wizard/checkbox-grid.js +0 -12
  153. package/dist/components/wizard/domain-selection.js +0 -18
  154. package/dist/components/wizard/run-wizard-session.js +0 -40
  155. package/dist/components/wizard/run-wizard-session.js.map +0 -1
  156. package/dist/components/wizard/scroll-affordance.js +0 -9
  157. package/dist/components/wizard/skill-agent-summary.js +0 -13
  158. package/dist/components/wizard/source-grid.js +0 -16
  159. package/dist/components/wizard/source-grid.js.map +0 -1
  160. package/dist/components/wizard/stack-selection.js +0 -17
  161. package/dist/components/wizard/stack-selection.js.map +0 -1
  162. package/dist/components/wizard/step-agents.js +0 -18
  163. package/dist/components/wizard/step-agents.js.map +0 -1
  164. package/dist/components/wizard/step-build.js +0 -18
  165. package/dist/components/wizard/step-build.js.map +0 -1
  166. package/dist/components/wizard/step-confirm.js +0 -18
  167. package/dist/components/wizard/step-confirm.js.map +0 -1
  168. package/dist/components/wizard/step-sources.js +0 -19
  169. package/dist/components/wizard/step-sources.js.map +0 -1
  170. package/dist/components/wizard/step-stack.js +0 -18
  171. package/dist/components/wizard/step-stack.js.map +0 -1
  172. package/dist/components/wizard/summary-panel.js +0 -17
  173. package/dist/components/wizard/summary-panel.js.map +0 -1
  174. package/dist/components/wizard/toast.js +0 -9
  175. package/dist/components/wizard/toast.js.map +0 -1
  176. package/dist/components/wizard/wizard-layout.js +0 -22
  177. package/dist/components/wizard/wizard-layout.js.map +0 -1
  178. package/dist/components/wizard/wizard-tabs.js +0 -11
  179. package/dist/components/wizard/wizard-tabs.js.map +0 -1
  180. package/dist/components/wizard/wizard.js +0 -39
  181. package/dist/components/wizard/wizard.js.map +0 -1
  182. package/dist/load-agent-defs-5XMVB3MU.js +0 -14
  183. package/dist/load-agent-defs-5XMVB3MU.js.map +0 -1
  184. package/dist/recompile-project-agents-7PQWYQ6B.js +0 -18
  185. package/dist/recompile-project-agents-7PQWYQ6B.js.map +0 -1
  186. package/dist/source-loader-FRJTCSDL.js.map +0 -1
  187. package/dist/stores/wizard-store.js +0 -24
  188. package/dist/stores/wizard-store.js.map +0 -1
  189. /package/assets/{demo.gif → legacy-wizard.gif} +0 -0
  190. /package/dist/{chunk-JIBCVXXL.js.map → chunk-3G7X2WKI.js.map} +0 -0
  191. /package/dist/{chunk-3LZNY46H.js.map → chunk-BMRUNMPV.js.map} +0 -0
  192. /package/dist/{chunk-27AVGFXH.js.map → chunk-F5EBEATU.js.map} +0 -0
  193. /package/dist/{chunk-GE7NUPMI.js.map → chunk-HED2DAXZ.js.map} +0 -0
  194. /package/dist/{chunk-W6GO2CYX.js.map → chunk-USVBYQSQ.js.map} +0 -0
  195. /package/dist/{chunk-KTLKR4YY.js.map → chunk-WTWMGH2C.js.map} +0 -0
  196. /package/dist/components/{wizard → common}/scroll-affordance.js.map +0 -0
  197. /package/dist/components/{wizard → common}/skill-agent-summary.js.map +0 -0
  198. /package/dist/{components/wizard/category-grid.js.map → load-agent-defs-YMDWBFDP.js.map} +0 -0
  199. /package/dist/{components/wizard/checkbox-grid.js.map → recompile-project-agents-SZ76WNTW.js.map} +0 -0
  200. /package/dist/{components/wizard/domain-selection.js.map → source-loader-C5SQXZXI.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/stores/wizard-store.ts","../src/cli/lib/wizard/build-step-logic.ts","../src/cli/lib/wizard/scope-diff.ts","../src/cli/lib/wizard/agent-roster.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport {\n CLI_INVOKE_COMMAND,\n DEFAULT_PUBLIC_SOURCE_NAME,\n DEFAULT_SCRATCH_DOMAINS,\n EJECT_SOURCE,\n FALLBACK_DOMAIN,\n INSTALL_MODES,\n SKILL_CATEGORIES_PATH,\n} from \"../consts.js\";\nimport type { InstallMode } from \"../lib/installation/index.js\";\nimport { deriveInstallMode as sharedDeriveInstallMode } from \"../lib/installation/installation.js\";\nimport type { AgentScopeConfig, SkillConfig, SkillScope } from \"../types/config.js\";\nimport {\n isActiveAt,\n isGlobalTombstone,\n isProjectOwned,\n} from \"../lib/configuration/scope-predicates.js\";\nimport { isLocalOnlySkill } from \"../lib/loading/multi-source-loader.js\";\nimport { matrix, getSkillById, getCategoryDomain } from \"../lib/matrix/matrix-provider.js\";\nimport {\n agentSlotKey,\n buildCategoriesForDomain,\n firstFocusableAgent,\n orderDomains,\n skillSlotKey,\n} from \"../lib/wizard/index.js\";\nimport type {\n AgentName,\n Domain,\n DomainSelections,\n SkillId,\n Category,\n CategorySelections,\n ResolvedSkill,\n} from \"../types/index.js\";\nimport type { SourceOption, SourceRow } from \"../components/wizard/source-grid.js\";\nimport { disableBuffering, drainBuffer, enableBuffering, warn } from \"../utils/logger.js\";\nimport { typedEntries, typedFromEntries, typedKeys, typedValues } from \"../utils/typed-object.js\";\n\nconst LOCAL_ONLY_INSTALL_MODES = [\"eject\"] as const satisfies readonly Exclude<\n InstallMode,\n \"mixed\"\n>[];\n\n/** Toast strings surfaced by scope/selection guards (E2E asserts these verbatim). */\nconst TOAST_MESSAGES = {\n GLOBAL_SKILLS_LOCKED: \"Global skills cannot be changed from project scope\",\n ALREADY_EJECTED_AT_GLOBAL: \"Already exists as ejected skill at global scope\",\n GLOBAL_AGENTS_LOCKED: \"Global agents cannot be changed from project scope\",\n} as const;\n\n/**\n * One line: `Toast` paints a single row inside a frame sized to the terminal, so a longer message\n * would wrap and break it. `unresolvableSkillIds` still carries every id for `edit` to name.\n */\nfunction skillsLeftOutToast(count: number): string {\n return count === 1\n ? \"1 skill was left out — this source cannot place it\"\n : `${count} skills were left out — this source cannot place them`;\n}\n\nfunction resolveEffectiveSource(...candidates: Array<string | undefined>): string {\n return candidates.find((source) => source !== undefined) ?? DEFAULT_PUBLIC_SOURCE_NAME;\n}\n\nfunction primarySourceName(skill: ResolvedSkill | undefined): string | undefined {\n return skill?.availableSources?.find((s) => s.primary)?.name;\n}\n\nfunction marketplaceSourceName(skill: ResolvedSkill | undefined): string | undefined {\n return skill?.availableSources?.find((source) => source.type !== \"local\")?.name;\n}\n\n/** A marketplace origin on a skill no marketplace carries names an install that cannot happen. */\nfunction defaultOriginFor(skill: ResolvedSkill | undefined): string {\n if (isLocalOnlySkill(skill)) return EJECT_SOURCE;\n\n return primarySourceName(skill) ?? DEFAULT_PUBLIC_SOURCE_NAME;\n}\n\nfunction createDefaultSkillConfig(id: SkillId): SkillConfig {\n return { id, scope: \"global\", origin: defaultOriginFor(matrix.skills[id]) };\n}\n\nfunction hasProjectActive(configs: SkillConfig[], id: SkillId): boolean {\n return configs.some((sc) => sc.id === id && isActiveAt(sc, \"project\"));\n}\n\nfunction findGlobalActive(configs: SkillConfig[], id: SkillId): SkillConfig | undefined {\n return configs.find((sc) => sc.id === id && isActiveAt(sc, \"global\"));\n}\n\nfunction hasGlobalActive(configs: SkillConfig[], id: SkillId): boolean {\n return findGlobalActive(configs, id) !== undefined;\n}\n\nfunction hasGlobalTombstone(configs: SkillConfig[], id: SkillId): boolean {\n return configs.some((sc) => sc.id === id && isGlobalTombstone(sc));\n}\n\n/** Active project entry plus global tombstone: the `[P][G]` row. */\nfunction isDualScopePair(configs: SkillConfig[], id: SkillId): boolean {\n return hasProjectActive(configs, id) && hasGlobalTombstone(configs, id);\n}\n\n/**\n * True when a SELECTED skill must not be deselected at project scope. Locks only global-owned\n * halves: an active global entry in the snapshot, or a snapshot tombstone paired with a live\n * active global entry (a persisted `[P][G]` collapsed this session). A persisted pair's project\n * half and a skill added this session stay deselectable.\n */\nfunction isGloballyLockedSkill(\n installed: SkillConfig[],\n liveConfigs: SkillConfig[],\n id: SkillId,\n): boolean {\n return (\n hasGlobalActive(installed, id) ||\n (hasGlobalTombstone(installed, id) && hasGlobalActive(liveConfigs, id))\n );\n}\n\n/**\n * The deselect lock, plus a live `[P][G]` pair: dropping its project half implicitly would leave\n * the masked global install active beside the new pick in a one-per-category slot.\n */\nfunction blocksExclusiveSwap(\n installed: SkillConfig[],\n liveConfigs: SkillConfig[],\n id: SkillId,\n): boolean {\n return isGloballyLockedSkill(installed, liveConfigs, id) || isDualScopePair(liveConfigs, id);\n}\n\nfunction wouldOverwriteGlobalEject(\n config: SkillConfig,\n liveConfigs: SkillConfig[],\n installedSkillConfigs: SkillConfig[] | null,\n): boolean {\n if (config.scope !== \"project\" || config.origin !== EJECT_SOURCE) return false;\n const globalEjectInstalled = installedSkillConfigs?.some(\n (sc) =>\n sc.id === config.id && sc.scope === \"global\" && sc.origin === EJECT_SOURCE && !sc.excluded,\n );\n if (!globalEjectInstalled) return false;\n return !liveConfigs.some((sc) => sc.id === config.id && sc.excluded);\n}\n\n/**\n * True when the `(id, scope)` slot is a global install this session inherited: an active global\n * entry in the snapshot, or the global install a snapshot tombstone masked. Keyed on the slot\n * because a `[P][G]` pair's project half stays editable; read off the snapshot because a skill\n * added this session (or any skill in a first `init`) is nobody's install yet.\n */\nfunction isInheritedGlobalSlot(\n installed: SkillConfig[] | null,\n id: SkillId,\n scope: SkillScope | undefined,\n): boolean {\n if (installed === null) return false;\n return (\n scope === \"global\" && (hasGlobalActive(installed, id) || hasGlobalTombstone(installed, id))\n );\n}\n\n/** Leaves a dual-scope skill's global tombstone untouched. */\nfunction withActiveEntryOrigin(\n configs: SkillConfig[],\n id: SkillId,\n scope: SkillScope | undefined,\n origin: string,\n): SkillConfig[] {\n return configs.map((sc) =>\n sc.id === id && !sc.excluded && sc.scope === scope ? { ...sc, origin } : sc,\n );\n}\n\n/**\n * Drops entries the project owns. An active global entry the snapshot already carried is\n * inherited and survives byte-identical; a skill added this session is dropped. A null\n * `installedSkillConfigs` (editing from global scope) makes every removal an uninstall.\n * Dual-scope pairs collapse to a single inherited-global entry so the `[G]` badge survives.\n */\nfunction applySkillRemoval(\n configs: SkillConfig[],\n removedIds: Iterable<SkillId>,\n installedSkillConfigs: SkillConfig[] | null,\n): SkillConfig[] {\n // Annotated: `instanceof Set` narrows to `Set<any>`, which would spread as `any[]`.\n const removed: ReadonlySet<SkillId> =\n removedIds instanceof Set ? removedIds : new Set(removedIds);\n const installedIds = new Set((installedSkillConfigs ?? []).map((s) => s.id));\n\n const survivesRemoval = (entry: SkillConfig): boolean =>\n !isDualScopePair(configs, entry.id) && !isProjectOwned(entry) && installedIds.has(entry.id);\n\n const retained = configs.filter((sc) => !removed.has(sc.id) || survivesRemoval(sc));\n const resurfacedInheritedGlobals = [...removed]\n .filter((id) => isDualScopePair(configs, id))\n .map((id) => ({\n id,\n scope: \"global\" as const,\n origin:\n configs.find((sc) => sc.id === id && sc.scope === \"global\")?.origin ??\n DEFAULT_PUBLIC_SOURCE_NAME,\n }));\n\n return [...retained, ...resurfacedInheritedGlobals];\n}\n\nfunction flattenCategorySelections(selections: CategorySelections): SkillId[] {\n return typedValues(selections).flat();\n}\n\nfunction collectSkillIdsFromSelections(selections: CategorySelections): Set<SkillId> {\n return new Set(flattenCategorySelections(selections));\n}\n\nfunction reconcileSkillConfigs(\n configs: SkillConfig[],\n added: SkillId[],\n removed: SkillId[],\n installedSkillConfigs: SkillConfig[] | null,\n isEditingFromGlobalScope: boolean,\n): SkillConfig[] {\n // Null so applySkillRemoval drops rather than retains: there is no project overlay.\n const effectiveInstalled = isEditingFromGlobalScope ? null : installedSkillConfigs;\n let result = applySkillRemoval(configs, removed, effectiveInstalled);\n\n for (const id of added) {\n // Re-selecting a globally installed skill re-creates both halves, like toggleSkillScope's G->P.\n if (\n !isEditingFromGlobalScope &&\n hasGlobalTombstone(installedSkillConfigs ?? [], id) &&\n !hasProjectActive(result, id)\n ) {\n const globalEntry =\n (installedSkillConfigs ?? []).find((sc) => sc.id === id && sc.scope === \"global\") ??\n result.find((sc) => sc.id === id && sc.scope === \"global\");\n const origin = globalEntry?.origin ?? DEFAULT_PUBLIC_SOURCE_NAME;\n result = [\n ...result.filter((sc) => sc.id !== id),\n { id, scope: \"project\", origin },\n { id, scope: \"global\", excluded: true, origin },\n ];\n continue;\n }\n\n const existingExcluded = result.find((sc) => sc.id === id && sc.excluded);\n if (existingExcluded) {\n // Drop the flag rather than set it to `undefined`: absent means not excluded.\n result = result.map((sc) => {\n if (sc.id !== id || !sc.excluded) return sc;\n const { excluded: _excluded, ...active } = sc;\n return active;\n });\n } else if (!result.some((sc) => sc.id === id)) {\n // A restore, not a fresh add: keep the persisted scope and origin, or the round trip would\n // trigger a bogus scope/source migration.\n result = [...result, buildSkillConfigForId(id, installedSkillConfigs)];\n }\n }\n\n return result;\n}\n\nfunction agentHasProjectActive(configs: AgentScopeConfig[], name: AgentName): boolean {\n return configs.some((ac) => ac.name === name && isActiveAt(ac, \"project\"));\n}\n\nfunction agentHasGlobalActive(configs: AgentScopeConfig[], name: AgentName): boolean {\n return configs.some((ac) => ac.name === name && isActiveAt(ac, \"global\"));\n}\n\nfunction agentHasGlobalTombstone(configs: AgentScopeConfig[], name: AgentName): boolean {\n return configs.some((ac) => ac.name === name && isGlobalTombstone(ac));\n}\n\nfunction isDualScopeAgentPair(configs: AgentScopeConfig[], name: AgentName): boolean {\n return agentHasProjectActive(configs, name) && agentHasGlobalTombstone(configs, name);\n}\n\n/** Preserved across merges so a dual-scope pair can be restored later. */\nfunction collectTombstones<T extends { excluded?: boolean }>(configs: T[]): T[] {\n return configs.filter((entry) => entry.excluded);\n}\n\nfunction filledAgentSlots(configs: AgentScopeConfig[]): ReadonlySet<string> {\n return new Set(configs.map((ac) => agentSlotKey(ac.name, ac.scope)));\n}\n\n/**\n * A tombstone only masks while its active entry sits at the OTHER scope. One at a slot the rebuild\n * just filled masks nothing, and the merge would write both.\n */\nfunction agentTombstonesOutsideRebuild(\n saved: AgentScopeConfig[],\n rebuilt: AgentScopeConfig[],\n): AgentScopeConfig[] {\n const filled = filledAgentSlots(rebuilt);\n return collectTombstones(saved).filter((ac) => !filled.has(agentSlotKey(ac.name, ac.scope)));\n}\n\nfunction skillTombstonesOutsideRebuild(\n saved: SkillConfig[],\n rebuilt: SkillConfig[],\n): SkillConfig[] {\n const filled = new Set(rebuilt.map((sc) => skillSlotKey(sc.id, sc.scope)));\n return collectTombstones(saved).filter((sc) => !filled.has(skillSlotKey(sc.id, sc.scope)));\n}\n\n/**\n * A deselect is always one the project owns (inherited installs are refused in `toggleAgent`),\n * so it removes cleanly. A new agent is `scope: \"global\"` deliberately, and gets an empty stack\n * beside project-scoped skills (`isScopePairCompatible`) — ruled 2026-08-19; not a defect.\n */\nfunction applyAgentToggle(\n configs: AgentScopeConfig[],\n agent: AgentName,\n isSelected: boolean,\n): AgentScopeConfig[] {\n if (isSelected) {\n return configs.filter((ac) => ac.name !== agent);\n }\n\n const existingExcluded = configs.find((ac) => ac.name === agent && ac.excluded);\n if (existingExcluded) {\n return configs.map((ac) => {\n if (ac.name !== agent || !ac.excluded) return ac;\n const { excluded: _excluded, ...active } = ac;\n return active;\n });\n }\n return [...configs, { name: agent, scope: \"global\" as const }];\n}\n\n/**\n * Entries a roster rebuild keeps: tombstones whose slot stays free (so dual-scope pairs survive,\n * regardless of roster membership), and entries the project does not own (so an inherited global\n * agent outside the roster is never uninstalled). The roster's own entries are rebuilt.\n */\nfunction survivesRosterRebuild(\n agentConfig: AgentScopeConfig,\n roster: ReadonlySet<AgentName>,\n rebuiltSlots: ReadonlySet<string>,\n): boolean {\n if (agentConfig.excluded) {\n return !rebuiltSlots.has(agentSlotKey(agentConfig.name, agentConfig.scope));\n }\n return !isProjectOwned(agentConfig) && !roster.has(agentConfig.name);\n}\n\n/** The user's choices about a sub-agent, carried whole across every rebuild. */\nfunction tuningOf(agentConfig: AgentScopeConfig | undefined): Partial<AgentScopeConfig> {\n return {\n ...(agentConfig?.model !== undefined && { model: agentConfig.model }),\n ...(agentConfig?.codexModel !== undefined && { codexModel: agentConfig.codexModel }),\n ...(agentConfig?.effort !== undefined && { effort: agentConfig.effort }),\n };\n}\n\nfunction tunedEntryFor(\n agentConfigs: AgentScopeConfig[] | undefined,\n agent: AgentName,\n): AgentScopeConfig | undefined {\n return (\n agentConfigs?.find((ac) => ac.name === agent && !ac.excluded && ac.scope === \"project\") ??\n agentConfigs?.find((ac) => ac.name === agent && !ac.excluded)\n );\n}\n\n/**\n * Re-selecting an inherited-global agent whose install the snapshot records as a tombstone\n * rebuilds the `[P][G]` pair, carrying the row's tuning so the model and effort survive.\n */\nfunction restoreDualScopeAgent(\n selectedAgents: AgentName[],\n agentConfigs: AgentScopeConfig[],\n agent: AgentName,\n) {\n const tuning = tuningOf(tunedEntryFor(agentConfigs, agent));\n return {\n selectedAgents: [...selectedAgents, agent],\n agentConfigs: [\n ...agentConfigs.filter((ac) => ac.name !== agent),\n { name: agent, scope: \"project\" as const, ...tuning },\n { name: agent, scope: \"global\" as const, ...tuning, excluded: true },\n ],\n };\n}\n\nfunction nextSelectedAgents(\n selectedAgents: AgentName[],\n agent: AgentName,\n flags: { isSelected: boolean; isInList: boolean },\n): AgentName[] {\n if (flags.isSelected) return selectedAgents.filter((a) => a !== agent);\n if (flags.isInList) return selectedAgents;\n return [...selectedAgents, agent];\n}\n\nfunction buildSkillConfigForId(id: SkillId, savedConfigs?: SkillConfig[] | null): SkillConfig {\n const saved =\n savedConfigs?.find((sc) => sc.id === id && !sc.excluded && sc.scope === \"project\") ??\n savedConfigs?.find((sc) => sc.id === id && !sc.excluded);\n return {\n id,\n scope: saved?.scope ?? \"global\",\n origin: saved?.origin ?? defaultOriginFor(matrix.skills[id]),\n };\n}\n\nfunction buildAgentConfigForName(\n name: AgentName,\n savedConfigs?: AgentScopeConfig[],\n): AgentScopeConfig {\n const saved = tunedEntryFor(savedConfigs, name);\n return {\n name,\n scope: saved?.scope ?? \"global\",\n ...tuningOf(saved),\n };\n}\n\nfunction restoreSkillConfigs(\n existingConfigs: SkillConfig[],\n restoredIds: SkillId[],\n): SkillConfig[] {\n const restoredSet = new Set(restoredIds);\n const existingIds = new Set(existingConfigs.map((sc) => sc.id));\n\n const updated = existingConfigs.map((sc) => {\n if (!restoredSet.has(sc.id) || !sc.excluded) return sc;\n const { excluded: _excluded, ...active } = sc;\n return active;\n });\n\n const newConfigs = restoredIds.filter((id) => !existingIds.has(id)).map(createDefaultSkillConfig);\n\n return [...updated, ...newConfigs];\n}\n\n/**\n * Built-in agents per domain; custom domains preselect none. `pm` and `reviewer` serve every\n * domain. Exported as an identity roster: `lib/wizard/agent-roster.test.ts` reconciles it with\n * `BUILT_IN_AGENT_GROUPS` and `AGENT_NAMES`.\n */\nexport const DOMAIN_AGENTS: Partial<Record<Domain, AgentName[]>> = {\n web: [\"web-developer\", \"web-researcher\", \"web-tester\", \"pm\", \"reviewer\"],\n api: [\"api-developer\", \"api-researcher\", \"api-tester\", \"pm\", \"reviewer\"],\n cli: [\"cli-developer\", \"cli-tester\", \"cli-researcher\", \"pm\", \"reviewer\"],\n ai: [\"ai-developer\", \"ai-researcher\", \"ai-tester\", \"pm\", \"reviewer\"],\n};\n\nfunction absentFromSourceWarning(skillId: SkillId): string {\n return (\n `Installed skill '${skillId}' is not present in the loaded source — it may have been ` +\n `removed or renamed. It is left out of this session's selection. Run ` +\n `'${CLI_INVOKE_COMMAND} update' to refresh the marketplace if you expect it to still be ` +\n `carried there.`\n );\n}\n\nfunction unplaceableCategoryWarning(skillId: SkillId, category: string): string {\n return (\n `Installed skill '${skillId}' has unknown category '${category}' — skipping. No domain in ` +\n `this source claims that category, so the wizard has no screen to place the skill on. ` +\n `Declare it with a 'domain' in the source's '${SKILL_CATEGORIES_PATH}', or run ` +\n `'${CLI_INVOKE_COMMAND} update' to refresh the marketplace.`\n );\n}\n\nfunction resolveSkillForPopulation(\n skillId: SkillId,\n): { domain: Domain; subcat: Category; techId: SkillId } | null {\n const { skills } = matrix;\n const skill = skills[skillId];\n if (!skill?.category) {\n warn(absentFromSourceWarning(skillId));\n return null;\n }\n\n const domain = getCategoryDomain(skill.category);\n if (!domain) {\n warn(unplaceableCategoryWarning(skillId, skill.category));\n return null;\n }\n\n // Boundary cast: domain lookup confirmed category exists in matrix\n const subcat = skill.category as Category;\n return { domain, subcat, techId: skillId };\n}\n\nfunction addToDomainSelections(\n selections: DomainSelections,\n domain: Domain,\n category: Category,\n skillId: SkillId,\n): boolean {\n const categorySelections = (selections[domain] ??= {});\n const skillList = (categorySelections[category] ??= []);\n if (skillList.includes(skillId)) return false;\n skillList.push(skillId);\n return true;\n}\n\nfunction sourceForInstallMode(skill: ResolvedSkill, mode: Exclude<InstallMode, \"mixed\">): string {\n if (mode === \"eject\") return EJECT_SOURCE;\n\n return marketplaceSourceName(skill) ?? DEFAULT_PUBLIC_SOURCE_NAME;\n}\n\nfunction installModeOfSource(origin: string | undefined): Exclude<InstallMode, \"mixed\"> {\n return origin === EJECT_SOURCE ? \"eject\" : \"plugin\";\n}\n\n/** A local-only skill gets the eject cell alone: no marketplace could serve a plugin install. */\nfunction buildInstallModeOptions(\n skill: ResolvedSkill | undefined,\n selectedMode: Exclude<InstallMode, \"mixed\">,\n): SourceOption[] {\n const modes = isLocalOnlySkill(skill) ? LOCAL_ONLY_INSTALL_MODES : INSTALL_MODES;\n return modes.map((mode) => ({ mode, selected: mode === selectedMode }));\n}\n\n/**\n * Snapshot slots this session emptied: active in the snapshot, unoccupied now. Removal leaves no\n * live entry to render from, so without these the row would vanish before save. Keyed per\n * `(id, scope)` slot and ungated on edit context, like `computeScopeDiff`. Snapshot tombstones\n * are excluded: dropping a mask deletes nothing.\n */\nfunction collectRemovedInstalledEntries(\n installedSkillConfigs: SkillConfig[] | null,\n skillConfigs: SkillConfig[],\n): SkillConfig[] {\n if (!installedSkillConfigs) return [];\n const occupiedSlots = new Set(skillConfigs.map((sc) => skillSlotKey(sc.id, sc.scope)));\n return installedSkillConfigs.filter(\n (sc) =>\n !sc.excluded &&\n !occupiedSlots.has(skillSlotKey(sc.id, sc.scope)) &&\n // Hydration already moved it to unresolvableSkillIds, and getSkillById would throw on it.\n !!matrix.skills[sc.id],\n );\n}\n\n/** The baseline `computeScopeDiff`'s `prevSkillKeySet` uses; tombstones occupy their slot. */\nfunction collectInstalledSkillSlots(\n installedSkillConfigs: SkillConfig[] | null,\n): ReadonlySet<string> {\n if (!installedSkillConfigs) return new Set();\n return new Set(installedSkillConfigs.map((sc) => skillSlotKey(sc.id, sc.scope)));\n}\n\n/**\n * Keyed on the slot rather than the id, so a skill adopted at project scope while installed\n * globally is flagged on its new project row — as `classifyDiffRow` does on the confirm step.\n */\nfunction addedSlotFlag(\n installedSkillSlots: ReadonlySet<string>,\n id: SkillId,\n scope: SkillScope | undefined,\n): { added?: true } {\n return installedSkillSlots.has(skillSlotKey(id, scope)) ? {} : { added: true };\n}\n\nfunction withSelectedMode(options: SourceOption[], source: string | undefined): SourceOption[] {\n const mode = installModeOfSource(source);\n return options.map((option) => ({ ...option, selected: option.mode === mode }));\n}\n\nfunction resolveSkillRowInputs(\n id: SkillId,\n skillConfigs: SkillConfig[],\n): { skillId: SkillId; configEntry: SkillConfig | undefined; options: SourceOption[] } {\n const skill = getSkillById(id);\n const configEntry = skillConfigs.find((sc) => sc.id === skill.id);\n const selectedSource = resolveEffectiveSource(\n configEntry?.origin,\n skill.activeSource?.name,\n primarySourceName(skill),\n );\n return {\n skillId: skill.id,\n configEntry,\n options: buildInstallModeOptions(skill, installModeOfSource(selectedSource)),\n };\n}\n\ntype SourceRowContext = {\n configEntry: SkillConfig | undefined;\n installedSkillConfigs: SkillConfig[] | null;\n isEditingFromGlobalScope: boolean;\n installedSkillSlots: ReadonlySet<string>;\n};\n\n/**\n * The row for a snapshot slot this session emptied, pinned to its persisted scope and source.\n * Not readOnly: a lock would read as \"installed globally\", not \"about to be removed\".\n */\nfunction toPendingRemovalRow(\n skillId: SkillId,\n options: SourceOption[],\n removedInstalledEntry: SkillConfig,\n): SourceRow {\n return {\n skillId,\n options: withSelectedMode(options, removedInstalledEntry.origin),\n scope: removedInstalledEntry.scope,\n disabled: true,\n };\n}\n\n/**\n * A global install adopted at project scope without a tombstone: its global slot is empty in the\n * live config, but the locked global row already renders it, so a removal row would duplicate it.\n */\nfunction isSlotAlreadyRendered(rows: SourceRow[], removedInstalledEntry: SkillConfig): boolean {\n const slot = skillSlotKey(removedInstalledEntry.id, removedInstalledEntry.scope);\n return rows.some((row) => skillSlotKey(row.skillId, row.scope) === slot);\n}\n\n/** Its added flag reads the GLOBAL slot, so an inherited install stays a plain lock. */\nfunction toLockedGlobalRow(\n skillId: SkillId,\n options: SourceOption[],\n installedSource: string | undefined,\n installedSkillSlots: ReadonlySet<string>,\n): SourceRow {\n return {\n skillId,\n options: withSelectedMode(options, installedSource),\n scope: \"global\" as const,\n readOnly: true,\n ...addedSlotFlag(installedSkillSlots, skillId, \"global\"),\n };\n}\n\nfunction classifySkillSourceRows(\n skillId: SkillId,\n options: SourceOption[],\n context: SourceRowContext,\n): SourceRow[] {\n const { configEntry, installedSkillConfigs, isEditingFromGlobalScope, installedSkillSlots } =\n context;\n const installedGlobalConfig = findGlobalActive(installedSkillConfigs ?? [], skillId);\n\n const isExcludedGlobal = configEntry?.excluded && configEntry.scope === \"global\";\n if (isExcludedGlobal && !isEditingFromGlobalScope) {\n return [\n toLockedGlobalRow(\n skillId,\n options,\n installedGlobalConfig?.origin ?? configEntry.origin,\n installedSkillSlots,\n ),\n ];\n }\n\n if (!isEditingFromGlobalScope && installedGlobalConfig && configEntry?.scope === \"project\") {\n // Each half reads its own slot, so `+` lands on the new project row only.\n return [\n toLockedGlobalRow(skillId, options, installedGlobalConfig.origin, installedSkillSlots),\n {\n skillId,\n options,\n scope: \"project\" as const,\n ...addedSlotFlag(installedSkillSlots, skillId, \"project\"),\n },\n ];\n }\n\n const readOnly =\n !isEditingFromGlobalScope &&\n (!!installedGlobalConfig ||\n isInheritedGlobalSlot(installedSkillConfigs, skillId, configEntry?.scope));\n return [\n {\n skillId,\n options,\n ...(configEntry?.scope !== undefined && { scope: configEntry.scope }),\n ...(readOnly ? { readOnly: true as const } : {}),\n ...addedSlotFlag(installedSkillSlots, skillId, configEntry?.scope),\n },\n ];\n}\n\n/** Global readOnly, global editable, then project; pending-removal rows sort by their scope. */\nfunction sourceRowSortTier(row: SourceRow): number {\n if (row.scope === \"global\" && row.readOnly) return 0;\n if (row.scope === \"global\") return 1;\n return 2;\n}\n\nexport type WizardStep = \"stack\" | \"domains\" | \"build\" | \"sources\" | \"agents\" | \"confirm\";\n\ntype WizardApproach = \"stack\" | \"scratch\";\n\ntype StackAction = \"defaults\" | \"customize\";\n\nexport const WIZARD_STEP_ORDER = [\n \"stack\",\n \"domains\",\n \"build\",\n \"sources\",\n \"agents\",\n \"confirm\",\n] as const satisfies readonly WizardStep[];\n\nfunction offersStacks(): boolean {\n return matrix.suggestedStacks.length > 0;\n}\n\n/** Drops the stack step when the loaded source offers no stack, so the tabs match the flow. */\nexport function getActiveStepFlow(): WizardStep[] {\n if (offersStacks()) return [...WIZARD_STEP_ORDER];\n return WIZARD_STEP_ORDER.filter((step) => step !== \"stack\");\n}\n\nfunction stepsBefore(flow: WizardStep[], step: WizardStep): WizardStep[] {\n const index = flow.indexOf(step);\n return index < 0 ? [] : flow.slice(0, index);\n}\n\nexport type WizardState = {\n step: WizardStep;\n\n approach: WizardApproach | null;\n selectedStackId: string | null;\n stackAction: StackAction | null;\n\n selectedDomains: Domain[];\n\n currentDomainIndex: number;\n domainSelections: DomainSelections;\n _stackDomainSelections: DomainSelections | null;\n\n showLabels: boolean;\n\n skillConfigs: SkillConfig[];\n focusedSkillId: SkillId | null;\n\n /**\n * Saved skill ids the loaded source could not resolve. The wizard cannot represent them, so the\n * merge removes them; this list is what lets `edit` name each one.\n */\n unresolvableSkillIds: SkillId[];\n\n /**\n * `[P][G]` pairs `s` folded into the global install this session. A fold and a selection-key\n * drop leave the same config entry but mean different things: a drop removes the project's copy,\n * a fold moves it into the install every project reads.\n */\n foldedSkillIds: SkillId[];\n\n /**\n * The marketplace `init --marketplace` named, when the global install above the project came from\n * another; null otherwise.\n */\n setupMarketplace: string | null;\n\n showInfo: boolean;\n\n selectedAgents: AgentName[];\n agentConfigs: AgentScopeConfig[];\n focusedAgentId: AgentName | null;\n\n installedSkillConfigs: SkillConfig[] | null;\n installedAgentConfigs: AgentScopeConfig[] | null;\n\n isInitMode: boolean;\n\n /** Editing from ~/.claude/ with no project to move items to, so scope toggling is disabled. */\n isEditingFromGlobalScope: boolean;\n\n toastMessage: string | null;\n\n globalPreselections: SkillConfig[] | null;\n\n /** Restored after selectStack wipes selectedAgents/agentConfigs. */\n globalAgentPreselections: { agents: AgentName[]; configs: AgentScopeConfig[] } | null;\n\n history: WizardStep[];\n\n setStep: (step: WizardStep) => void;\n setApproach: (approach: WizardApproach | null) => void;\n selectStack: (stackId: string | null) => void;\n setStackAction: (action: StackAction) => void;\n /**\n * \"Start from scratch\": reached from the stack step's scratch row and from hydration when the\n * source offers no stacks. Does not navigate — the caller owns the step.\n */\n startFromScratch: () => void;\n /** Restores selections from installed skill ids; warns for and skips ids it cannot place. */\n populateFromSkillIds: (skillIds: SkillId[], savedConfigs?: SkillConfig[]) => void;\n toggleDomain: (domain: Domain) => void;\n toggleTechnology: (\n domain: Domain,\n category: Category,\n technology: SkillId,\n exclusive: boolean,\n ) => void;\n nextDomain: () => boolean;\n prevDomain: () => boolean;\n setCurrentDomainIndex: (index: number) => void;\n toggleShowLabels: () => void;\n /** \"eject\" when no skills are configured. */\n deriveInstallMode: () => InstallMode;\n toggleSkillScope: (skillId: SkillId) => void;\n setFocusedSkillId: (id: SkillId | null) => void;\n /**\n * Seeds `focusedSkillId` to the grid's first cell for the active domain, synchronously, so the\n * `s` hotkey never depends on CategoryGrid's post-mount effect.\n */\n seedFocusedSkillForActiveDomain: () => void;\n /**\n * Updates only the active entry at `scope`; a masked global tombstone keeps its origin. Silently\n * refuses an inherited global slot ({@link isInheritedGlobalSlot}) from project context.\n */\n setInstallMode: (\n skillId: SkillId,\n mode: Exclude<InstallMode, \"mixed\">,\n scope: SkillScope | undefined,\n ) => void;\n toggleInfo: () => void;\n setToastMessage: (message: string | null) => void;\n /** No-op when history is empty (the edit flow can open mid-wizard). */\n goBack: () => void;\n toggleAgent: (agent: AgentName) => void;\n toggleAgentScope: (agentName: AgentName) => void;\n setFocusedAgentId: (id: AgentName | null) => void;\n /**\n * Seeds `focusedAgentId` on entry unless one is recorded. Synchronous because the `s` toggle in\n * `wizard.tsx` reads it at once, and a post-mount seed can lose to a buffered keystroke.\n */\n seedFocusedAgent: () => void;\n /** From-scratch only: a chosen stack's roster stands. */\n preselectAgentsFromDomains: () => void;\n /** Merges the stack's agents with global preselections, preserving dual-scope tombstones. */\n preselectAgentsFromStack: (stackAgents: AgentName[]) => void;\n reset: () => void;\n\n /** May contain duplicates when a skill is shared across domains. */\n getAllSelectedTechnologies: () => SkillId[];\n getSelectedTechnologiesPerDomain: () => Partial<Record<Domain, SkillId[]>>;\n getCurrentDomain: () => Domain | null;\n getTechnologyCount: () => number;\n /** Read against {@link getActiveStepFlow}: a step this run never has cannot be completed. */\n getStepProgress: () => { completedSteps: WizardStep[]; skippedSteps: WizardStep[] };\n canGoToNextDomain: () => boolean;\n canGoToPreviousDomain: () => boolean;\n\n buildSourceRows: () => SourceRow[];\n};\n\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 | \"unresolvableSkillIds\"\n | \"foldedSkillIds\"\n | \"setupMarketplace\"\n | \"showInfo\"\n | \"selectedAgents\"\n | \"agentConfigs\"\n | \"focusedAgentId\"\n | \"installedSkillConfigs\"\n | \"installedAgentConfigs\"\n | \"isInitMode\"\n | \"isEditingFromGlobalScope\"\n | \"toastMessage\"\n | \"globalPreselections\"\n | \"globalAgentPreselections\"\n | \"history\"\n>;\n\nexport const createInitialState = (overrides?: Partial<WizardStateData>): WizardStateData => ({\n step: \"stack\",\n approach: null,\n selectedStackId: null,\n stackAction: null,\n selectedDomains: [],\n currentDomainIndex: 0,\n domainSelections: {},\n _stackDomainSelections: null,\n showLabels: false,\n skillConfigs: [],\n focusedSkillId: null,\n unresolvableSkillIds: [],\n foldedSkillIds: [],\n setupMarketplace: null,\n showInfo: false,\n selectedAgents: [],\n agentConfigs: [],\n focusedAgentId: null,\n installedSkillConfigs: null,\n installedAgentConfigs: null,\n isInitMode: false,\n isEditingFromGlobalScope: false,\n toastMessage: null,\n globalPreselections: null,\n globalAgentPreselections: null,\n history: [],\n ...overrides,\n});\n\n/**\n * Seeds each step's focus synchronously on entry: both scope toggles read the focused id the\n * moment a key arrives, and a post-mount seed can lose to a buffered keystroke.\n */\nfunction seedFocusForStep(\n step: WizardStep,\n actions: Pick<WizardState, \"seedFocusedSkillForActiveDomain\" | \"seedFocusedAgent\">,\n): void {\n if (step === \"build\") actions.seedFocusedSkillForActiveDomain();\n if (step === \"agents\") actions.seedFocusedAgent();\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 seedFocusForStep(step, get());\n },\n\n setApproach: (approach) => set({ approach }),\n\n selectStack: (stackId) =>\n set({\n selectedStackId: stackId,\n domainSelections: {},\n _stackDomainSelections: null,\n selectedDomains: [],\n skillConfigs: [],\n selectedAgents: [],\n agentConfigs: [],\n currentDomainIndex: 0,\n stackAction: null,\n }),\n\n setStackAction: (action) => set({ stackAction: action }),\n\n startFromScratch: () => {\n // selectStack(null) wipes the agent selections too, so the global ones are put back.\n get().selectStack(null);\n get().setApproach(\"scratch\");\n\n const { globalAgentPreselections, globalPreselections } = get();\n if (globalAgentPreselections) {\n set({\n selectedAgents: globalAgentPreselections.agents,\n agentConfigs: globalAgentPreselections.configs,\n });\n }\n if (globalPreselections?.length) {\n get().populateFromSkillIds(\n globalPreselections.map((skill) => skill.id),\n globalPreselections,\n );\n }\n\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n if (!get().selectedDomains.includes(domain)) get().toggleDomain(domain);\n }\n },\n\n populateFromSkillIds: (skillIds, savedConfigs) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n const resolvedSkillIds: SkillId[] = [];\n const unresolvableSkillIds: SkillId[] = [];\n\n for (const skillId of skillIds) {\n const resolved = resolveSkillForPopulation(skillId);\n if (!resolved) {\n unresolvableSkillIds.push(skillId);\n continue;\n }\n\n const { domain, subcat, techId } = resolved;\n if (addToDomainSelections(domainSelections, domain, subcat, techId)) {\n resolvedSkillIds.push(techId);\n }\n }\n\n const selectedDomains = orderDomains(typedKeys<Domain>(domainSelections));\n\n const skillConfigs: SkillConfig[] = resolvedSkillIds.map((id) =>\n buildSkillConfigForId(id, savedConfigs),\n );\n\n // A tombstone may coexist with an active entry for the same id only at a different scope.\n const excludedConfigs = skillTombstonesOutsideRebuild(savedConfigs ?? [], skillConfigs);\n\n return {\n domainSelections,\n _stackDomainSelections: structuredClone(domainSelections),\n selectedDomains,\n skillConfigs: [...skillConfigs, ...excludedConfigs],\n unresolvableSkillIds,\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 const removedSkillIds = _removed\n ? collectSkillIdsFromSelections(_removed)\n : new Set<SkillId>();\n\n return {\n selectedDomains: state.selectedDomains.filter((d) => d !== domain),\n domainSelections: remainingSelections,\n // Global-scope edit: deselecting a domain uninstalls its skills instead of tombstoning.\n skillConfigs: applySkillRemoval(\n state.skillConfigs,\n removedSkillIds,\n state.isEditingFromGlobalScope ? null : state.installedSkillConfigs,\n ),\n };\n }\n\n const stackSelections = state._stackDomainSelections?.[domain];\n if (stackSelections) {\n const restoredSkillIds = [...collectSkillIdsFromSelections(stackSelections)];\n\n return {\n selectedDomains: orderDomains([...state.selectedDomains, domain]),\n domainSelections: {\n ...state.domainSelections,\n [domain]: structuredClone(stackSelections),\n },\n skillConfigs: restoreSkillConfigs(state.skillConfigs, restoredSkillIds),\n };\n }\n\n return {\n selectedDomains: orderDomains([...state.selectedDomains, domain]),\n };\n }),\n\n toggleTechnology: (domain, category, technology, exclusive) =>\n set((state) => {\n const installed = state.installedSkillConfigs ?? [];\n const currentSelections = state.domainSelections[domain]?.[category] || [];\n const isSelected = currentSelections.includes(technology);\n\n // On a SELECT only the active-global arm applies; the stale-collapse arm guards deselects, so\n // re-selecting still rebuilds `[P][G]`. A persisted pair's project half passes both ways.\n const isGlobalLocked = isSelected\n ? isGloballyLockedSkill(installed, state.skillConfigs, technology)\n : hasGlobalActive(installed, technology);\n if (isGlobalLocked && !state.isEditingFromGlobalScope) {\n return { toastMessage: TOAST_MESSAGES.GLOBAL_SKILLS_LOCKED };\n }\n\n // A radio swap must never tombstone or unmask a global install.\n if (exclusive && !isSelected) {\n const wouldDropLockedSkill = currentSelections.some((selectedId) =>\n blocksExclusiveSwap(installed, state.skillConfigs, selectedId),\n );\n if (wouldDropLockedSkill && !state.isEditingFromGlobalScope) {\n return { toastMessage: TOAST_MESSAGES.GLOBAL_SKILLS_LOCKED };\n }\n }\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 const removed = currentSelections.filter((id) => !newSelections.includes(id));\n const added = newSelections.filter((id) => !currentSelections.includes(id));\n\n const skillConfigs = reconcileSkillConfigs(\n state.skillConfigs,\n added,\n removed,\n state.installedSkillConfigs,\n state.isEditingFromGlobalScope,\n );\n\n // A dual-scope deselect leaves an active inherited-global entry, so the skill stays selected,\n // as a save-and-reopen would re-derive.\n const stillActiveAfterRemoval =\n isSelected &&\n !newSelections.includes(technology) &&\n (hasProjectActive(skillConfigs, technology) || hasGlobalActive(skillConfigs, technology));\n const resolvedSelections = stillActiveAfterRemoval\n ? [...newSelections, technology]\n : newSelections;\n\n return {\n skillConfigs,\n domainSelections: {\n ...state.domainSelections,\n [domain]: {\n ...state.domainSelections[domain],\n [category]: resolvedSelections,\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 get().seedFocusedSkillForActiveDomain();\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 get().seedFocusedSkillForActiveDomain();\n return true;\n }\n return false;\n },\n\n setCurrentDomainIndex: (index) => {\n const state = get();\n if (index >= 0 && index < state.selectedDomains.length) {\n set({ currentDomainIndex: index });\n get().seedFocusedSkillForActiveDomain();\n }\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 // Unreachable: `toggleFocusedScope` in wizard.tsx refuses first. The reachable refusal is\n // asserted in e2e/interactive/edit-wizard-navigation.e2e.test.ts.\n if (state.isEditingFromGlobalScope) return state;\n\n const config = state.skillConfigs.find((sc) => sc.id === skillId && !sc.excluded);\n if (!config) return state;\n\n if (wouldOverwriteGlobalEject(config, state.skillConfigs, state.installedSkillConfigs)) {\n return { toastMessage: TOAST_MESSAGES.ALREADY_EJECTED_AT_GLOBAL };\n }\n\n // A snapshot tombstone also means a real global install, so G→P re-creates the tombstone\n // and an in-session collapse→`s` restores a genuine `[P][G]` pair.\n const wasInstalledGlobally =\n state.installedSkillConfigs?.some((sc) => sc.id === skillId && sc.scope === \"global\") ??\n false;\n const newScope = config.scope === \"project\" ? (\"global\" as const) : (\"project\" as const);\n\n const rescoped = state.skillConfigs.map((sc) =>\n sc.id === skillId && !sc.excluded ? { ...sc, scope: newScope } : sc,\n );\n\n if (newScope === \"project\") {\n // Gated so a fresh init toggle mints no spurious tombstone.\n const needsTombstone =\n wasInstalledGlobally && !rescoped.some((sc) => sc.id === skillId && sc.excluded);\n return {\n skillConfigs: needsTombstone\n ? [\n ...rescoped,\n { id: skillId, scope: \"global\" as const, excluded: true, origin: config.origin },\n ]\n : rescoped,\n foldedSkillIds: state.foldedSkillIds.filter((id) => id !== skillId),\n };\n }\n\n // Project → global always drops the tombstone: an active entry and a tombstone may not share\n // an `(id, scope)`, and `wasInstalledGlobally` cannot see a tombstone a prior G→P made.\n // Collapsing a live pair this way is a fold, which the store records.\n return {\n skillConfigs: rescoped.filter((sc) => !(sc.id === skillId && sc.excluded)),\n foldedSkillIds: isDualScopePair(state.skillConfigs, skillId)\n ? [...state.foldedSkillIds, skillId]\n : state.foldedSkillIds,\n };\n }),\n\n setFocusedSkillId: (id) => set({ focusedSkillId: id }),\n\n seedFocusedSkillForActiveDomain: () => {\n const state = get();\n // The build step renders FALLBACK_DOMAIN when none is selected, so the seed must too.\n const domain = state.getCurrentDomain() ?? FALLBACK_DOMAIN;\n const categories = buildCategoriesForDomain(\n domain,\n state.getAllSelectedTechnologies(),\n undefined,\n state.skillConfigs,\n );\n set({ focusedSkillId: categories[0]?.options[0]?.id ?? null });\n },\n\n setInstallMode: (skillId, mode, scope) =>\n set((state) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- SkillId is a string union with no empty member, so the type rules this out; the guard is for a runtime caller handing over an empty id\n if (!skillId) {\n warn(\"Ignoring setInstallMode call with empty skillId\");\n return state;\n }\n // Silent: the Sources grid renders this row inert, so a refused call reached past it.\n if (\n isInheritedGlobalSlot(state.installedSkillConfigs, skillId, scope) &&\n !state.isEditingFromGlobalScope\n ) {\n return state;\n }\n const origin = sourceForInstallMode(getSkillById(skillId), mode);\n return {\n skillConfigs: withActiveEntryOrigin(state.skillConfigs, skillId, scope, origin),\n };\n }),\n\n toggleInfo: () => set((state) => ({ showInfo: !state.showInfo })),\n\n setToastMessage: (message) => set({ toastMessage: message }),\n\n goBack: () => {\n const previousStep = get().history.at(-1);\n if (previousStep === undefined) return;\n set((state) => ({ step: previousStep, history: state.history.slice(0, -1) }));\n seedFocusForStep(previousStep, get());\n },\n\n toggleAgent: (agent) =>\n set((state) => {\n const installed = state.installedAgentConfigs ?? [];\n\n // A live `[P][G]` agent row ignores the selection key; only `s` collapses and restores it.\n const isDualScopePairRow =\n !state.isEditingFromGlobalScope && isDualScopeAgentPair(state.agentConfigs, agent);\n if (isDualScopePairRow) {\n return { toastMessage: TOAST_MESSAGES.GLOBAL_AGENTS_LOCKED };\n }\n\n const isInheritedGlobalReselect =\n !state.isEditingFromGlobalScope &&\n agentHasGlobalActive(state.agentConfigs, agent) &&\n !agentHasProjectActive(state.agentConfigs, agent) &&\n !state.selectedAgents.includes(agent) &&\n agentHasGlobalTombstone(installed, agent);\n if (isInheritedGlobalReselect) {\n return restoreDualScopeAgent(state.selectedAgents, state.agentConfigs, agent);\n }\n\n // Mirrors the skill-path guard in toggleTechnology.\n const isActiveGlobal =\n agentHasGlobalActive(installed, agent) ||\n (agentHasGlobalTombstone(installed, agent) &&\n agentHasGlobalActive(state.agentConfigs, agent));\n if (isActiveGlobal && !state.isEditingFromGlobalScope) {\n return { toastMessage: TOAST_MESSAGES.GLOBAL_AGENTS_LOCKED };\n }\n\n const isInList = state.selectedAgents.includes(agent);\n const hasExcludedTombstone = state.agentConfigs.some(\n (ac) => ac.name === agent && ac.excluded,\n );\n // A tombstoned agent renders \"off\", so toggling it re-enables.\n const isSelected = isInList && !hasExcludedTombstone;\n\n return {\n selectedAgents: nextSelectedAgents(state.selectedAgents, agent, { isSelected, isInList }),\n agentConfigs: applyAgentToggle(state.agentConfigs, agent, isSelected),\n };\n }),\n\n toggleAgentScope: (agentName) =>\n set((state) => {\n // Unreachable for the same reason as toggleSkillScope's.\n if (state.isEditingFromGlobalScope) return state;\n\n const config = state.agentConfigs.find((ac) => ac.name === agentName && !ac.excluded);\n if (!config) return state;\n\n // A tombstone counts as a global install, as in toggleSkillScope.\n const wasInstalledGlobally =\n state.installedAgentConfigs?.some((ac) => ac.name === agentName && ac.scope === \"global\") ??\n false;\n const newScope = config.scope === \"project\" ? (\"global\" as const) : (\"project\" as const);\n\n const rescoped = state.agentConfigs.map((ac) =>\n ac.name === agentName && !ac.excluded ? { ...ac, scope: newScope } : ac,\n );\n\n if (newScope === \"project\") {\n // Gated so a fresh init toggle mints no spurious tombstone.\n const needsTombstone =\n wasInstalledGlobally && !rescoped.some((ac) => ac.name === agentName && ac.excluded);\n return {\n agentConfigs: needsTombstone\n ? [...rescoped, { name: agentName, scope: \"global\" as const, excluded: true }]\n : rescoped,\n };\n }\n\n // Symmetric with toggleSkillScope.\n return { agentConfigs: rescoped.filter((ac) => !(ac.name === agentName && ac.excluded)) };\n }),\n\n setFocusedAgentId: (id) => set({ focusedAgentId: id }),\n\n seedFocusedAgent: () => {\n if (get().focusedAgentId !== null) return;\n set({ focusedAgentId: firstFocusableAgent() });\n },\n\n preselectAgentsFromDomains: () =>\n set((state) => {\n // A stack's declared roster stands; deriving one here would overwrite it.\n if (state.selectedStackId) return state;\n\n // Deduped: several domains roster `pm` and `reviewer`.\n const sorted = [\n ...new Set(state.selectedDomains.flatMap((domain) => DOMAIN_AGENTS[domain] ?? [])),\n ].sort();\n const roster = new Set(sorted);\n const merged = sorted.map((name) => buildAgentConfigForName(name, state.agentConfigs));\n const rebuiltSlots = filledAgentSlots(merged);\n const retained = state.agentConfigs.filter((ac) =>\n survivesRosterRebuild(ac, roster, rebuiltSlots),\n );\n return {\n selectedAgents: sorted,\n agentConfigs: [...merged, ...retained],\n };\n }),\n\n preselectAgentsFromStack: (stackAgents) =>\n set((state) => {\n const savedConfigs = state.globalAgentPreselections?.configs ?? [];\n const globalAgents = state.globalAgentPreselections?.agents ?? [];\n const mergedAgents = [...new Set([...stackAgents, ...globalAgents])].sort();\n const merged = mergedAgents.map((name) => buildAgentConfigForName(name, savedConfigs));\n const excludedConfigs = agentTombstonesOutsideRebuild(savedConfigs, merged);\n return {\n selectedAgents: mergedAgents,\n agentConfigs: [...merged, ...excludedConfigs],\n };\n }),\n\n reset: () => set(createInitialState()),\n\n getAllSelectedTechnologies: () => {\n return typedValues(get().domainSelections).flatMap(flattenCategorySelections);\n },\n\n getSelectedTechnologiesPerDomain: () => {\n const entries = typedEntries(get().domainSelections)\n .map(([domain, domainSel]) => [domain, flattenCategorySelections(domainSel)] as const)\n .filter(([, techs]) => techs.length > 0);\n return typedFromEntries(entries);\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 isStackDefaults =\n state.approach === \"stack\" && !!state.selectedStackId && state.stackAction === \"defaults\";\n const skippedSteps: WizardStep[] = isStackDefaults ? [\"build\", \"sources\", \"agents\"] : [];\n const precedingSteps = stepsBefore(getActiveStepFlow(), state.step);\n const completedSteps = precedingSteps.filter((step) => !skippedSteps.includes(step));\n return { completedSteps, skippedSteps };\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 buildSourceRows: () => {\n const state = get();\n const selectedTechnologies = get().getAllSelectedTechnologies();\n const { skillConfigs } = state;\n\n const selectedSet = new Set(selectedTechnologies);\n const inheritedSkillIds = skillConfigs\n .filter((sc) => !sc.excluded && !selectedSet.has(sc.id))\n .map((sc) => sc.id);\n const allActiveIds = new Set([...inheritedSkillIds, ...selectedTechnologies]);\n const excludedGlobalIds = skillConfigs\n .filter((sc) => isGlobalTombstone(sc) && !allActiveIds.has(sc.id))\n .map((sc) => sc.id);\n const liveSkillIds = [...inheritedSkillIds, ...selectedTechnologies, ...excludedGlobalIds];\n const installedSkillSlots = collectInstalledSkillSlots(state.installedSkillConfigs);\n const resolveRowInputs = (id: SkillId) => resolveSkillRowInputs(id, skillConfigs);\n\n const liveRows: SourceRow[] = liveSkillIds.flatMap((id) => {\n const { skillId, configEntry, options } = resolveRowInputs(id);\n return classifySkillSourceRows(skillId, options, {\n configEntry,\n installedSkillConfigs: state.installedSkillConfigs,\n isEditingFromGlobalScope: state.isEditingFromGlobalScope,\n installedSkillSlots,\n });\n });\n\n // A collapsed pair keeps its global row and gains a project pending-removal row, so rows are\n // disjoint per `(id, scope)` slot, not per skill.\n const pendingRemovalRows: SourceRow[] = collectRemovedInstalledEntries(\n state.installedSkillConfigs,\n skillConfigs,\n )\n .filter((entry) => !isSlotAlreadyRendered(liveRows, entry))\n .map((entry) => {\n const { skillId, options } = resolveRowInputs(entry.id);\n return toPendingRemovalRow(skillId, options, entry);\n });\n\n // Sorted to match source-grid grouping, so navigation indices align with render order.\n const rows = [...liveRows, ...pendingRemovalRows];\n rows.sort((a, b) => sourceRowSortTier(a) - sourceRowSortTier(b));\n\n return rows;\n },\n}));\n\n/**\n * Runs a change triggered from a painted frame, showing its warnings as a toast: stderr under a\n * mounted wizard is pushed off screen by the next repaint. Past the mount only — hydration\n * reaches the same actions while the startup band is buffering.\n */\nexport function showWarningsAsToast(change: () => void): void {\n enableBuffering();\n try {\n change();\n const warnings = drainBuffer();\n if (warnings.length > 0) {\n useWizardStore.getState().setToastMessage(skillsLeftOutToast(warnings.length));\n }\n } finally {\n disableBuffering();\n }\n}\n\nexport type HydrateOptions = {\n initialStep?: WizardStep;\n initialDomains?: Domain[];\n initialAgents?: AgentName[];\n installedSkillIds?: SkillId[];\n installedSkillConfigs?: SkillConfig[];\n installedAgentConfigs?: AgentScopeConfig[];\n isEditingFromGlobalScope?: boolean;\n setupMarketplace?: string;\n};\n\n/**\n * Call BEFORE render(<Wizard />): hydrating in a render-phase hook flashes the default step for\n * one frame.\n */\nexport function hydrateWizardStore(options: HydrateOptions): void {\n useWizardStore.setState(createInitialState());\n\n const { initialStep } = options;\n const isEditFlow = initialStep !== undefined;\n if (isEditFlow) {\n hydrateForEdit(initialStep, options);\n } else {\n hydrateForInit(options);\n }\n}\n\nfunction hydrateForEdit(initialStep: WizardStep, options: HydrateOptions): void {\n const {\n initialDomains,\n initialAgents,\n installedSkillIds,\n installedSkillConfigs,\n installedAgentConfigs,\n isEditingFromGlobalScope,\n setupMarketplace,\n } = options;\n\n if (installedSkillIds?.length) {\n useWizardStore.getState().populateFromSkillIds(installedSkillIds, installedSkillConfigs);\n }\n\n useWizardStore.setState({\n isInitMode: false,\n step: initialStep,\n history: [],\n approach: \"scratch\",\n ...(initialDomains?.length ? { selectedDomains: initialDomains, currentDomainIndex: 0 } : {}),\n ...(initialAgents?.length ? { selectedAgents: initialAgents } : {}),\n ...(initialAgents?.length && installedAgentConfigs?.length\n ? { agentConfigs: installedAgentConfigs }\n : {}),\n ...(installedSkillConfigs?.length || installedAgentConfigs?.length\n ? {\n installedSkillConfigs: installedSkillConfigs ?? null,\n installedAgentConfigs: installedAgentConfigs ?? null,\n }\n : {}),\n ...(isEditingFromGlobalScope ? { isEditingFromGlobalScope: true } : {}),\n ...(setupMarketplace !== undefined && { setupMarketplace }),\n });\n\n useWizardStore.getState().seedFocusedSkillForActiveDomain();\n}\n\nconst FIRST_STEP_WITHOUT_STACKS: WizardStep = \"domains\";\n\n/**\n * Saved selections become preselections for stack-selection.tsx to merge after the stack choice\n * (selectStack wipes agents). With no stacks to offer, the wizard opens where \"Start from scratch\"\n * leads, having done what pressing it does.\n */\nfunction hydrateForInit(options: HydrateOptions): void {\n const {\n initialDomains,\n initialAgents,\n installedSkillConfigs,\n installedAgentConfigs,\n isEditingFromGlobalScope,\n } = options;\n\n useWizardStore.setState({\n isInitMode: true,\n ...(initialDomains?.length ? { selectedDomains: initialDomains, currentDomainIndex: 0 } : {}),\n ...(initialAgents?.length ? { selectedAgents: initialAgents } : {}),\n ...(initialAgents?.length && installedAgentConfigs?.length\n ? { agentConfigs: installedAgentConfigs }\n : {}),\n ...(installedSkillConfigs?.length || installedAgentConfigs?.length\n ? {\n installedSkillConfigs: installedSkillConfigs ?? null,\n installedAgentConfigs: installedAgentConfigs ?? null,\n }\n : {}),\n ...(isEditingFromGlobalScope ? { isEditingFromGlobalScope: true } : {}),\n ...(installedSkillConfigs?.length ? { globalPreselections: installedSkillConfigs } : {}),\n ...(initialAgents?.length || installedAgentConfigs?.length\n ? {\n globalAgentPreselections: {\n agents: initialAgents ?? [],\n configs: installedAgentConfigs ?? [],\n },\n }\n : {}),\n });\n\n if (!offersStacks()) {\n useWizardStore.getState().startFromScratch();\n useWizardStore.setState({ step: FIRST_STEP_WITHOUT_STACKS, history: [] });\n }\n\n useWizardStore.getState().seedFocusedSkillForActiveDomain();\n}\n","import { sortBy } from \"remeda\";\nimport { typedValues } from \"../../utils/typed-object.js\";\nimport type { Domain, SkillId } from \"../../types/index.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport { getAvailableSkills, getCellState, getUnmetRequiredBy } from \"../matrix/index.js\";\nimport { matrix, getSkillById } from \"../matrix/matrix-provider.js\";\nimport { deriveScopeBadges } from \"./scope-diff.js\";\nimport type { CategoryRow, CategoryOption } from \"../../components/wizard/category-grid.js\";\n\n// Build CategoryRow[] from matrix for a domain\nexport function buildCategoriesForDomain(\n domain: Domain,\n allSelections: SkillId[],\n installedSkillIds?: SkillId[],\n skillConfigs?: SkillConfig[],\n): CategoryRow[] {\n const categories = sortBy(\n typedValues(matrix.categories).filter((cat) => cat.domain === domain),\n (cat) => cat.order,\n );\n\n const categoryRows: CategoryRow[] = categories.map((cat) => {\n const skillOptions = getAvailableSkills(cat.id, allSelections);\n\n // Sort options by displayName so the grid order is deterministic across\n // machines and source types (readdir/insertion order is otherwise unstable).\n // Lowercased ordinal comparison keeps the order locale-independent.\n const sortedOptions = sortBy(skillOptions, (skill) =>\n getSkillById(skill.id).displayName.toLowerCase(),\n );\n\n const options: CategoryOption[] = sortedOptions.map((skill) => {\n const activeConfig = skillConfigs?.find((sc) => sc.id === skill.id && !sc.excluded);\n const excludedConfig = skillConfigs?.find((sc) => sc.id === skill.id && sc.excluded);\n const { secondaryScope } = deriveScopeBadges(activeConfig, excludedConfig);\n const local = getSkillById(skill.id).local;\n const requiredBy = skill.selected ? undefined : getUnmetRequiredBy(skill.id, allSelections);\n return {\n id: skill.id,\n // The cell verdict, not the raw advisory: inside a pick-one category\n // the shared semantics forgive what the swap resolves.\n state: getCellState(skill.id, allSelections),\n selected: skill.selected,\n ...(local !== undefined && { local }),\n installed: installedSkillIds?.includes(skill.id) || false,\n ...(activeConfig?.scope !== undefined && { scope: activeConfig.scope }),\n ...(secondaryScope !== undefined && { secondaryScope }),\n ...(activeConfig?.origin !== undefined && { source: activeConfig.origin }),\n hasUnmetRequirements: skill.hasUnmetRequirements,\n ...(skill.unmetRequirementsReason !== undefined && {\n unmetRequirementsReason: skill.unmetRequirementsReason,\n }),\n ...(requiredBy !== undefined && { requiredBy }),\n };\n });\n\n return {\n id: cat.id,\n displayName: cat.displayName,\n exclusive: cat.exclusive,\n options,\n };\n });\n\n return categoryRows.filter((row) => row.options.length > 0);\n}\n","import type { AgentScopeConfig, SkillConfig, SkillScope } from \"../../types/config\";\nimport type { AgentName, SkillId } from \"../../types/index\";\n\nexport type ScopeDiffInput = {\n currentSkills: SkillConfig[];\n currentAgents: AgentScopeConfig[];\n installedSkillConfigs: SkillConfig[] | null;\n installedAgentConfigs: AgentScopeConfig[] | null;\n isInitMode: boolean;\n};\n\nexport type DiffRowStatus = \"added\" | \"mode-changed\" | \"removed\" | \"unchanged\";\n\nexport type SkillDiffRow = {\n id: SkillId;\n source: string;\n status: DiffRowStatus;\n};\n\nexport type AgentDiffRow = {\n name: AgentName;\n status: Exclude<DiffRowStatus, \"mode-changed\">;\n};\n\nexport type ScopeDiff = {\n projectSkillRows: SkillDiffRow[];\n globalSkillRows: SkillDiffRow[];\n projectAgentRows: AgentDiffRow[];\n globalAgentRows: AgentDiffRow[];\n hasContent: boolean;\n};\n\n/**\n * Computes the per-scope diff rows the confirm-step summary renders.\n *\n * The diff baseline keeps tombstones as first-class entries. A tombstone\n * occupies the (id, scope) slot: it means \"the global install still exists but\n * is silenced at project scope\" — the dual-scope indicator. Treating the slot\n * as occupied — for both the previous-key set (isNew detection) and removal\n * (slot-occupancy match) — prevents a dual-scope G→P toggle from rendering a\n * spurious `-` at Global or a spurious `+` at Global on the next edit\n * when the stored tombstone is re-read; mode-change (`~`) tracking filters to active baseline\n * entries because tombstones don't represent a live install.\n *\n * Occupying a slot is not the same as filling it, which is why removal reads the\n * ACTIVE baseline alone and every re-surfaced global row is deduped against the\n * inherited set. A baseline tombstone masks an install rather than being one, and\n * an inherited global can be admitted as inherited and matched as removed at once.\n */\nexport function computeScopeDiff(input: ScopeDiffInput): ScopeDiff {\n const { currentSkills, currentAgents, installedSkillConfigs, installedAgentConfigs, isInitMode } =\n input;\n\n const projectSkills = currentSkills.filter((s) => s.scope === \"project\" && !s.excluded);\n const globalSkills = currentSkills.filter((s) => s.scope === \"global\" && !s.excluded);\n const projectAgents = currentAgents.filter((a) => a.scope === \"project\" && !a.excluded);\n const globalAgents = currentAgents.filter((a) => a.scope === \"global\" && !a.excluded);\n const excludedGlobalSkills = currentSkills.filter((s) => s.scope === \"global\" && !!s.excluded);\n const excludedGlobalAgents = currentAgents.filter((a) => a.scope === \"global\" && !!a.excluded);\n\n const prevSkillKeySet = installedSkillConfigs\n ? new Set(installedSkillConfigs.map((s) => skillSlotKey(s.id, s.scope)))\n : null;\n const prevSourceMap = installedSkillConfigs\n ? new Map(\n installedSkillConfigs\n .filter((s) => !s.excluded)\n .map((s) => [skillSlotKey(s.id, s.scope), s.origin]),\n )\n : null;\n const prevAgentKeySet = installedAgentConfigs\n ? new Set(installedAgentConfigs.map((a) => agentSlotKey(a.name, a.scope)))\n : null;\n\n // The installs the baseline actually records. Both readers below want this\n // rather than the raw snapshot: `inheritedGlobal*` re-surfaces an active global\n // the project overrides without a tombstone — a historical no-tombstone\n // dual-scope shape, current tombstones being handled by\n // `uniqueExcludedGlobalSkills` — and removal reports only what an install left.\n const activeSkillBaseline = installedSkillConfigs\n ? installedSkillConfigs.filter((s) => !s.excluded)\n : [];\n const activeAgentBaseline = installedAgentConfigs\n ? installedAgentConfigs.filter((a) => !a.excluded)\n : [];\n const inheritedGlobalSkills = activeSkillBaseline.filter(\n (s) =>\n s.scope === \"global\" &&\n !globalSkills.some((g) => g.id === s.id) &&\n !excludedGlobalSkills.some((e) => e.id === s.id) &&\n projectSkills.some((p) => p.id === s.id),\n );\n const inheritedGlobalAgents = activeAgentBaseline.filter(\n (a) =>\n a.scope === \"global\" &&\n !globalAgents.some((g) => g.name === a.name) &&\n !excludedGlobalAgents.some((e) => e.name === a.name) &&\n projectAgents.some((p) => p.name === a.name),\n );\n\n // Slot-occupancy match over the ACTIVE baseline: an installed entry at\n // (id, scope) is considered removed only if nothing — active OR tombstone —\n // occupies that slot in current. A current tombstone at the same key keeps the\n // slot occupied (dual-scope indicator, not a removal).\n //\n // A baseline TOMBSTONE is never a removal candidate. It masks a global install\n // rather than being one, so its slot held nothing to delete and dropping it\n // takes nothing away — a `-` there announces a deletion that never happens.\n const removedSkills = activeSkillBaseline.filter(\n (s) => !currentSkills.some((c) => c.id === s.id && c.scope === s.scope),\n );\n const removedAgents = activeAgentBaseline.filter(\n (a) => !currentAgents.some((c) => c.name === a.name && c.scope === a.scope),\n );\n\n // The Global section renders at most one row per skill, so both of the ways a\n // baseline global entry can re-surface are deduped against the inherited set:\n // `uniqueExcludedGlobalSkills` for the current tombstone, and the removed-global\n // rows below for the removal match. The second is not covered by the first —\n // an inherited global that the project claims WITHOUT a tombstone occupies no\n // slot in current, so it is admitted as inherited and matched as removed at\n // once, and the same skill lands under Global twice.\n const inheritedSkillIdSet = new Set(inheritedGlobalSkills.map((s) => s.id));\n const uniqueExcludedGlobalSkills = excludedGlobalSkills.filter(\n (s) => !inheritedSkillIdSet.has(s.id),\n );\n const allGlobalSkills = [\n ...globalSkills,\n ...inheritedGlobalSkills,\n ...uniqueExcludedGlobalSkills,\n ];\n const inheritedAgentNameSet = new Set(inheritedGlobalAgents.map((a) => a.name));\n const uniqueExcludedGlobalAgents = excludedGlobalAgents.filter(\n (a) => !inheritedAgentNameSet.has(a.name),\n );\n const allGlobalAgents = [\n ...globalAgents,\n ...inheritedGlobalAgents,\n ...uniqueExcludedGlobalAgents,\n ];\n\n const removedGlobalSkills = isInitMode\n ? []\n : removedSkills.filter((s) => s.scope === \"global\" && !inheritedSkillIdSet.has(s.id));\n const removedProjectSkills = removedSkills.filter((s) => s.scope === \"project\");\n const removedGlobalAgents = isInitMode\n ? []\n : removedAgents.filter((a) => a.scope === \"global\" && !inheritedAgentNameSet.has(a.name));\n const removedProjectAgents = removedAgents.filter((a) => a.scope === \"project\");\n\n const projectSkillRows = [\n ...projectSkills.map((s) => classifyDiffRow(s, prevSkillKeySet, prevSourceMap)),\n ...removedProjectSkills.map(toRemovedSkillRow),\n ];\n const globalSkillRows = [\n ...allGlobalSkills.map((s) => classifyDiffRow(s, prevSkillKeySet, prevSourceMap)),\n ...removedGlobalSkills.map(toRemovedSkillRow),\n ];\n const projectAgentRows = [\n ...projectAgents.map((a) => classifyAgentDiffRow(a, prevAgentKeySet)),\n ...removedProjectAgents.map(toRemovedAgentRow),\n ];\n const globalAgentRows = [\n ...allGlobalAgents.map((a) => classifyAgentDiffRow(a, prevAgentKeySet)),\n ...removedGlobalAgents.map(toRemovedAgentRow),\n ];\n\n const hasContent =\n projectSkillRows.length > 0 ||\n globalSkillRows.length > 0 ||\n projectAgentRows.length > 0 ||\n globalAgentRows.length > 0;\n\n return { projectSkillRows, globalSkillRows, projectAgentRows, globalAgentRows, hasContent };\n}\n\n/**\n * The `(id, scope)` SLOT key this module diffs on. Exported so every surface that computes its own\n * session diff — notably the wizard store's Sources tab — keys on the same slot rather than on the\n * id alone, which is what let one skill read as added on one surface and unchanged on the other.\n */\nexport function skillSlotKey(id: SkillId, scope: SkillScope | undefined): string {\n return `${id}:${scope}`;\n}\n\n/**\n * The `(name, scope)` SLOT key for an agent — the agent-side counterpart of {@link skillSlotKey},\n * exported for the same reason. Today only this module diffs agent slots, so there is nothing to\n * disagree with; the helper exists so that a second surface routes through it from the start rather\n * than re-deriving the key on `name` alone, which is precisely how the skill side ended up with\n * the Sources tab and the confirm step disagreeing about whether the same row was added.\n */\nexport function agentSlotKey(name: AgentName, scope: SkillScope | undefined): string {\n return `${name}:${scope}`;\n}\n\nexport type ScopeBadges = {\n scope: SkillScope | undefined;\n secondaryScope: SkillScope | undefined;\n};\n\n/** Bracketed scope badge: `[G]` for global, `[P]` for project. */\nexport function formatScopeTag(scope: SkillScope): \"[G]\" | \"[P]\" {\n return scope === \"global\" ? \"[G]\" : \"[P]\";\n}\n\n/**\n * Derives the primary + secondary scope badges for a row from its active\n * entry and its excluded tombstone. A tombstone at the OTHER scope renders as a\n * secondary badge (`[P][G]`); a same-scope tombstone renders nothing extra.\n */\nexport function deriveScopeBadges(\n activeConfig: { scope: SkillScope } | undefined,\n excludedConfig: { scope: SkillScope } | undefined,\n): ScopeBadges {\n const secondaryScope =\n excludedConfig && activeConfig && excludedConfig.scope !== activeConfig.scope\n ? excludedConfig.scope\n : undefined;\n return { scope: activeConfig?.scope, secondaryScope };\n}\n\n/**\n * Classifies an active skill entry against the baseline: added, mode-changed, or unchanged.\n *\n * The comparison is on `origin`, because that field IS where a skill's install mode is\n * recorded: `eject` means the project's own copy and anything else names the marketplace the\n * plugin comes from. With no second marketplace to move between, an `origin` that changed is a\n * mode that changed, which is what the `~` marker has always meant to a reader.\n */\nfunction classifyDiffRow(\n skill: SkillConfig,\n prevKeySet: Set<string> | null,\n prevSourceMap: Map<string, string> | null,\n): SkillDiffRow {\n const key = skillSlotKey(skill.id, skill.scope);\n const isNew = prevKeySet === null || !prevKeySet.has(key);\n const prevSource = prevSourceMap?.get(key);\n const modeChanged = !isNew && prevSource != null && prevSource !== skill.origin;\n if (modeChanged) {\n return { id: skill.id, source: skill.origin, status: \"mode-changed\" };\n }\n return { id: skill.id, source: skill.origin, status: isNew ? \"added\" : \"unchanged\" };\n}\n\nfunction classifyAgentDiffRow(\n agent: AgentScopeConfig,\n prevKeySet: Set<string> | null,\n): AgentDiffRow {\n const isNew = prevKeySet === null || !prevKeySet.has(agentSlotKey(agent.name, agent.scope));\n return { name: agent.name, status: isNew ? \"added\" : \"unchanged\" };\n}\n\nfunction toRemovedSkillRow(skill: SkillConfig): SkillDiffRow {\n return { id: skill.id, source: skill.origin, status: \"removed\" };\n}\n\nfunction toRemovedAgentRow(agent: AgentScopeConfig): AgentDiffRow {\n return { name: agent.name, status: \"removed\" };\n}\n","import type { CheckboxItem } from \"../../components/wizard/checkbox-grid.js\";\nimport type { AgentName } from \"../../types/index.js\";\n\nexport type AgentItem = CheckboxItem<AgentName>;\n\nexport type AgentGroup = {\n label: string;\n items: AgentItem[];\n};\n\n/**\n * The agents the wizard offers, in the order its grid lists them.\n *\n * Lives here rather than in `step-agents.tsx` because the grid is not the only\n * surface that has to know which row it opens on: the store seeds `focusedAgentId`\n * from the same roster before the first frame, so that a keystroke buffered ahead\n * of that frame resolves the same agent the user is looking at.\n */\nexport const BUILT_IN_AGENT_GROUPS: AgentGroup[] = [\n {\n label: \"Web\",\n items: [\n {\n id: \"web-developer\",\n label: \"Web Developer\",\n description: \"Frontend features, components, TypeScript\",\n },\n { id: \"web-researcher\", label: \"Web Researcher\", description: \"Frontend pattern discovery\" },\n {\n id: \"web-tester\",\n label: \"Web Tester\",\n description: \"Frontend tests, E2E, component tests\",\n },\n ],\n },\n {\n label: \"API\",\n items: [\n {\n id: \"api-developer\",\n label: \"API Developer\",\n description: \"Backend routes, database, middleware\",\n },\n { id: \"api-researcher\", label: \"API Researcher\", description: \"Backend pattern discovery\" },\n {\n id: \"api-tester\",\n label: \"API Tester\",\n description: \"Endpoint, database, and auth flow tests\",\n },\n ],\n },\n {\n label: \"AI\",\n items: [\n {\n id: \"ai-developer\",\n label: \"AI Developer\",\n description: \"RAG pipelines, agent loops, tool calling\",\n },\n {\n id: \"ai-researcher\",\n label: \"AI Researcher\",\n description: \"Prompt, model, and RAG pipeline discovery\",\n },\n {\n id: \"ai-tester\",\n label: \"AI Tester\",\n description: \"LLM mocking, prompt regression, eval harnesses\",\n },\n ],\n },\n {\n label: \"CLI\",\n items: [\n {\n id: \"cli-developer\",\n label: \"CLI Developer\",\n description: \"CLI commands, interactive prompts\",\n },\n { id: \"cli-tester\", label: \"CLI Tester\", description: \"CLI application tests\" },\n {\n id: \"cli-researcher\",\n label: \"CLI Researcher\",\n description: \"CLI command and config pattern discovery\",\n },\n ],\n },\n {\n label: \"Meta\",\n items: [\n {\n id: \"pm\",\n label: \"PM\",\n description: \"Cross-domain implementation specs; domain frameworks via skills\",\n },\n {\n id: \"reviewer\",\n label: \"Reviewer\",\n description: \"Cross-domain code review; domain knowledge via skills\",\n },\n { id: \"agent-summoner\", label: \"Agent Summoner\", description: \"Create and improve agents\" },\n {\n id: \"skill-summoner\",\n label: \"Skill Summoner\",\n description: \"Create technology-specific skills\",\n },\n { id: \"codex-keeper\", label: \"Codex Keeper\", description: \"AI-focused documentation\" },\n ],\n },\n];\n\n/** IDs of all built-in agents for fast lookup. */\nexport const BUILT_IN_AGENT_IDS = new Set<string>(\n BUILT_IN_AGENT_GROUPS.flatMap((group) => group.items.map((agent) => agent.id)),\n);\n\n/**\n * The agent the grid focuses when nothing is focused yet.\n *\n * Always a built-in: a marketplace's own agents are appended after these groups,\n * so the head of the list does not move with the loaded source.\n */\nexport function firstFocusableAgent(): AgentName {\n const first = BUILT_IN_AGENT_GROUPS[0]?.items[0];\n if (first === undefined) throw new Error(\"The built-in agent roster is empty\");\n return first.id;\n}\n"],"mappings":"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","names":[]}
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/cli/components/wizard/hotkeys.ts
4
- var HOTKEY_INFO = { key: "i", label: "I" };
5
- var HOTKEY_ACCEPT_DEFAULTS = { key: "a", label: "A" };
6
- var HOTKEY_SCOPE = { key: "s", label: "S" };
7
- var HOTKEY_TOGGLE_LABELS = { key: "d", label: "D" };
8
- var KEY_SPACE = " ";
9
- var KEY_LABEL_ENTER = "ENTER";
10
- var KEY_LABEL_ESC = "ESC";
11
- var KEY_LABEL_SPACE = "SPACE";
12
- function isHotkey(input, hotkey) {
13
- return input.toLowerCase() === hotkey.key.toLowerCase();
14
- }
15
- function isInfoPanelAvailable(step) {
16
- return step !== "confirm";
17
- }
18
-
19
- export {
20
- HOTKEY_INFO,
21
- HOTKEY_ACCEPT_DEFAULTS,
22
- HOTKEY_SCOPE,
23
- HOTKEY_TOGGLE_LABELS,
24
- KEY_SPACE,
25
- KEY_LABEL_ENTER,
26
- KEY_LABEL_ESC,
27
- KEY_LABEL_SPACE,
28
- isHotkey,
29
- isInfoPanelAvailable
30
- };
31
- //# sourceMappingURL=chunk-WTJ3AY33.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/components/wizard/hotkeys.ts"],"sourcesContent":["/**\n * Centralized hotkey registry for wizard components.\n *\n * Every character-based hotkey and its display label lives here so that\n * changing a binding updates the key check, the footer hint, and the\n * info panel in one place.\n */\n\nimport type { WizardStep } from \"../../stores/wizard-store.js\";\n\n// ---------------------------------------------------------------------------\n// Global hotkeys (active across multiple wizard steps)\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_INFO = { key: \"i\", label: \"I\" } as const;\nexport const HOTKEY_ACCEPT_DEFAULTS = { key: \"a\", label: \"A\" } as const;\nexport const HOTKEY_SCOPE = { key: \"s\", label: \"S\" } as const;\n\n// ---------------------------------------------------------------------------\n// Build step hotkeys\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_TOGGLE_LABELS = { key: \"d\", label: \"D\" } as const;\n\n// ---------------------------------------------------------------------------\n// Sources step hotkeys\n// ---------------------------------------------------------------------------\n\n// None. The step's two bulk install-mode keys — `l` (set all local) and `p` (set\n// all plugin) — are withdrawn. They rewrote `origin` on every active skill config\n// with no scope authority behind them, so from a project edit they reached the\n// inherited global rows the same step renders locked and non-focusable: the bulk\n// key could do what the per-row control provably cannot. Per-row SPACE on the\n// grid cell is the only install-mode surface, and its own inertness on a locked\n// row is the containment.\n\n// ---------------------------------------------------------------------------\n// Common key labels (for structural keys handled via Ink key objects)\n// ---------------------------------------------------------------------------\n\n/** The spacebar input character (Ink delivers a literal space for the space key). */\nexport const KEY_SPACE = \" \";\n\nexport const KEY_LABEL_ENTER = \"ENTER\" as const;\nexport const KEY_LABEL_ESC = \"ESC\" as const;\nexport const KEY_LABEL_SPACE = \"SPACE\" as const;\nexport const KEY_LABEL_DEL = \"DEL\" as const;\nexport const KEY_LABEL_ARROWS_VERT = \"\\u2191/\\u2193\" as const;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Case-insensitive check for a character hotkey. */\nexport function isHotkey(input: string, hotkey: { key: string }): boolean {\n return input.toLowerCase() === hotkey.key.toLowerCase();\n}\n\n/**\n * Whether `HOTKEY_INFO` does anything on `step` — the single answer both the\n * key handler in `wizard.tsx` and the footer hint in `wizard-layout.tsx` read,\n * so the wizard never advertises a key it ignores.\n *\n * The confirm step is excluded because it already renders the panel the\n * overlay would show, and the overlay REPLACES the step rather than sitting\n * over it: opening it there would unmount the confirm step's `Enter` handler\n * and strand the user on a screen nothing can complete.\n */\nexport function isInfoPanelAvailable(step: WizardStep): boolean {\n return step !== \"confirm\";\n}\n"],"mappings":";;;AAcO,IAAM,cAAc,EAAE,KAAK,KAAK,OAAO,IAAI;AAC3C,IAAM,yBAAyB,EAAE,KAAK,KAAK,OAAO,IAAI;AACtD,IAAM,eAAe,EAAE,KAAK,KAAK,OAAO,IAAI;AAM5C,IAAM,uBAAuB,EAAE,KAAK,KAAK,OAAO,IAAI;AAmBpD,IAAM,YAAY;AAElB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AASxB,SAAS,SAAS,OAAe,QAAkC;AACxE,SAAO,MAAM,YAAY,MAAM,OAAO,IAAI,YAAY;AACxD;AAYO,SAAS,qBAAqB,MAA2B;AAC9D,SAAO,SAAS;AAClB;","names":[]}
@@ -1,53 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- Wizard
4
- } from "./chunk-PCFUXQJA.js";
5
- import {
6
- promptValue
7
- } from "./chunk-4AAOOAIN.js";
8
- import {
9
- hydrateWizardStore
10
- } from "./chunk-WNLF5EDZ.js";
11
- import {
12
- disableBuffering,
13
- drainBuffer,
14
- enableBuffering
15
- } from "./chunk-C2UISKIM.js";
16
-
17
- // src/cli/components/wizard/run-wizard-session.tsx
18
- import "react";
19
- import { jsx } from "react/jsx-runtime";
20
- function hydrateIntoStartupBand(hydrate, loaded = []) {
21
- enableBuffering();
22
- try {
23
- hydrateWizardStore(hydrate);
24
- return [...loaded, ...drainBuffer()];
25
- } finally {
26
- disableBuffering();
27
- }
28
- }
29
- async function runWizardSession(options) {
30
- const startupMessages = hydrateIntoStartupBand(options.hydrate, options.props.startupMessages);
31
- const result = await promptValue(
32
- (resolve) => /* @__PURE__ */ jsx(
33
- Wizard,
34
- {
35
- ...options.props,
36
- startupMessages,
37
- onComplete: resolve,
38
- onCancel: () => {
39
- options.onCancel();
40
- resolve(null);
41
- }
42
- }
43
- ),
44
- { onExit: null, clearOnResolve: true }
45
- );
46
- options.clearTerminal();
47
- return !result || result.cancelled ? null : result;
48
- }
49
-
50
- export {
51
- runWizardSession
52
- };
53
- //# sourceMappingURL=chunk-X6ZZEYO3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/components/wizard/run-wizard-session.tsx"],"sourcesContent":["import React from \"react\";\nimport { promptValue } from \"../common/prompt-confirm.js\";\nimport { Wizard, type WizardProps, type WizardResultV2 } from \"./wizard.js\";\nimport { hydrateWizardStore, type HydrateOptions } from \"../../stores/wizard-store.js\";\nimport {\n disableBuffering,\n drainBuffer,\n enableBuffering,\n type StartupMessage,\n} from \"../../utils/logger.js\";\n\nexport type WizardSessionOptions = {\n hydrate: HydrateOptions;\n props: Omit<WizardProps, \"onComplete\" | \"onCancel\">;\n onCancel: () => void;\n /** Command-owned terminal reset, run after the Ink render unmounts. */\n clearTerminal: () => void;\n};\n\n/**\n * Hydration under buffer mode, with everything it said appended to the band the load filled.\n *\n * Hydration WARNS: `populateFromSkillIds` reports every installed skill the loaded source no\n * longer carries, and every one whose category no domain claims. Both are routine, both exist\n * to hand the user a remedy, and both were unreadable — the load's buffer is drained back in\n * `lib/operations/source/load-source.ts`, so by the time the store populates, `warn()` is a\n * plain stderr write again. Written there it survives nothing: the wizard's first frame is\n * built to the height of the terminal, so it pushes those lines off the top of the screen the\n * moment it paints. A warning raised between the load's drain and the mount has no surface but\n * this band, which is why the window reopens here rather than the message finding another way\n * out.\n *\n * The load's own messages are passed in and concatenated rather than left in the buffer,\n * because {@link enableBuffering} resets it — this is a second window, not the first one held\n * open. Holding one window across both would have to span two modules and the command's own\n * `this.error()` paths, where no `finally` can reach it.\n *\n * And that `finally` is the point of the try: buffer mode is process-wide, so hydration\n * throwing while it is on would swallow every `warn()` for the rest of the run.\n */\nfunction hydrateIntoStartupBand(\n hydrate: HydrateOptions,\n loaded: StartupMessage[] = [],\n): StartupMessage[] {\n enableBuffering();\n try {\n hydrateWizardStore(hydrate);\n return [...loaded, ...drainBuffer()];\n } finally {\n disableBuffering();\n }\n}\n\n/**\n * Runs one full wizard session: hydrate the store, render the wizard, clear the\n * screen, and return the selection — or null when it was cancelled.\n *\n * The three endings settle the same promise, first one winning: the wizard completed,\n * the wizard was cancelled, or the Ink app exited having chosen neither (Ctrl+C, or a\n * render that failed). Only the first carries a selection, so the other two are `null`\n * — `onExit` for the ending no callback announces.\n *\n * The command's own cancellation notice runs BEFORE the resolve, because resolving is\n * what clears the screen: printed after, it would be wiped by the repaint it caused.\n */\nexport async function runWizardSession(\n options: WizardSessionOptions,\n): Promise<WizardResultV2 | null> {\n const startupMessages = hydrateIntoStartupBand(options.hydrate, options.props.startupMessages);\n\n const result = await promptValue<WizardResultV2 | null>(\n (resolve) => (\n <Wizard\n {...options.props}\n startupMessages={startupMessages}\n onComplete={resolve}\n onCancel={() => {\n options.onCancel();\n resolve(null);\n }}\n />\n ),\n { onExit: null, clearOnResolve: true },\n );\n\n options.clearTerminal();\n\n return !result || result.cancelled ? null : result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,OAAkB;AAwEZ;AAhCN,SAAS,uBACP,SACA,SAA2B,CAAC,GACV;AAClB,kBAAgB;AAChB,MAAI;AACF,uBAAmB,OAAO;AAC1B,WAAO,CAAC,GAAG,QAAQ,GAAG,YAAY,CAAC;AAAA,EACrC,UAAE;AACA,qBAAiB;AAAA,EACnB;AACF;AAcA,eAAsB,iBACpB,SACgC;AAChC,QAAM,kBAAkB,uBAAuB,QAAQ,SAAS,QAAQ,MAAM,eAAe;AAE7F,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,YACC;AAAA,MAAC;AAAA;AAAA,QACE,GAAG,QAAQ;AAAA,QACZ;AAAA,QACA,YAAY;AAAA,QACZ,UAAU,MAAM;AACd,kBAAQ,SAAS;AACjB,kBAAQ,IAAI;AAAA,QACd;AAAA;AAAA,IACF;AAAA,IAEF,EAAE,QAAQ,MAAM,gBAAgB,KAAK;AAAA,EACvC;AAEA,UAAQ,cAAc;AAEtB,SAAO,CAAC,UAAU,OAAO,YAAY,OAAO;AAC9C;","names":[]}
@@ -1,89 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/cli/components/hooks/use-focused-list-item.ts
4
- import { useState, useCallback, useRef } from "react";
5
- function useFocusedListItem(rowCount, getColCount, options = {}) {
6
- const {
7
- wrap = true,
8
- findValidCol,
9
- adjustCol,
10
- onChange,
11
- initialRow = 0,
12
- initialCol = 0,
13
- skipRow
14
- } = options;
15
- const [focusedRow, setFocusedRow] = useState(initialRow);
16
- const [focusedCol, setFocusedCol] = useState(initialCol);
17
- const focusedRowRef = useRef(focusedRow);
18
- const focusedColRef = useRef(focusedCol);
19
- const onChangeRef = useRef(onChange);
20
- onChangeRef.current = onChange;
21
- const applyFocus = useCallback((row, col) => {
22
- focusedRowRef.current = row;
23
- focusedColRef.current = col;
24
- setFocusedRow(row);
25
- setFocusedCol(col);
26
- onChangeRef.current?.(row, col);
27
- }, []);
28
- const setFocused = applyFocus;
29
- const currentFocus = useCallback(
30
- () => ({ row: focusedRowRef.current, col: focusedColRef.current }),
31
- []
32
- );
33
- const findNextRow = useCallback(
34
- (fromRow, direction) => {
35
- if (rowCount === 0) return fromRow;
36
- let next = fromRow;
37
- for (let i = 0; i < rowCount; i++) {
38
- if (wrap) {
39
- next = (next + direction + rowCount) % rowCount;
40
- } else {
41
- next = next + direction;
42
- if (next < 0 || next >= rowCount) return fromRow;
43
- }
44
- if (!skipRow || !skipRow(next)) return next;
45
- }
46
- return fromRow;
47
- },
48
- [rowCount, wrap, skipRow]
49
- );
50
- const moveFocus = useCallback(
51
- (direction) => {
52
- const currentRow = focusedRowRef.current;
53
- const currentCol = focusedColRef.current;
54
- if (direction === "left" || direction === "right") {
55
- const colCount = getColCount(currentRow);
56
- if (colCount === 0) return;
57
- const step = direction === "right" ? 1 : -1;
58
- if (findValidCol) {
59
- const newCol = findValidCol(currentRow, currentCol, step);
60
- applyFocus(currentRow, newCol);
61
- } else if (wrap) {
62
- const newCol = (currentCol + step + colCount) % colCount;
63
- applyFocus(currentRow, newCol);
64
- } else {
65
- const newCol = Math.max(0, Math.min(colCount - 1, currentCol + step));
66
- applyFocus(currentRow, newCol);
67
- }
68
- } else {
69
- const step = direction === "down" ? 1 : -1;
70
- const newRow = findNextRow(currentRow, step);
71
- const newColCount = getColCount(newRow);
72
- let finalCol = Math.min(currentCol, Math.max(0, newColCount - 1));
73
- if (adjustCol) {
74
- finalCol = adjustCol(newRow, finalCol);
75
- }
76
- applyFocus(newRow, finalCol);
77
- }
78
- },
79
- // skipRow is reached only through findNextRow, whose identity already
80
- // tracks it — naming it again here just churned this callback's identity.
81
- [getColCount, wrap, findValidCol, adjustCol, findNextRow, applyFocus]
82
- );
83
- return { focusedRow, focusedCol, currentFocus, setFocused, moveFocus };
84
- }
85
-
86
- export {
87
- useFocusedListItem
88
- };
89
- //# sourceMappingURL=chunk-XQHZPINL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/components/hooks/use-focused-list-item.ts"],"sourcesContent":["import { useState, useCallback, useRef } from \"react\";\n\nexport type Direction = \"up\" | \"down\" | \"left\" | \"right\";\n\ntype UseFocusedListItemOptions = {\n /** Wrap around when reaching boundaries (default: true) */\n wrap?: boolean;\n /** Custom column finder for skipping disabled items on horizontal nav.\n * Receives the row, current column, and direction (+1 right, -1 left).\n * Should return the next valid column index. */\n findValidCol?: (row: number, currentCol: number, direction: 1 | -1) => number;\n /** Called after vertical navigation to adjust the clamped column\n * (e.g. to skip disabled items). Returns the adjusted column index. */\n adjustCol?: (row: number, clampedCol: number) => number;\n /** Called whenever focused position changes */\n onChange?: (row: number, col: number) => void;\n /** Initial row index (default: 0) */\n initialRow?: number;\n /** Initial col index (default: 0) */\n initialCol?: number;\n /** Optional predicate: when it returns true for a row index, that row is skipped during vertical navigation. */\n skipRow?: (row: number) => boolean;\n};\n\nexport type FocusedPosition = { row: number; col: number };\n\ntype UseFocusedListItemResult = {\n focusedRow: number;\n focusedCol: number;\n /**\n * The position as it stands now, for a key handler. `focusedRow`/`focusedCol` are what the last\n * render painted, and a key that follows a move in the same chunk is handled before that move\n * has rendered.\n */\n currentFocus: () => FocusedPosition;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: Direction) => void;\n};\n\n/**\n * 2D grid focus management: tracks (row, col) position and handles\n * directional movement with wrapping, column clamping,\n * and optional disabled-column skipping.\n */\nexport function useFocusedListItem(\n rowCount: number,\n getColCount: (row: number) => number,\n options: UseFocusedListItemOptions = {},\n): UseFocusedListItemResult {\n const {\n wrap = true,\n findValidCol,\n adjustCol,\n onChange,\n initialRow = 0,\n initialCol = 0,\n skipRow,\n } = options;\n\n const [focusedRow, setFocusedRow] = useState(initialRow);\n const [focusedCol, setFocusedCol] = useState(initialCol);\n\n // The position every move starts from, written the moment focus moves rather than when the move\n // renders. Keys that arrive in one chunk — a fast typist, a paste — are handled one after another\n // with no render between them, so a copy synced during render still held the position from\n // before the burst, and the second of two moves started where the first one had.\n const focusedRowRef = useRef(focusedRow);\n const focusedColRef = useRef(focusedCol);\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const applyFocus = useCallback((row: number, col: number) => {\n focusedRowRef.current = row;\n focusedColRef.current = col;\n setFocusedRow(row);\n setFocusedCol(col);\n onChangeRef.current?.(row, col);\n }, []);\n\n const setFocused = applyFocus;\n\n const currentFocus = useCallback(\n (): FocusedPosition => ({ row: focusedRowRef.current, col: focusedColRef.current }),\n [],\n );\n\n const findNextRow = useCallback(\n (fromRow: number, direction: 1 | -1): number => {\n if (rowCount === 0) return fromRow;\n let next = fromRow;\n for (let i = 0; i < rowCount; i++) {\n if (wrap) {\n next = (next + direction + rowCount) % rowCount;\n } else {\n next = next + direction;\n if (next < 0 || next >= rowCount) return fromRow;\n }\n if (!skipRow || !skipRow(next)) return next;\n }\n return fromRow; // All rows skipped — stay put\n },\n [rowCount, wrap, skipRow],\n );\n\n const moveFocus = useCallback(\n (direction: Direction) => {\n const currentRow = focusedRowRef.current;\n const currentCol = focusedColRef.current;\n\n if (direction === \"left\" || direction === \"right\") {\n const colCount = getColCount(currentRow);\n if (colCount === 0) return;\n\n const step = direction === \"right\" ? 1 : -1;\n\n if (findValidCol) {\n const newCol = findValidCol(currentRow, currentCol, step);\n applyFocus(currentRow, newCol);\n } else if (wrap) {\n const newCol = (currentCol + step + colCount) % colCount;\n applyFocus(currentRow, newCol);\n } else {\n const newCol = Math.max(0, Math.min(colCount - 1, currentCol + step));\n applyFocus(currentRow, newCol);\n }\n } else {\n const step = direction === \"down\" ? 1 : -1;\n const newRow = findNextRow(currentRow, step);\n const newColCount = getColCount(newRow);\n let finalCol = Math.min(currentCol, Math.max(0, newColCount - 1));\n\n if (adjustCol) {\n finalCol = adjustCol(newRow, finalCol);\n }\n\n applyFocus(newRow, finalCol);\n }\n },\n // skipRow is reached only through findNextRow, whose identity already\n // tracks it — naming it again here just churned this callback's identity.\n [getColCount, wrap, findValidCol, adjustCol, findNextRow, applyFocus],\n );\n\n return { focusedRow, focusedCol, currentFocus, setFocused, moveFocus };\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,aAAa,cAAc;AA4CvC,SAAS,mBACd,UACA,aACA,UAAqC,CAAC,GACZ;AAC1B,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU;AACvD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU;AAMvD,QAAM,gBAAgB,OAAO,UAAU;AACvC,QAAM,gBAAgB,OAAO,UAAU;AAEvC,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,aAAa,YAAY,CAAC,KAAa,QAAgB;AAC3D,kBAAc,UAAU;AACxB,kBAAc,UAAU;AACxB,kBAAc,GAAG;AACjB,kBAAc,GAAG;AACjB,gBAAY,UAAU,KAAK,GAAG;AAAA,EAChC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa;AAEnB,QAAM,eAAe;AAAA,IACnB,OAAwB,EAAE,KAAK,cAAc,SAAS,KAAK,cAAc,QAAQ;AAAA,IACjF,CAAC;AAAA,EACH;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,SAAiB,cAA8B;AAC9C,UAAI,aAAa,EAAG,QAAO;AAC3B,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,YAAI,MAAM;AACR,kBAAQ,OAAO,YAAY,YAAY;AAAA,QACzC,OAAO;AACL,iBAAO,OAAO;AACd,cAAI,OAAO,KAAK,QAAQ,SAAU,QAAO;AAAA,QAC3C;AACA,YAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAG,QAAO;AAAA,MACzC;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,MAAM,OAAO;AAAA,EAC1B;AAEA,QAAM,YAAY;AAAA,IAChB,CAAC,cAAyB;AACxB,YAAM,aAAa,cAAc;AACjC,YAAM,aAAa,cAAc;AAEjC,UAAI,cAAc,UAAU,cAAc,SAAS;AACjD,cAAM,WAAW,YAAY,UAAU;AACvC,YAAI,aAAa,EAAG;AAEpB,cAAM,OAAO,cAAc,UAAU,IAAI;AAEzC,YAAI,cAAc;AAChB,gBAAM,SAAS,aAAa,YAAY,YAAY,IAAI;AACxD,qBAAW,YAAY,MAAM;AAAA,QAC/B,WAAW,MAAM;AACf,gBAAM,UAAU,aAAa,OAAO,YAAY;AAChD,qBAAW,YAAY,MAAM;AAAA,QAC/B,OAAO;AACL,gBAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,aAAa,IAAI,CAAC;AACpE,qBAAW,YAAY,MAAM;AAAA,QAC/B;AAAA,MACF,OAAO;AACL,cAAM,OAAO,cAAc,SAAS,IAAI;AACxC,cAAM,SAAS,YAAY,YAAY,IAAI;AAC3C,cAAM,cAAc,YAAY,MAAM;AACtC,YAAI,WAAW,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AAEhE,YAAI,WAAW;AACb,qBAAW,UAAU,QAAQ,QAAQ;AAAA,QACvC;AAEA,mBAAW,QAAQ,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,CAAC,aAAa,MAAM,cAAc,WAAW,aAAa,UAAU;AAAA,EACtE;AAEA,SAAO,EAAE,YAAY,YAAY,cAAc,YAAY,UAAU;AACvE;","names":[]}
@@ -1,35 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- isDomain
4
- } from "./chunk-C2UISKIM.js";
5
- import {
6
- findStack
7
- } from "./chunk-NU2K5G54.js";
8
-
9
- // src/cli/components/wizard/utils.ts
10
- var DOMAIN_DISPLAY_NAMES = {
11
- web: "Web",
12
- api: "API",
13
- ai: "AI",
14
- cli: "CLI",
15
- mobile: "Mobile",
16
- desktop: "Desktop",
17
- infra: "Infrastructure",
18
- meta: "Meta",
19
- shared: "Shared"
20
- };
21
- function getDomainDisplayName(domain) {
22
- return (isDomain(domain) ? DOMAIN_DISPLAY_NAMES[domain] : null) ?? domain.charAt(0).toUpperCase() + domain.slice(1);
23
- }
24
- function getStackName(stackId) {
25
- if (!stackId) return void 0;
26
- const stack = findStack(stackId);
27
- if (!stack) throw new Error(`Stack not found: ${stackId}`);
28
- return stack.name;
29
- }
30
-
31
- export {
32
- getDomainDisplayName,
33
- getStackName
34
- };
35
- //# sourceMappingURL=chunk-YN3SWF53.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/components/wizard/utils.ts"],"sourcesContent":["import { findStack } from \"../../lib/matrix/matrix-provider.js\";\nimport { orderDomains } from \"../../lib/wizard/index.js\";\nimport type { Domain } from \"../../types/index.js\";\nimport { isDomain } from \"../../utils/type-guards.js\";\n\nconst DOMAIN_DISPLAY_NAMES: Record<Domain, string> = {\n web: \"Web\",\n api: \"API\",\n ai: \"AI\",\n cli: \"CLI\",\n mobile: \"Mobile\",\n desktop: \"Desktop\",\n infra: \"Infrastructure\",\n meta: \"Meta\",\n shared: \"Shared\",\n};\n\nexport function getDomainDisplayName(domain: string): string {\n return (\n (isDomain(domain) ? DOMAIN_DISPLAY_NAMES[domain] : null) ??\n domain.charAt(0).toUpperCase() + domain.slice(1)\n );\n}\n\n/**\n * Display name of the selected stack, or `undefined` when the wizard is\n * building from scratch — the state each caller renders in its own words\n * (\"your custom stack\" in the tab dropdown, \"none\" in the summary panel).\n *\n * The lookup asserts. `selectedStackId` is written by `selectStack` and nothing\n * else: `createInitialState` starts it at `null`, neither hydration path\n * restores it from config, and `selectStack`'s only non-null argument is\n * `focusedStack.id` in `stack-selection.tsx`, taken from\n * `matrix.suggestedStacks` — the same array `findStack` searches. The matrix is\n * never rebuilt while the wizard is mounted (`initializeMatrix` runs during\n * startup loading; the wizard's own add/remove-source path writes config and\n * re-reads a summary). So a miss is a bug, not a stack to label with its raw id\n * — the same conclusion `wizard.tsx` already reaches for the same lookup.\n */\nexport function getStackName(stackId: string | null): string | undefined {\n if (!stackId) return undefined;\n const stack = findStack(stackId);\n if (!stack) throw new Error(`Stack not found: ${stackId}`);\n return stack.name;\n}\n\nexport { orderDomains };\n"],"mappings":";;;;;;;;;AAKA,IAAM,uBAA+C;AAAA,EACnD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AACV;AAEO,SAAS,qBAAqB,QAAwB;AAC3D,UACG,SAAS,MAAM,IAAI,qBAAqB,MAAM,IAAI,SACnD,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAEnD;AAiBO,SAAS,aAAa,SAA4C;AACvE,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,UAAU,OAAO;AAC/B,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AACzD,SAAO,MAAM;AACf;","names":[]}
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- CategoryGrid
4
- } from "../../chunk-3DIDV6H3.js";
5
- import "../../chunk-XQHZPINL.js";
6
- import "../../chunk-WTJ3AY33.js";
7
- import "../../chunk-SLBL3WIP.js";
8
- import "../../chunk-NU2K5G54.js";
9
- import "../../chunk-AG3ZVM3B.js";
10
- export {
11
- CategoryGrid
12
- };
13
- //# sourceMappingURL=category-grid.js.map
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- CheckboxGrid
4
- } from "../../chunk-JPMV4E4E.js";
5
- import "../../chunk-LFUJCRCT.js";
6
- import "../../chunk-WTJ3AY33.js";
7
- import "../../chunk-SLBL3WIP.js";
8
- import "../../chunk-AG3ZVM3B.js";
9
- export {
10
- CheckboxGrid
11
- };
12
- //# sourceMappingURL=checkbox-grid.js.map
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- DomainSelection
4
- } from "../../chunk-HI6YB7XP.js";
5
- import "../../chunk-YN3SWF53.js";
6
- import "../../chunk-JPMV4E4E.js";
7
- import "../../chunk-LFUJCRCT.js";
8
- import "../../chunk-WTJ3AY33.js";
9
- import "../../chunk-SLBL3WIP.js";
10
- import "../../chunk-WNLF5EDZ.js";
11
- import "../../chunk-C2UISKIM.js";
12
- import "../../chunk-NU2K5G54.js";
13
- import "../../chunk-AG3ZVM3B.js";
14
- import "../../chunk-OI2H6M5I.js";
15
- export {
16
- DomainSelection
17
- };
18
- //# sourceMappingURL=domain-selection.js.map
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- runWizardSession
4
- } from "../../chunk-X6ZZEYO3.js";
5
- import "../../chunk-PCFUXQJA.js";
6
- import "../../chunk-KQ3PDARZ.js";
7
- import "../../chunk-PLX2FLEQ.js";
8
- import "../../chunk-HL3GYRMR.js";
9
- import "../../chunk-JVUN6AOO.js";
10
- import "../../chunk-QWFG7Y3R.js";
11
- import "../../chunk-6WGXTB2L.js";
12
- import "../../chunk-L3W2JWBA.js";
13
- import "../../chunk-HI6YB7XP.js";
14
- import "../../chunk-23DNVNFP.js";
15
- import "../../chunk-7PYXS2QU.js";
16
- import "../../chunk-GRL73YPF.js";
17
- import "../../chunk-DJEO3F2H.js";
18
- import "../../chunk-YN3SWF53.js";
19
- import "../../chunk-4HWOYYY7.js";
20
- import "../../chunk-TSIU7DME.js";
21
- import "../../chunk-JOEA52NR.js";
22
- import "../../chunk-3DIDV6H3.js";
23
- import "../../chunk-XQHZPINL.js";
24
- import "../../chunk-JPMV4E4E.js";
25
- import "../../chunk-LFUJCRCT.js";
26
- import "../../chunk-WTJ3AY33.js";
27
- import "../../chunk-SLBL3WIP.js";
28
- import "../../chunk-4AAOOAIN.js";
29
- import "../../chunk-4UKMQUAU.js";
30
- import "../../chunk-JFLVEFFP.js";
31
- import "../../chunk-WNLF5EDZ.js";
32
- import "../../chunk-CMJBKQUH.js";
33
- import "../../chunk-C2UISKIM.js";
34
- import "../../chunk-NU2K5G54.js";
35
- import "../../chunk-AG3ZVM3B.js";
36
- import "../../chunk-OI2H6M5I.js";
37
- export {
38
- runWizardSession
39
- };
40
- //# sourceMappingURL=run-wizard-session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ScrollAffordance
4
- } from "../../chunk-7PYXS2QU.js";
5
- import "../../chunk-AG3ZVM3B.js";
6
- export {
7
- ScrollAffordance
8
- };
9
- //# sourceMappingURL=scroll-affordance.js.map