agents-inc 0.158.0 → 0.160.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 (149) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/{chunk-P6OKOH62.js → chunk-4APXK7ZY.js} +2 -2
  3. package/dist/{chunk-QNAMXQKF.js → chunk-4VVKVOOP.js} +2 -2
  4. package/dist/{chunk-DAUY2SB3.js → chunk-5K33RJ7Z.js} +70 -25
  5. package/dist/chunk-5K33RJ7Z.js.map +1 -0
  6. package/dist/{chunk-G6G2FT2G.js → chunk-5KB4I5J7.js} +2 -5
  7. package/dist/chunk-5KB4I5J7.js.map +1 -0
  8. package/dist/{chunk-2PN4QXON.js → chunk-6CP3CLDE.js} +5 -10
  9. package/dist/chunk-6CP3CLDE.js.map +1 -0
  10. package/dist/{chunk-TUXXBEBB.js → chunk-7JQPIMKD.js} +3 -3
  11. package/dist/{chunk-KUZBMEWR.js → chunk-AU5FS3QK.js} +3 -3
  12. package/dist/{chunk-WMVOJY6V.js → chunk-C5P7RUDR.js} +4 -4
  13. package/dist/{chunk-H4CL23HG.js → chunk-CICB4AKA.js} +3 -3
  14. package/dist/{chunk-KVVXINCJ.js → chunk-CWQLRKWB.js} +3 -3
  15. package/dist/{chunk-L4FHSOL5.js → chunk-DEWI5HDF.js} +5 -5
  16. package/dist/{chunk-JG3B47P3.js → chunk-EPBUWEW4.js} +8 -8
  17. package/dist/{chunk-EEAX7E2X.js → chunk-GWPKIXBM.js} +2 -2
  18. package/dist/{chunk-DP6YQFVO.js → chunk-IJ7GWQUR.js} +5 -5
  19. package/dist/{chunk-TZRXWFF5.js → chunk-ITEJARWI.js} +3 -3
  20. package/dist/{chunk-TPQ5M3BW.js → chunk-IWUFZ6NR.js} +3 -3
  21. package/dist/{chunk-PNRLBPGS.js → chunk-J7Q5VYR7.js} +12 -12
  22. package/dist/{chunk-4ABNXKAR.js → chunk-JQDN7KAZ.js} +2 -2
  23. package/dist/{chunk-Q7CAE5NN.js → chunk-K6MQV6SK.js} +3 -3
  24. package/dist/{chunk-54QLV3OH.js → chunk-KCN5N3PB.js} +34 -6
  25. package/dist/chunk-KCN5N3PB.js.map +1 -0
  26. package/dist/{chunk-X52QUV4U.js → chunk-LJ6V54NR.js} +5 -5
  27. package/dist/{chunk-H25VRR2T.js → chunk-LX7UXZBN.js} +6 -6
  28. package/dist/{chunk-VZRO7RYT.js → chunk-OI2H6M5I.js} +1 -103
  29. package/dist/chunk-OI2H6M5I.js.map +1 -0
  30. package/dist/{chunk-VTIDLRNA.js → chunk-OJIQOVWB.js} +2 -2
  31. package/dist/{chunk-OQB2CKBT.js → chunk-OJR3ASZI.js} +7 -7
  32. package/dist/{chunk-3PJLLBUS.js → chunk-OUG6TCQ4.js} +220 -345
  33. package/dist/chunk-OUG6TCQ4.js.map +1 -0
  34. package/dist/{chunk-WCZNQECQ.js → chunk-PEHYVSJG.js} +2 -2
  35. package/dist/{chunk-6DBE562W.js → chunk-PIUCYRLP.js} +5 -15
  36. package/dist/chunk-PIUCYRLP.js.map +1 -0
  37. package/dist/{chunk-PZNXBORZ.js → chunk-PWPKZNCV.js} +4 -4
  38. package/dist/{chunk-SJ4T5YLG.js → chunk-Q2HB5SWU.js} +5 -5
  39. package/dist/{chunk-H2DHTJKW.js → chunk-RJ3JYZJ7.js} +9 -9
  40. package/dist/chunk-RJ3JYZJ7.js.map +1 -0
  41. package/dist/{chunk-DZD25NHW.js → chunk-SITF5EZM.js} +2 -2
  42. package/dist/{chunk-IK6YOXZH.js → chunk-SLB2SFTX.js} +4 -28
  43. package/dist/chunk-SLB2SFTX.js.map +1 -0
  44. package/dist/{chunk-LKI3ENGQ.js → chunk-VH6P7UGF.js} +4 -4
  45. package/dist/{chunk-3Q2N7CSY.js → chunk-VI4X5DN5.js} +6 -6
  46. package/dist/{chunk-YXI3BTQQ.js → chunk-X5PLVOJS.js} +2 -2
  47. package/dist/{chunk-XNYHMRVJ.js → chunk-XDNGMXOZ.js} +4 -4
  48. package/dist/{chunk-3NBXQSW2.js → chunk-XSULY25W.js} +6 -6
  49. package/dist/{chunk-7Z4N4JWQ.js → chunk-XX657S4U.js} +1 -103
  50. package/dist/chunk-XX657S4U.js.map +1 -0
  51. package/dist/{chunk-4DMFK67G.js → chunk-YKRPWZ3G.js} +2 -2
  52. package/dist/commands/build/marketplace.js +8 -8
  53. package/dist/commands/build/plugins.js +8 -8
  54. package/dist/commands/compile.js +11 -11
  55. package/dist/commands/doctor.js +13 -13
  56. package/dist/commands/doctor.js.map +1 -1
  57. package/dist/commands/edit.js +59 -68
  58. package/dist/commands/edit.js.map +1 -1
  59. package/dist/commands/eject.js +11 -11
  60. package/dist/commands/init.js +41 -37
  61. package/dist/commands/list.js +9 -9
  62. package/dist/commands/new/marketplace.js +8 -9
  63. package/dist/commands/new/marketplace.js.map +1 -1
  64. package/dist/commands/search.js +11 -11
  65. package/dist/commands/share.js +100 -16
  66. package/dist/commands/share.js.map +1 -1
  67. package/dist/commands/uninstall.js +12 -12
  68. package/dist/commands/update.js +7 -7
  69. package/dist/components/common/removal-plan-confirm.js +2 -2
  70. package/dist/components/common/select-list.js +2 -2
  71. package/dist/components/wizard/category-grid.js +4 -4
  72. package/dist/components/wizard/checkbox-grid.js +4 -4
  73. package/dist/components/wizard/domain-selection.js +10 -10
  74. package/dist/components/wizard/run-wizard-session.js +27 -27
  75. package/dist/components/wizard/scroll-affordance.js +2 -2
  76. package/dist/components/wizard/skill-agent-summary.js +6 -6
  77. package/dist/components/wizard/source-grid.js +5 -5
  78. package/dist/components/wizard/stack-selection.js +8 -8
  79. package/dist/components/wizard/step-agents.js +9 -9
  80. package/dist/components/wizard/step-build.js +8 -8
  81. package/dist/components/wizard/step-confirm.js +10 -10
  82. package/dist/components/wizard/step-sources.js +9 -9
  83. package/dist/components/wizard/step-stack.js +9 -9
  84. package/dist/components/wizard/summary-panel.js +9 -9
  85. package/dist/components/wizard/toast.js +2 -2
  86. package/dist/components/wizard/wizard-layout.js +13 -13
  87. package/dist/components/wizard/wizard-tabs.js +2 -2
  88. package/dist/components/wizard/wizard.js +26 -26
  89. package/dist/config-exports.js +1 -1
  90. package/dist/hooks/init.js +37 -37
  91. package/dist/load-agent-defs-KWHG7P7G.js +13 -0
  92. package/dist/recompile-project-agents-5FTDDHX7.js +17 -0
  93. package/dist/{source-loader-CO2FZ3OO.js → source-loader-CDYH2NIM.js} +5 -5
  94. package/dist/src/agents/_templates/methodologies/anti-over-engineering.liquid +14 -0
  95. package/dist/src/agents/_templates/methodologies/context-management.liquid +7 -154
  96. package/dist/src/agents/_templates/methodologies/investigation-requirements.liquid +12 -0
  97. package/dist/src/agents/_templates/methodologies/success-criteria.liquid +10 -0
  98. package/dist/stores/wizard-store.js +5 -5
  99. package/package.json +1 -1
  100. package/src/agents/_templates/methodologies/anti-over-engineering.liquid +14 -0
  101. package/src/agents/_templates/methodologies/context-management.liquid +7 -154
  102. package/src/agents/_templates/methodologies/investigation-requirements.liquid +12 -0
  103. package/src/agents/_templates/methodologies/success-criteria.liquid +10 -0
  104. package/src/schemas/project-source-config.schema.json +0 -3
  105. package/dist/chunk-2PN4QXON.js.map +0 -1
  106. package/dist/chunk-3PJLLBUS.js.map +0 -1
  107. package/dist/chunk-54QLV3OH.js.map +0 -1
  108. package/dist/chunk-6DBE562W.js.map +0 -1
  109. package/dist/chunk-7Z4N4JWQ.js.map +0 -1
  110. package/dist/chunk-DAUY2SB3.js.map +0 -1
  111. package/dist/chunk-G6G2FT2G.js.map +0 -1
  112. package/dist/chunk-H2DHTJKW.js.map +0 -1
  113. package/dist/chunk-IK6YOXZH.js.map +0 -1
  114. package/dist/chunk-VZRO7RYT.js.map +0 -1
  115. package/dist/load-agent-defs-2VYAV5GL.js +0 -13
  116. package/dist/recompile-project-agents-NG5DCPHJ.js +0 -17
  117. /package/dist/{chunk-P6OKOH62.js.map → chunk-4APXK7ZY.js.map} +0 -0
  118. /package/dist/{chunk-QNAMXQKF.js.map → chunk-4VVKVOOP.js.map} +0 -0
  119. /package/dist/{chunk-TUXXBEBB.js.map → chunk-7JQPIMKD.js.map} +0 -0
  120. /package/dist/{chunk-KUZBMEWR.js.map → chunk-AU5FS3QK.js.map} +0 -0
  121. /package/dist/{chunk-WMVOJY6V.js.map → chunk-C5P7RUDR.js.map} +0 -0
  122. /package/dist/{chunk-H4CL23HG.js.map → chunk-CICB4AKA.js.map} +0 -0
  123. /package/dist/{chunk-KVVXINCJ.js.map → chunk-CWQLRKWB.js.map} +0 -0
  124. /package/dist/{chunk-L4FHSOL5.js.map → chunk-DEWI5HDF.js.map} +0 -0
  125. /package/dist/{chunk-JG3B47P3.js.map → chunk-EPBUWEW4.js.map} +0 -0
  126. /package/dist/{chunk-EEAX7E2X.js.map → chunk-GWPKIXBM.js.map} +0 -0
  127. /package/dist/{chunk-DP6YQFVO.js.map → chunk-IJ7GWQUR.js.map} +0 -0
  128. /package/dist/{chunk-TZRXWFF5.js.map → chunk-ITEJARWI.js.map} +0 -0
  129. /package/dist/{chunk-TPQ5M3BW.js.map → chunk-IWUFZ6NR.js.map} +0 -0
  130. /package/dist/{chunk-PNRLBPGS.js.map → chunk-J7Q5VYR7.js.map} +0 -0
  131. /package/dist/{chunk-4ABNXKAR.js.map → chunk-JQDN7KAZ.js.map} +0 -0
  132. /package/dist/{chunk-Q7CAE5NN.js.map → chunk-K6MQV6SK.js.map} +0 -0
  133. /package/dist/{chunk-X52QUV4U.js.map → chunk-LJ6V54NR.js.map} +0 -0
  134. /package/dist/{chunk-H25VRR2T.js.map → chunk-LX7UXZBN.js.map} +0 -0
  135. /package/dist/{chunk-VTIDLRNA.js.map → chunk-OJIQOVWB.js.map} +0 -0
  136. /package/dist/{chunk-OQB2CKBT.js.map → chunk-OJR3ASZI.js.map} +0 -0
  137. /package/dist/{chunk-WCZNQECQ.js.map → chunk-PEHYVSJG.js.map} +0 -0
  138. /package/dist/{chunk-PZNXBORZ.js.map → chunk-PWPKZNCV.js.map} +0 -0
  139. /package/dist/{chunk-SJ4T5YLG.js.map → chunk-Q2HB5SWU.js.map} +0 -0
  140. /package/dist/{chunk-DZD25NHW.js.map → chunk-SITF5EZM.js.map} +0 -0
  141. /package/dist/{chunk-LKI3ENGQ.js.map → chunk-VH6P7UGF.js.map} +0 -0
  142. /package/dist/{chunk-3Q2N7CSY.js.map → chunk-VI4X5DN5.js.map} +0 -0
  143. /package/dist/{chunk-YXI3BTQQ.js.map → chunk-X5PLVOJS.js.map} +0 -0
  144. /package/dist/{chunk-XNYHMRVJ.js.map → chunk-XDNGMXOZ.js.map} +0 -0
  145. /package/dist/{chunk-3NBXQSW2.js.map → chunk-XSULY25W.js.map} +0 -0
  146. /package/dist/{chunk-4DMFK67G.js.map → chunk-YKRPWZ3G.js.map} +0 -0
  147. /package/dist/{load-agent-defs-2VYAV5GL.js.map → load-agent-defs-KWHG7P7G.js.map} +0 -0
  148. /package/dist/{recompile-project-agents-NG5DCPHJ.js.map → recompile-project-agents-5FTDDHX7.js.map} +0 -0
  149. /package/dist/{source-loader-CO2FZ3OO.js.map → source-loader-CDYH2NIM.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/category-grid.tsx","../src/cli/components/hooks/use-category-grid-input.ts"],"sourcesContent":["import React, { useCallback, useEffect } from \"react\";\n\nimport { Box, Text } from \"ink\";\n\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { getSkillById } from \"../../lib/matrix/matrix-provider.js\";\nimport type { Category, OptionState, SkillId, SkillScope } from \"../../types/index.js\";\nimport { useCategoryGridInput } from \"../hooks/use-category-grid-input.js\";\nimport { useFocusedListItem } from \"../hooks/use-focused-list-item.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\n\nexport type CategoryOption = {\n id: SkillId;\n state: OptionState;\n selected: boolean;\n local?: boolean;\n installed?: boolean;\n scope?: SkillScope;\n /** Secondary scope badge shown alongside primary (e.g. after G->P toggle, excluded tombstone) */\n secondaryScope?: SkillScope;\n source?: string;\n /** True when selected but has unmet dependency requirements (shown dimmed) */\n hasUnmetRequirements?: boolean;\n /** Explains unmet requirements (shown in label when D pressed) */\n unmetRequirementsReason?: string;\n /** Display name of the skill that requires this one (e.g. \"Next.js\") */\n requiredBy?: string;\n};\n\nexport type CategoryRow = {\n id: Category;\n displayName: string;\n exclusive: boolean;\n options: CategoryOption[];\n};\n\nexport type CategoryGridProps = {\n categories: CategoryRow[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n showLabels: boolean;\n onToggle: (categoryId: Category, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n /** Optional initial focus row (default: 0). Use with React `key` to reset. */\n defaultFocusedRow?: number;\n /** Optional initial focus col (default: 0). Use with React `key` to reset. */\n defaultFocusedCol?: number;\n /** Optional callback fired whenever the focused position changes */\n onFocusChange?: (row: number, col: number) => void;\n /** Optional callback fired with the resolved SkillId of the focused cell */\n onFocusedSkillChange?: (skillId: SkillId | null) => void;\n};\n\n/** Next option index stepping cyclically from `currentIndex`; empty rows stay put. */\nconst wrapOptionIndex = (length: number, currentIndex: number, direction: 1 | -1): number => {\n if (length === 0) return currentIndex;\n return (currentIndex + direction + length) % length;\n};\n\ntype SkillTagProps = {\n option: CategoryOption;\n isFocused: boolean;\n showLabels: boolean;\n};\n\n/**\n * The verdict word and the reason behind it — `(incompatible: conflicts with Vue\n * Composition Api)`. Every advisory state but `normal` carries a reason, so the\n * status discriminant narrows to the two that have one to state.\n *\n * The word leads rather than the reason: it is the only carrier of the verdict\n * once colour is off, a `discourages` rule's reason is free-form author prose\n * that need not identify itself as a discouragement, and `CELL_ANNOTATION` in\n * `e2e/pages/steps/build-step.ts` anchors cell-label parsing on that keyword.\n *\n * Nothing is elided. A long reason grows the tag and wraps inside its border,\n * which is what `unmetRequirementsReason` above already does.\n */\nconst advisoryAnnotation = (state: OptionState): string | null =>\n state.status === \"normal\" ? null : `(${state.status}: ${state.reason})`;\n\nconst getCompatibilityLabel = (option: CategoryOption): string | null => {\n if (option.selected && option.hasUnmetRequirements && option.unmetRequirementsReason) {\n return `(${option.unmetRequirementsReason})`;\n }\n if (option.selected) return null;\n if (option.requiredBy) return `(required by ${option.requiredBy})`;\n return advisoryAnnotation(option.state);\n};\n\nconst STATUS_COLORS: Partial<Record<OptionState[\"status\"], string>> = {\n incompatible: CLI_COLORS.ERROR,\n discouraged: CLI_COLORS.WARNING,\n};\n\n/** Selected wins, then advisory status; `fallback` covers the plain \"normal\" state. */\nfunction resolveTagColor(option: CategoryOption, fallback: string): string {\n if (option.selected) return CLI_COLORS.PRIMARY;\n return STATUS_COLORS[option.state.status] ?? fallback;\n}\n\nconst SkillTag: React.FC<SkillTagProps> = ({ option, isFocused, showLabels }) => {\n const textColor = resolveTagColor(option, CLI_COLORS.DIM);\n const hasRequiredBy = option.selected && !!option.requiredBy;\n const hasUnmetDeps = option.selected && !!option.hasUnmetRequirements;\n const isDimmed = hasUnmetDeps || hasRequiredBy;\n const showCompatibility = hasRequiredBy || hasUnmetDeps || (showLabels && isFocused);\n const compatibilityLabel = showCompatibility ? getCompatibilityLabel(option) : null;\n\n return (\n <Box\n marginRight={1}\n borderColor={isFocused ? resolveTagColor(option, CLI_COLORS.UNFOCUSED) : textColor}\n borderDimColor={!isFocused}\n borderStyle=\"single\"\n flexShrink={0}\n paddingLeft={1}\n flexDirection=\"row\"\n >\n <>\n {option.scope && (\n <>\n {[option.scope, option.secondaryScope].filter(Boolean).map((badgeScope, i) => (\n <Text key={i} color={CLI_COLORS.WARNING} backgroundColor={CLI_COLORS.LABEL_BG}>\n {badgeScope === \"global\" ? \" G \" : \" P \"}\n </Text>\n ))}\n <Text> </Text>\n </>\n )}\n <Text color={textColor} bold dimColor={isDimmed}>\n {getSkillById(option.id).displayName}{\" \"}\n </Text>\n {compatibilityLabel && (\n <Text color={textColor} dimColor>\n {compatibilityLabel}{\" \"}\n </Text>\n )}\n </>\n </Box>\n );\n};\n\ntype CategorySectionProps = {\n isFirst: boolean;\n category: CategoryRow;\n isFocused: boolean;\n focusedOptionIndex: number;\n showLabels: boolean;\n};\n\nconst CategorySection: React.FC<CategorySectionProps> = ({\n isFirst,\n category,\n isFocused,\n focusedOptionIndex,\n showLabels,\n}) => {\n const { options } = category;\n const selectedCount = options.filter((o) => o.selected).length;\n\n const selectionCounter = category.exclusive ? `(${selectedCount} of 1)` : null;\n\n return (\n <Box flexDirection=\"column\" marginTop={isFirst ? 0 : 1}>\n <Box flexDirection=\"row\">\n {isFocused ? (\n <Text color={CLI_COLORS.WHITE} backgroundColor={CLI_COLORS.LABEL_BG}>\n {` ${category.displayName}${selectionCounter ? ` ${selectionCounter}` : \"\"} `}\n </Text>\n ) : (\n <>\n <Text color={CLI_COLORS.NEUTRAL}>{category.displayName}</Text>\n {selectionCounter && <Text dimColor> {selectionCounter}</Text>}\n </>\n )}\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {options.map((option, index) => (\n <SkillTag\n key={option.id}\n option={option}\n isFocused={isFocused && index === focusedOptionIndex}\n showLabels={showLabels}\n />\n ))}\n </Box>\n </Box>\n );\n};\n\nexport const CategoryGrid: React.FC<CategoryGridProps> = ({\n categories,\n availableHeight = 0,\n showLabels,\n onToggle,\n onToggleLabels,\n defaultFocusedRow = 0,\n defaultFocusedCol = 0,\n onFocusChange,\n onFocusedSkillChange,\n}) => {\n const getColCount = useCallback(\n (row: number): number => categories[row]?.options.length ?? 0,\n [categories],\n );\n\n const findValidCol = useCallback(\n (row: number, currentCol: number, direction: 1 | -1): number =>\n wrapOptionIndex(categories[row]?.options.length ?? 0, currentCol, direction),\n [categories],\n );\n\n const handleFocusChange = useCallback(\n (row: number, col: number) => {\n if (showLabels) onToggleLabels();\n onFocusChange?.(row, col);\n },\n [showLabels, onToggleLabels, onFocusChange],\n );\n\n const { focusedRow, focusedCol, setFocused, moveFocus } = useFocusedListItem(\n categories.length,\n getColCount,\n {\n wrap: true,\n findValidCol,\n onChange: handleFocusChange,\n initialRow: defaultFocusedRow,\n initialCol: defaultFocusedCol,\n },\n );\n\n useCategoryGridInput({\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n });\n\n // Report the focused cell's skill on mount and whenever it changes — including\n // category reshapes that shift the cell without a navigation event. useFocusedListItem\n // only fires onChange during navigation, so the initially highlighted cell would\n // otherwise never reach the store, leaving focusedSkillId out of sync with the visual\n // focus and making the `s` scope hotkey no-op until the first arrow key.\n const focusedSkillId = categories[focusedRow]?.options[focusedCol]?.id ?? null;\n useEffect(() => {\n onFocusedSkillChange?.(focusedSkillId);\n }, [focusedSkillId, onFocusedSkillChange]);\n\n // `hiddenAbove` / `hiddenBelow` are discarded ON PURPOSE — the build grid has\n // no `ScrollAffordance` and is not getting one (owner decision). On a grid\n // this dense a half-cut card already says \"there is more\"; a counted hint\n // would be noise, and it would cost the viewport a row to say what the\n // clipped card says for free. Do not add one on the strength of the counts\n // merely being available here.\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: categories.length,\n focusedIndex: focusedRow,\n availableHeight,\n });\n\n if (categories.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No categories to display.</Text>\n </Box>\n );\n }\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = categories.map((category, index) => (\n <Box key={category.id} ref={(el) => setSectionRef(index, el)} {...noShrink}>\n <CategorySection\n category={category}\n isFocused={index === focusedRow}\n focusedOptionIndex={focusedCol}\n showLabels={showLabels}\n isFirst={index === 0}\n />\n </Box>\n ));\n\n return (\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled\n ? { height: availableHeight, overflow: \"hidden\" as const }\n : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n </Box>\n </Box>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useInput, type Key } from \"ink\";\n\nimport type { Category, SkillId } from \"../../types/index.js\";\nimport type { CategoryRow } from \"../wizard/category-grid.js\";\nimport type { Direction } from \"./use-focused-list-item.js\";\nimport { HOTKEY_TOGGLE_LABELS, KEY_SPACE, isHotkey } from \"../wizard/hotkeys.js\";\n\n/** Find next section index (wrapping forward) */\nconst findNextIndex = (items: { length: number }, currentIndex: number): number => {\n const length = items.length;\n if (length === 0) return currentIndex;\n return (currentIndex + 1) % length;\n};\n\ntype UseCategoryGridInputOptions = {\n categories: CategoryRow[];\n focusedRow: number;\n focusedCol: number;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: Direction) => void;\n onToggle: (categoryId: Category, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n};\n\nexport function useCategoryGridInput({\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n}: UseCategoryGridInputOptions): void {\n const currentRow = categories[focusedRow];\n // Memoised so the effect below keys on the row actually changing — the `[]`\n // fallback used to be a fresh array every render, re-running the effect for\n // nothing whenever no row was focused.\n const currentOptions = useMemo(() => currentRow?.options ?? [], [currentRow]);\n\n // Adjust column when current row's options change externally (e.g. option becomes disabled)\n useEffect(() => {\n if (!currentRow) return;\n\n const maxCol = currentOptions.length - 1;\n if (focusedCol > maxCol) {\n const newCol = Math.max(0, maxCol);\n setFocused(focusedRow, newCol);\n }\n }, [focusedRow, currentOptions, focusedCol, setFocused, currentRow]);\n\n // Store the latest handler in a ref so that the useInput effect never needs to\n // re-register on the event emitter. This avoids a stale-closure race condition\n // where, after a domain switch (CategoryGrid remount via key={activeDomain}),\n // the useInput effect may not yet have re-registered the updated handler when\n // the first keypress arrives — causing the first space press to be silently lost.\n const handlerRef = useRef<((input: string, key: Key) => void) | null>(null);\n handlerRef.current = (input: string, key: Key) => {\n if (key.tab && key.shift) {\n onToggleLabels();\n return;\n }\n\n if (key.tab && !key.shift) {\n const nextSection = findNextIndex(categories, focusedRow);\n if (nextSection !== focusedRow) {\n setFocused(nextSection, 0);\n }\n return;\n }\n\n if (isHotkey(input, HOTKEY_TOGGLE_LABELS)) {\n onToggleLabels();\n return;\n }\n\n if (input === KEY_SPACE) {\n const currentOption = currentOptions[focusedCol];\n if (currentRow && currentOption) {\n onToggle(currentRow.id, currentOption.id);\n }\n return;\n }\n\n const isLeft = key.leftArrow || input === \"h\";\n const isRight = key.rightArrow || input === \"l\";\n const isUp = key.upArrow || input === \"k\";\n const isDown = key.downArrow || input === \"j\";\n\n if (isLeft) {\n moveFocus(\"left\");\n } else if (isRight) {\n moveFocus(\"right\");\n } else if (isUp) {\n moveFocus(\"up\");\n } else if (isDown) {\n moveFocus(\"down\");\n }\n };\n\n // Stable handler reference — never changes, so useInput's effect registers once\n const stableHandler = useCallback((input: string, key: Key) => {\n handlerRef.current?.(input, key);\n }, []);\n\n useInput(stableHandler);\n}\n"],"mappings":"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","names":["useCallback","useEffect","useCallback","useEffect"]}
@@ -6,14 +6,14 @@ import {
6
6
  verbose,
7
7
  warn,
8
8
  writeFile
9
- } from "./chunk-3PJLLBUS.js";
9
+ } from "./chunk-OUG6TCQ4.js";
10
10
  import {
11
11
  DEFAULT_PUBLIC_SOURCE_NAME,
12
12
  DEFAULT_VERSION,
13
13
  PLUGIN_MANIFEST_DIR,
14
14
  PLUGIN_MANIFEST_FILE,
15
15
  PUBLIC_CATALOGUE_PACKAGE
16
- } from "./chunk-G6G2FT2G.js";
16
+ } from "./chunk-5KB4I5J7.js";
17
17
 
18
18
  // src/cli/lib/marketplace-generator.ts
19
19
  import path from "path";
@@ -127,4 +127,4 @@ export {
127
127
  writeMarketplace,
128
128
  getMarketplaceStats
129
129
  };
130
- //# sourceMappingURL=chunk-TUXXBEBB.js.map
130
+ //# sourceMappingURL=chunk-7JQPIMKD.js.map
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  useRowScroll
4
- } from "./chunk-TZRXWFF5.js";
4
+ } from "./chunk-ITEJARWI.js";
5
5
  import {
6
6
  KEY_SPACE
7
7
  } from "./chunk-WTJ3AY33.js";
8
8
  import {
9
9
  CLI_COLORS,
10
10
  UI_SYMBOLS
11
- } from "./chunk-G6G2FT2G.js";
11
+ } from "./chunk-5KB4I5J7.js";
12
12
 
13
13
  // src/cli/components/wizard/checkbox-grid.tsx
14
14
  import { Box, Text, useInput } from "ink";
@@ -108,4 +108,4 @@ var CheckboxGrid = ({
108
108
  export {
109
109
  CheckboxGrid
110
110
  };
111
- //# sourceMappingURL=chunk-KUZBMEWR.js.map
111
+ //# sourceMappingURL=chunk-AU5FS3QK.js.map
@@ -34,12 +34,12 @@ import {
34
34
  writeContentHash,
35
35
  writeFile,
36
36
  writePluginManifest
37
- } from "./chunk-3PJLLBUS.js";
37
+ } from "./chunk-OUG6TCQ4.js";
38
38
  import {
39
39
  typedEntries,
40
40
  typedFromEntries,
41
41
  typedKeys
42
- } from "./chunk-7Z4N4JWQ.js";
42
+ } from "./chunk-XX657S4U.js";
43
43
  import {
44
44
  CLAUDE_DIR,
45
45
  CLAUDE_SRC_DIR,
@@ -49,7 +49,7 @@ import {
49
49
  PROJECT_ROOT,
50
50
  STANDARD_DIRS,
51
51
  STANDARD_FILES
52
- } from "./chunk-G6G2FT2G.js";
52
+ } from "./chunk-5KB4I5J7.js";
53
53
 
54
54
  // src/cli/lib/agents/list-compiled-agents.ts
55
55
  import path2 from "path";
@@ -565,4 +565,4 @@ export {
565
565
  compileAllAgentPlugins,
566
566
  printAgentCompilationSummary
567
567
  };
568
- //# sourceMappingURL=chunk-WMVOJY6V.js.map
568
+ //# sourceMappingURL=chunk-C5P7RUDR.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getAgentDefinitions
4
- } from "./chunk-WMVOJY6V.js";
4
+ } from "./chunk-C5P7RUDR.js";
5
5
  import {
6
6
  loadMergedAgents
7
- } from "./chunk-3PJLLBUS.js";
7
+ } from "./chunk-OUG6TCQ4.js";
8
8
 
9
9
  // src/cli/lib/operations/project/load-agent-defs.ts
10
10
  async function loadAgentDefs() {
@@ -20,4 +20,4 @@ async function loadAgentDefs() {
20
20
  export {
21
21
  loadAgentDefs
22
22
  };
23
- //# sourceMappingURL=chunk-H4CL23HG.js.map
23
+ //# sourceMappingURL=chunk-CICB4AKA.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  isDomain
4
- } from "./chunk-3PJLLBUS.js";
4
+ } from "./chunk-OUG6TCQ4.js";
5
5
  import {
6
6
  findStack
7
- } from "./chunk-7Z4N4JWQ.js";
7
+ } from "./chunk-XX657S4U.js";
8
8
 
9
9
  // src/cli/components/wizard/utils.ts
10
10
  var DOMAIN_DISPLAY_NAMES = {
@@ -32,4 +32,4 @@ export {
32
32
  getDomainDisplayName,
33
33
  getStackName
34
34
  };
35
- //# sourceMappingURL=chunk-KVVXINCJ.js.map
35
+ //# sourceMappingURL=chunk-CWQLRKWB.js.map
@@ -7,19 +7,19 @@ import {
7
7
  } from "./chunk-XVAQG2CV.js";
8
8
  import {
9
9
  useRowScroll
10
- } from "./chunk-TZRXWFF5.js";
10
+ } from "./chunk-ITEJARWI.js";
11
11
  import {
12
12
  showWarningsAsToast,
13
13
  useWizardStore
14
- } from "./chunk-IK6YOXZH.js";
14
+ } from "./chunk-SLB2SFTX.js";
15
15
  import {
16
16
  matrix,
17
17
  typedKeys
18
- } from "./chunk-7Z4N4JWQ.js";
18
+ } from "./chunk-XX657S4U.js";
19
19
  import {
20
20
  CLI_COLORS,
21
21
  UI_SYMBOLS
22
- } from "./chunk-G6G2FT2G.js";
22
+ } from "./chunk-5KB4I5J7.js";
23
23
 
24
24
  // src/cli/components/wizard/stack-selection.tsx
25
25
  import { groupBy } from "remeda";
@@ -194,4 +194,4 @@ var StackSelection = ({ onCancel }) => {
194
194
  export {
195
195
  StackSelection
196
196
  };
197
- //# sourceMappingURL=chunk-L4FHSOL5.js.map
197
+ //# sourceMappingURL=chunk-DEWI5HDF.js.map
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SummaryPanel
4
- } from "./chunk-3Q2N7CSY.js";
4
+ } from "./chunk-VI4X5DN5.js";
5
5
  import {
6
6
  Toast
7
- } from "./chunk-DZD25NHW.js";
7
+ } from "./chunk-SITF5EZM.js";
8
8
  import {
9
9
  WizardTabs,
10
10
  wizardTabsFor
11
- } from "./chunk-P6OKOH62.js";
11
+ } from "./chunk-4APXK7ZY.js";
12
12
  import {
13
13
  getDomainDisplayName,
14
14
  getStackName
15
- } from "./chunk-KVVXINCJ.js";
15
+ } from "./chunk-CWQLRKWB.js";
16
16
  import {
17
17
  HOTKEY_INFO,
18
18
  HOTKEY_SCOPE,
@@ -26,16 +26,16 @@ import {
26
26
  getActiveStepFlow,
27
27
  orderDomains,
28
28
  useWizardStore
29
- } from "./chunk-IK6YOXZH.js";
29
+ } from "./chunk-SLB2SFTX.js";
30
30
  import {
31
31
  formatTerminalTooSmallMessage,
32
32
  isTerminalLargeEnough
33
- } from "./chunk-QNAMXQKF.js";
33
+ } from "./chunk-4VVKVOOP.js";
34
34
  import {
35
35
  CLI_COLORS,
36
36
  FALLBACK_DOMAIN,
37
37
  LOGO_MIN_TERMINAL_ROWS
38
- } from "./chunk-G6G2FT2G.js";
38
+ } from "./chunk-5KB4I5J7.js";
39
39
 
40
40
  // src/cli/components/wizard/wizard-layout.tsx
41
41
  import { Box, Text } from "ink";
@@ -234,4 +234,4 @@ export {
234
234
  useTerminalDimensions,
235
235
  WizardLayout
236
236
  };
237
- //# sourceMappingURL=chunk-JG3B47P3.js.map
237
+ //# sourceMappingURL=chunk-EPBUWEW4.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "./chunk-L4FHSOL5.js";
4
+ } from "./chunk-DEWI5HDF.js";
5
5
 
6
6
  // src/cli/components/wizard/step-stack.tsx
7
7
  import { Box } from "ink";
@@ -14,4 +14,4 @@ var StepStack = ({ onCancel }) => {
14
14
  export {
15
15
  StepStack
16
16
  };
17
- //# sourceMappingURL=chunk-EEAX7E2X.js.map
17
+ //# sourceMappingURL=chunk-GWPKIXBM.js.map
@@ -3,7 +3,7 @@ import {
3
3
  SEED_API_URL,
4
4
  SEED_USER_AGENT,
5
5
  readCarriedSkills
6
- } from "./chunk-LKI3ENGQ.js";
6
+ } from "./chunk-VH6P7UGF.js";
7
7
  import {
8
8
  ERROR_MESSAGES,
9
9
  MATRIX_VERSION,
@@ -16,15 +16,15 @@ import {
16
16
  readForkedFromMetadata,
17
17
  resolveInstallPaths,
18
18
  seedModelSchema
19
- } from "./chunk-3PJLLBUS.js";
19
+ } from "./chunk-OUG6TCQ4.js";
20
20
  import {
21
21
  typedEntries,
22
22
  typedValues
23
- } from "./chunk-7Z4N4JWQ.js";
23
+ } from "./chunk-XX657S4U.js";
24
24
  import {
25
25
  DEFAULT_PUBLIC_SOURCE_NAME,
26
26
  EJECT_SOURCE
27
- } from "./chunk-G6G2FT2G.js";
27
+ } from "./chunk-5KB4I5J7.js";
28
28
 
29
29
  // src/cli/lib/seed/installation-payload.ts
30
30
  import path from "path";
@@ -244,4 +244,4 @@ export {
244
244
  skillsAuthoredHere,
245
245
  publishSeedConfig
246
246
  };
247
- //# sourceMappingURL=chunk-DP6YQFVO.js.map
247
+ //# sourceMappingURL=chunk-IJ7GWQUR.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  computeRowScrollTop
4
- } from "./chunk-WCZNQECQ.js";
4
+ } from "./chunk-PEHYVSJG.js";
5
5
  import {
6
6
  SCROLL_VIEWPORT
7
- } from "./chunk-G6G2FT2G.js";
7
+ } from "./chunk-5KB4I5J7.js";
8
8
 
9
9
  // src/cli/components/hooks/use-row-scroll.ts
10
10
  import { useRef } from "react";
@@ -24,4 +24,4 @@ function useRowScroll({
24
24
  export {
25
25
  useRowScroll
26
26
  };
27
- //# sourceMappingURL=chunk-TZRXWFF5.js.map
27
+ //# sourceMappingURL=chunk-ITEJARWI.js.map
@@ -5,11 +5,11 @@ import {
5
5
  getErrorMessage,
6
6
  isLocalOnlySkill,
7
7
  toClaudePluginScope
8
- } from "./chunk-3PJLLBUS.js";
8
+ } from "./chunk-OUG6TCQ4.js";
9
9
  import {
10
10
  CLI_INVOKE_COMMAND,
11
11
  EJECT_SOURCE
12
- } from "./chunk-G6G2FT2G.js";
12
+ } from "./chunk-5KB4I5J7.js";
13
13
 
14
14
  // src/cli/lib/operations/skills/install-plugin-skills.ts
15
15
  function pluginInstallFailureError(failedCount) {
@@ -44,4 +44,4 @@ export {
44
44
  unbackedPluginInstallError,
45
45
  installPluginSkills
46
46
  };
47
- //# sourceMappingURL=chunk-TPQ5M3BW.js.map
47
+ //# sourceMappingURL=chunk-IWUFZ6NR.js.map
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepConfirm
4
- } from "./chunk-4ABNXKAR.js";
4
+ } from "./chunk-JQDN7KAZ.js";
5
5
  import {
6
6
  StepSources
7
- } from "./chunk-Q7CAE5NN.js";
7
+ } from "./chunk-K6MQV6SK.js";
8
8
  import {
9
9
  StepStack
10
- } from "./chunk-EEAX7E2X.js";
10
+ } from "./chunk-GWPKIXBM.js";
11
11
  import {
12
12
  WizardLayout
13
- } from "./chunk-JG3B47P3.js";
13
+ } from "./chunk-EPBUWEW4.js";
14
14
  import {
15
15
  DomainSelection
16
- } from "./chunk-3NBXQSW2.js";
16
+ } from "./chunk-XSULY25W.js";
17
17
  import {
18
18
  StepAgents
19
- } from "./chunk-OQB2CKBT.js";
19
+ } from "./chunk-OJR3ASZI.js";
20
20
  import {
21
21
  StepBuild
22
- } from "./chunk-6DBE562W.js";
22
+ } from "./chunk-PIUCYRLP.js";
23
23
  import {
24
24
  HOTKEY_ACCEPT_DEFAULTS,
25
25
  HOTKEY_INFO,
@@ -29,20 +29,20 @@ import {
29
29
  } from "./chunk-WTJ3AY33.js";
30
30
  import {
31
31
  useWizardStore
32
- } from "./chunk-IK6YOXZH.js";
32
+ } from "./chunk-SLB2SFTX.js";
33
33
  import {
34
34
  validateSelection
35
- } from "./chunk-3PJLLBUS.js";
35
+ } from "./chunk-OUG6TCQ4.js";
36
36
  import {
37
37
  findStack,
38
38
  getSkillById,
39
39
  matrix
40
- } from "./chunk-7Z4N4JWQ.js";
40
+ } from "./chunk-XX657S4U.js";
41
41
  import {
42
42
  CLI_COLORS,
43
43
  EJECT_SOURCE,
44
44
  FALLBACK_DOMAIN
45
- } from "./chunk-G6G2FT2G.js";
45
+ } from "./chunk-5KB4I5J7.js";
46
46
 
47
47
  // src/cli/components/wizard/wizard.tsx
48
48
  import { useCallback as useCallback2, useEffect } from "react";
@@ -313,4 +313,4 @@ export {
313
313
  resolveSelectedSkillIds,
314
314
  Wizard
315
315
  };
316
- //# sourceMappingURL=chunk-PNRLBPGS.js.map
316
+ //# sourceMappingURL=chunk-J7Q5VYR7.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SummaryPanel
4
- } from "./chunk-3Q2N7CSY.js";
4
+ } from "./chunk-VI4X5DN5.js";
5
5
 
6
6
  // src/cli/components/wizard/step-confirm.tsx
7
7
  import { useInput } from "ink";
@@ -22,4 +22,4 @@ var StepConfirm = ({ onComplete, onBack }) => {
22
22
  export {
23
23
  StepConfirm
24
24
  };
25
- //# sourceMappingURL=chunk-4ABNXKAR.js.map
25
+ //# sourceMappingURL=chunk-JQDN7KAZ.js.map
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  SourceGrid,
4
4
  isRowInert
5
- } from "./chunk-SJ4T5YLG.js";
5
+ } from "./chunk-Q2HB5SWU.js";
6
6
  import {
7
7
  useMeasuredHeight
8
8
  } from "./chunk-TSIU7DME.js";
9
9
  import {
10
10
  useWizardStore
11
- } from "./chunk-IK6YOXZH.js";
11
+ } from "./chunk-SLB2SFTX.js";
12
12
 
13
13
  // src/cli/components/wizard/step-sources.tsx
14
14
  import { Box, useInput } from "ink";
@@ -45,4 +45,4 @@ var StepSources = ({ onContinue, onBack }) => {
45
45
  export {
46
46
  StepSources
47
47
  };
48
- //# sourceMappingURL=chunk-Q7CAE5NN.js.map
48
+ //# sourceMappingURL=chunk-K6MQV6SK.js.map
@@ -1,19 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  orderDomains
4
- } from "./chunk-IK6YOXZH.js";
4
+ } from "./chunk-SLB2SFTX.js";
5
5
  import {
6
6
  AGENT_NAMES,
7
+ execCommand,
8
+ getErrorMessage,
7
9
  isScopePairCompatible,
8
10
  seedAgentScope,
9
11
  validateSelection
10
- } from "./chunk-3PJLLBUS.js";
12
+ } from "./chunk-OUG6TCQ4.js";
11
13
  import {
12
14
  getCategoryDomain
13
- } from "./chunk-7Z4N4JWQ.js";
15
+ } from "./chunk-XX657S4U.js";
14
16
  import {
15
17
  DEFAULT_PUBLIC_SOURCE_NAME
16
- } from "./chunk-G6G2FT2G.js";
18
+ } from "./chunk-5KB4I5J7.js";
17
19
 
18
20
  // src/cli/lib/seed/seed-to-wizard.ts
19
21
  var KNOWN_AGENTS = new Set(AGENT_NAMES);
@@ -135,7 +137,33 @@ function seedToWizardResult(payload, matrix) {
135
137
  };
136
138
  }
137
139
 
140
+ // src/cli/utils/open-url.ts
141
+ function browserOpenerCommand(platform, url) {
142
+ if (platform === "darwin") return { command: "open", args: [url] };
143
+ if (platform === "win32") return { command: "cmd", args: ["/c", "start", "", url] };
144
+ return { command: "xdg-open", args: [url] };
145
+ }
146
+ function openerRefusedMessage(command, exitCode) {
147
+ return `Could not open your browser \u2014 '${command}' exited ${exitCode}.`;
148
+ }
149
+ function openerUnavailableMessage(command, reason) {
150
+ return `Could not open your browser \u2014 '${command}' could not be run: ${reason}`;
151
+ }
152
+ async function openUrl(url) {
153
+ const { command, args } = browserOpenerCommand(process.platform, url);
154
+ try {
155
+ const result = await execCommand(command, args);
156
+ if (result.exitCode !== 0) {
157
+ return { ok: false, error: openerRefusedMessage(command, result.exitCode) };
158
+ }
159
+ return { ok: true };
160
+ } catch (error) {
161
+ return { ok: false, error: openerUnavailableMessage(command, getErrorMessage(error)) };
162
+ }
163
+ }
164
+
138
165
  export {
139
- seedToWizardResult
166
+ seedToWizardResult,
167
+ openUrl
140
168
  };
141
- //# sourceMappingURL=chunk-54QLV3OH.js.map
169
+ //# sourceMappingURL=chunk-KCN5N3PB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/seed/seed-to-wizard.ts","../src/cli/utils/open-url.ts"],"sourcesContent":["import { seedAgentScope } from \"@workspace/matrix\";\n\nimport { AGENT_NAMES } from \"../../types/agents.js\";\nimport { DEFAULT_PUBLIC_SOURCE_NAME } from \"../../consts.js\";\nimport { isScopePairCompatible } from \"../configuration/config-generator.js\";\nimport { getCategoryDomain } from \"../matrix/matrix-provider.js\";\nimport { validateSelection } from \"../matrix/matrix-resolver.js\";\nimport { orderDomains } from \"../wizard/domain-order.js\";\n\nimport type { WizardResultV2 } from \"../../components/wizard/wizard.js\";\nimport type { AgentName } from \"../../types/agents.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport type {\n Category,\n Domain,\n DomainSelections,\n MergedSkillsMatrix,\n ResolvedSkill,\n} from \"../../types/matrix.js\";\nimport type { SkillAssignment, SkillId } from \"../../types/skills.js\";\nimport type { StackAgentConfig } from \"../../types/stacks.js\";\nimport type { SeedAgent, SeedLoadState, SeedPayload } from \"@workspace/matrix/seed\";\n\nexport type SeedMapping = {\n result: WizardResultV2;\n /** Ids this matrix does not know. Reported, never fatal — see the decode policy. */\n skippedSkillIds: string[];\n skippedAgentNames: string[];\n};\n\nconst KNOWN_AGENTS = new Set<string>(AGENT_NAMES);\n\n/** A skill's primary source, or the default marketplace. Mirrors the wizard's own resolution. */\nfunction sourceForSkill(skill: ResolvedSkill | undefined): string {\n return skill?.availableSources?.find((s) => s.primary)?.name ?? DEFAULT_PUBLIC_SOURCE_NAME;\n}\n\nfunction addToDomainSelections(\n selections: DomainSelections,\n domain: Domain,\n category: Category,\n skillId: SkillId,\n): void {\n const categorySelections = (selections[domain] ??= {});\n const skillList = (categorySelections[category] ??= []);\n if (!skillList.includes(skillId)) skillList.push(skillId);\n}\n\n/**\n * The stack mirror of {@link addToDomainSelections}: one sub-agent's own category lists, appended\n * in payload order. A `(skill, sub-agent)` pair can only occur once — `skills` is keyed by id — so\n * there is nothing to de-duplicate here.\n */\nfunction addToAgentStack(\n stack: Partial<Record<AgentName, StackAgentConfig>>,\n agent: AgentName,\n category: Category,\n assignment: SkillAssignment,\n): void {\n const agentStack = (stack[agent] ??= {});\n const assignments = (agentStack[category] ??= []);\n assignments.push(assignment);\n}\n\n/** A load state is per `(skill, sub-agent)`; `preloaded` is the stack's word for the same thing. */\nfunction toSkillAssignment(skillId: SkillId, load: SeedLoadState): SkillAssignment {\n return { id: skillId, preloaded: load === \"preloaded\" };\n}\n\n/** The payload's `agents` map, split by what this catalog can do with each entry. */\ntype SeedAgentMap = {\n /** Known agents the map has something to say about, keyed by name. */\n known: Map<AgentName, SeedAgent>;\n /** Names explicitly switched off — dropped, and their assignment rows ignored with them. */\n switchedOff: Set<string>;\n /** Names this catalog does not know. Reported, never fatal — same policy as unknown skill ids. */\n unknown: string[];\n};\n\nfunction readAgentMap(agents: SeedPayload[\"agents\"]): SeedAgentMap {\n const known = new Map<AgentName, SeedAgent>();\n const switchedOff = new Set<string>();\n const unknown: string[] = [];\n\n for (const [name, entry] of Object.entries(agents)) {\n if (!KNOWN_AGENTS.has(name)) unknown.push(name);\n else if (entry.on === false) switchedOff.add(name);\n else known.set(name as AgentName, entry);\n }\n\n return { known, switchedOff, unknown };\n}\n\n/**\n * A sub-agent's own row. Model and effort ride along on the same terms as its scope — an absent\n * key means \"keep whatever the agent's metadata says\".\n */\nfunction agentScopeConfig(name: AgentName, entry: SeedAgent | undefined): AgentScopeConfig {\n return {\n name,\n scope: seedAgentScope(entry),\n ...(entry?.model !== undefined && { model: entry.model }),\n ...(entry?.effort !== undefined && { effort: entry.effort }),\n };\n}\n\n/** A `(skill, sub-agent)` assignment the config model has nowhere to write. */\ntype UnwritableAssignment = { skillId: SkillId; agent: AgentName };\n\n/**\n * Names every unwritable pair, not just the first: a sharer who fixes one only to be refused for\n * the next learns nothing the first message could not have told them. Both halves of each pair are\n * named because neither alone says what to change — the skill can move to global scope, or the\n * sub-agent can be pinned to the project, and only the sharer knows which they meant.\n */\nfunction unwritableAssignmentsError(assignments: UnwritableAssignment[]): string {\n return [\n \"This configuration cannot be installed: a project-scoped skill never reaches a sub-agent \" +\n \"that rests at global scope, so these assignments have nowhere to be written:\",\n ...assignments.map(({ skillId, agent }) => ` ${skillId} -> ${agent}`),\n \"Re-share it with each sub-agent above pinned to the project, or each skill above at global scope.\",\n ].join(\"\\n\");\n}\n\n/**\n * Turns a shared configuration into the shape the install pipeline already consumes, so\n * `init --from` reuses `writeProjectConfig` -> skill install -> `compileAgentsAllScopes`\n * unchanged rather than growing a second path that can drift from the wizard's.\n *\n * Unknown ids are skipped, never fatal. Payloads carry catalog slugs precisely so they survive\n * catalog churn: a config shared before a skill was renamed should still install everything else,\n * and failing the whole decode would make every rename retroactively break every shared id.\n *\n * A sub-agent reaches the roster two ways: named by a surviving skill's assignment, or switched on\n * in the `agents` map. The map is the only place a configuration can say anything about an agent\n * no skill mentions, which is what makes a bare (skill-less) agent shareable at all; it also\n * carries that agent's model and effort onto its `AgentScopeConfig`.\n *\n * The `assignments` map is per `(skill, sub-agent)` and carries a load state, so it decides three\n * things the wizard cannot express separately: which sub-agents are selected, which skills land in\n * each one's stack entry, and which of those preload. That is why the result carries an\n * `assignedStack` — the install pipeline's ownership rules broadcast every scope-compatible skill\n * to every selected agent, which would hand a bare sub-agent someone else's skills.\n *\n * An unwritable `(skill, sub-agent)` pair is the one thing here that IS fatal, and it is fatal for\n * the opposite reason to the skips: an unknown id is content this catalog does not have, while an\n * unwritable pair is content it has and cannot place. Because `assignedStack` replaces the derived\n * stack wholesale, no scope filter runs on these rows downstream — they reach the writers, which\n * put them in neither half of the split config and say nothing. Refusing at the decode is what\n * keeps a payload from installing as a quieter configuration than the one that was shared.\n */\nexport function seedToWizardResult(payload: SeedPayload, matrix: MergedSkillsMatrix): SeedMapping {\n const domainSelections: DomainSelections = {};\n const assignedStack: Partial<Record<AgentName, StackAgentConfig>> = {};\n const skills: SkillConfig[] = [];\n const skippedSkillIds: string[] = [];\n const unwritable: UnwritableAssignment[] = [];\n const agentNames = new Set<AgentName>();\n const agentMap = readAgentMap(payload.agents);\n const skippedAgentNames = new Set<string>(agentMap.unknown);\n\n for (const [skillId, entry] of Object.entries(payload.skills)) {\n const skill = matrix.skills[skillId as SkillId];\n const domain = skill?.category ? getCategoryDomain(skill.category) : undefined;\n\n if (!skill?.category || !domain) {\n skippedSkillIds.push(skillId);\n continue;\n }\n\n // Past the guard the matrix knows this id, and its category is a real one: the `local`\n // pseudo-category has no domain, so it left with the skips.\n const id = skillId as SkillId;\n const category = skill.category as Category;\n\n addToDomainSelections(domainSelections, domain, category, id);\n\n skills.push({\n id,\n scope: entry.scope,\n // \"eject\" is an origin in its own right; anything else names the marketplace it came from.\n origin: entry.install === \"eject\" ? \"eject\" : sourceForSkill(skill),\n });\n\n // Only assignments on skills that survived — an agent should not be switched on by a skill\n // this catalog cannot install.\n for (const [agentName, load] of Object.entries(entry.assignments)) {\n if (agentMap.switchedOff.has(agentName)) continue;\n if (!KNOWN_AGENTS.has(agentName)) {\n skippedAgentNames.add(agentName);\n continue;\n }\n\n const agent = agentName as AgentName;\n // Rows the decode was going to ignore anyway have already left, so what reaches here is a\n // pair the payload really asked for — and the config model's one rule about pairs applies.\n if (!isScopePairCompatible(entry.scope, seedAgentScope(agentMap.known.get(agent)))) {\n unwritable.push({ skillId: id, agent });\n continue;\n }\n\n agentNames.add(agent);\n // The assignment is the curation: this sub-agent holds this skill, at this load state, and\n // no sub-agent the payload did not name holds it at all.\n addToAgentStack(assignedStack, agent, category, toSkillAssignment(id, load));\n }\n }\n\n if (unwritable.length > 0) throw new Error(unwritableAssignmentsError(unwritable));\n\n // Bare agents: switched on by the map alone, with no skill to carry them in.\n for (const [name, entry] of agentMap.known) {\n if (entry.on === true) agentNames.add(name);\n }\n\n const selectedAgents = [...agentNames];\n\n return {\n result: {\n skills,\n selectedAgents,\n agentConfigs: selectedAgents.map((name) => agentScopeConfig(name, agentMap.known.get(name))),\n assignedStack,\n selectedStackId: payload.stackId,\n // Spread-conditional rather than passed through, because absent and present-holding-undefined\n // are different files on disk: a config describing itself with no key is not one describing\n // itself with an empty sentence, and the writer emits whichever key it is handed.\n ...(payload.description !== undefined && { description: payload.description }),\n domainSelections,\n selectedDomains: orderDomains(Object.keys(domainSelections) as Domain[]),\n // Nothing was dropped from a *saved config* — the skipped ids came off the wire and are\n // reported to the user directly, so there is no config removal to explain.\n unresolvableSkillIds: [],\n cancelled: false,\n // Revalidated here rather than taken on trust from the app that built the payload. That app\n // validated against ITS catalog; this one skips ids it does not know and carries its own\n // relationship rules, so a configuration that was consistent where it was authored can\n // arrive with a requirement genuinely unmet. Running the same validator the wizard runs\n // makes that this catalog's verdict on what it can install — reported through the spine\n // `init` already has, beside the skips that explain it — rather than a fault in what was\n // shared.\n validation: validateSelection(skills.map((skill) => skill.id)),\n },\n skippedSkillIds,\n skippedAgentNames: [...skippedAgentNames],\n };\n}\n","import { execCommand } from \"./exec.js\";\nimport { getErrorMessage } from \"./errors.js\";\n\n/** The shell-out one platform answers \"open this with whatever handles it\" with. */\nexport type OpenerCommand = { command: string; args: string[] };\n\n/**\n * Never a throw. A machine with no browser, no desktop session or no opener at all is a\n * legitimate place to run this CLI, so failing to open a link is something to say rather than\n * something to fail on — the same posture the seed boundaries take, and for the same reason:\n * the link is already printed by the time this runs, so nothing is lost by it not working.\n */\nexport type OpenUrlResult = { ok: true } | { ok: false; error: string };\n\n/**\n * The command a platform opens a link with.\n *\n * There is no dependency for this. All three are one-line shell-outs to something the operating\n * system already ships, and a package for it would be a fourth thing to keep current for no\n * behaviour this does not have.\n *\n * Windows goes through `cmd` because `start` is a shell builtin rather than a program, and the\n * empty string after it is its TITLE argument: without one, `start` reads the first quoted\n * argument it is given as the window title and opens nothing.\n */\nexport function browserOpenerCommand(platform: NodeJS.Platform, url: string): OpenerCommand {\n if (platform === \"darwin\") return { command: \"open\", args: [url] };\n if (platform === \"win32\") return { command: \"cmd\", args: [\"/c\", \"start\", \"\", url] };\n return { command: \"xdg-open\", args: [url] };\n}\n\nfunction openerRefusedMessage(command: string, exitCode: number): string {\n return `Could not open your browser — '${command}' exited ${exitCode}.`;\n}\n\nfunction openerUnavailableMessage(command: string, reason: string): string {\n return `Could not open your browser — '${command}' could not be run: ${reason}`;\n}\n\n/**\n * Hands a link to whatever this platform opens links with.\n *\n * The URL travels as its own argument rather than inside a command line: `execCommand` spawns\n * without a shell, so the argument vector is the whole of the injection guard — there is no\n * string for a link to break out of.\n */\nexport async function openUrl(url: string): Promise<OpenUrlResult> {\n const { command, args } = browserOpenerCommand(process.platform, url);\n\n try {\n const result = await execCommand(command, args);\n if (result.exitCode !== 0) {\n return { ok: false, error: openerRefusedMessage(command, result.exitCode) };\n }\n return { ok: true };\n } catch (error) {\n return { ok: false, error: openerUnavailableMessage(command, getErrorMessage(error)) };\n }\n}\n"],"mappings":"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","names":[]}
@@ -4,12 +4,12 @@ import {
4
4
  pluginInstallFailureError,
5
5
  unbackedPluginInstallError,
6
6
  unbackedPluginSkillIds
7
- } from "./chunk-TPQ5M3BW.js";
7
+ } from "./chunk-IWUFZ6NR.js";
8
8
  import {
9
9
  clearTerminalScreen,
10
10
  formatTerminalTooSmallMessage,
11
11
  isTerminalLargeEnough
12
- } from "./chunk-QNAMXQKF.js";
12
+ } from "./chunk-4VVKVOOP.js";
13
13
  import {
14
14
  STATUS_MESSAGES,
15
15
  claudePluginMarketplaceAdd,
@@ -34,12 +34,12 @@ import {
34
34
  skillMetadataUnusableDetail,
35
35
  verbose,
36
36
  warn
37
- } from "./chunk-3PJLLBUS.js";
37
+ } from "./chunk-OUG6TCQ4.js";
38
38
  import {
39
39
  CLI_COLORS,
40
40
  DEFAULT_BRANDING,
41
41
  MIN_TERMINAL_SIZE
42
- } from "./chunk-G6G2FT2G.js";
42
+ } from "./chunk-5KB4I5J7.js";
43
43
 
44
44
  // src/cli/lib/exit-codes.ts
45
45
  var EXIT_CODES = {
@@ -477,4 +477,4 @@ export {
477
477
  EXIT_CODES,
478
478
  BaseCommand
479
479
  };
480
- //# sourceMappingURL=chunk-X52QUV4U.js.map
480
+ //# sourceMappingURL=chunk-LJ6V54NR.js.map
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  loadAgentDefs
4
- } from "./chunk-H4CL23HG.js";
4
+ } from "./chunk-CICB4AKA.js";
5
5
  import {
6
6
  pruneStaleCompiledAgents,
7
7
  recompileAgents
8
- } from "./chunk-WMVOJY6V.js";
8
+ } from "./chunk-C5P7RUDR.js";
9
9
  import {
10
10
  buildAgentScopeMap,
11
11
  buildMarketplacePluginRef,
@@ -22,15 +22,15 @@ import {
22
22
  resolveInstallPaths,
23
23
  toClaudePluginScope,
24
24
  verbose
25
- } from "./chunk-3PJLLBUS.js";
25
+ } from "./chunk-OUG6TCQ4.js";
26
26
  import {
27
27
  typedEntries,
28
28
  typedKeys
29
- } from "./chunk-7Z4N4JWQ.js";
29
+ } from "./chunk-XX657S4U.js";
30
30
  import {
31
31
  LOCAL_SKILLS_PATH,
32
32
  globalInstallRoot
33
- } from "./chunk-G6G2FT2G.js";
33
+ } from "./chunk-5KB4I5J7.js";
34
34
 
35
35
  // src/cli/lib/operations/project/remove-compiled-agents.ts
36
36
  import path from "path";
@@ -252,4 +252,4 @@ export {
252
252
  recompileRegisteredProjectAgents,
253
253
  recompilePropagatedProjectAgents
254
254
  };
255
- //# sourceMappingURL=chunk-H25VRR2T.js.map
255
+ //# sourceMappingURL=chunk-LX7UXZBN.js.map