@agents-inc/cli 0.78.0 → 0.80.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 (166) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +2 -2
  3. package/dist/{chunk-XA7WF3BI.js → chunk-3C6AXGR7.js} +3 -3
  4. package/dist/{chunk-VDVLM3KB.js → chunk-3HWFTE3S.js} +8 -4
  5. package/dist/chunk-3HWFTE3S.js.map +1 -0
  6. package/dist/{chunk-7JQIMEUX.js → chunk-3SCIYMRK.js} +3 -3
  7. package/dist/{chunk-OOWNDQCG.js → chunk-3WDZKBCE.js} +6 -4
  8. package/dist/chunk-3WDZKBCE.js.map +1 -0
  9. package/dist/{chunk-FSK4TQX7.js → chunk-4R6I6A3U.js} +3225 -134
  10. package/dist/chunk-4R6I6A3U.js.map +1 -0
  11. package/dist/{chunk-MUCQ27HV.js → chunk-4R72372U.js} +2 -2
  12. package/dist/{chunk-Q755X6QF.js → chunk-4VFBRV76.js} +4 -4
  13. package/dist/{chunk-F4IZ3UAS.js → chunk-55AZIEK6.js} +4 -4
  14. package/dist/{chunk-XYPAOBBV.js → chunk-633YIZOU.js} +2 -2
  15. package/dist/{chunk-N2XGUAJU.js → chunk-6YJXWQCI.js} +2 -12
  16. package/dist/chunk-6YJXWQCI.js.map +1 -0
  17. package/dist/{chunk-32HX6UYI.js → chunk-BN73X3JN.js} +59 -2
  18. package/dist/chunk-BN73X3JN.js.map +1 -0
  19. package/dist/{chunk-B4C2S5LP.js → chunk-BORVYGIX.js} +17 -15
  20. package/dist/chunk-BORVYGIX.js.map +1 -0
  21. package/dist/{chunk-YFHVP3VA.js → chunk-F4VG5XWZ.js} +3 -3
  22. package/dist/{chunk-NKLNT7N7.js → chunk-H3NQGJMB.js} +2 -2
  23. package/dist/{chunk-QD3GQ2CH.js → chunk-II3ISVCE.js} +6 -5
  24. package/dist/chunk-II3ISVCE.js.map +1 -0
  25. package/dist/{chunk-FUWUCKES.js → chunk-LO4X32JC.js} +2 -2
  26. package/dist/{chunk-D4T3HHE7.js → chunk-MNJAF4K2.js} +2 -2
  27. package/dist/{chunk-KVRR4PEJ.js → chunk-NJCU7OC2.js} +5 -5
  28. package/dist/{chunk-U2KFFRRX.js → chunk-NZAJTLEK.js} +2 -2
  29. package/dist/{chunk-HANGA633.js → chunk-OBTC2FD7.js} +5 -5
  30. package/dist/chunk-OBTC2FD7.js.map +1 -0
  31. package/dist/{chunk-EO6KJI5D.js → chunk-PPBUSAKG.js} +913 -33
  32. package/dist/chunk-PPBUSAKG.js.map +1 -0
  33. package/dist/{chunk-OTMIGYBB.js → chunk-RTHAMTDE.js} +6 -6
  34. package/dist/{chunk-KQDGLEBF.js → chunk-TJXBRYM4.js} +10 -10
  35. package/dist/chunk-TJXBRYM4.js.map +1 -0
  36. package/dist/{chunk-7LBYURQR.js → chunk-TQ363UUH.js} +2 -2
  37. package/dist/{chunk-N34D3ROY.js → chunk-TXFQBYOX.js} +8 -5
  38. package/dist/chunk-TXFQBYOX.js.map +1 -0
  39. package/dist/{chunk-IFCASC6R.js → chunk-TZY7WNWO.js} +2 -2
  40. package/dist/{chunk-SJNUTUSJ.js → chunk-W6PIVGMH.js} +5 -5
  41. package/dist/{chunk-W46L2PXK.js → chunk-WZGROC5L.js} +2 -2
  42. package/dist/{chunk-OIHZ2YH3.js → chunk-XFL7EIM7.js} +7 -7
  43. package/dist/{chunk-7HGMFJ4Y.js → chunk-YDB5KXMG.js} +3 -3
  44. package/dist/commands/build/marketplace.js +4 -4
  45. package/dist/commands/build/plugins.js +8 -8
  46. package/dist/commands/build/stack.js +8 -8
  47. package/dist/commands/compile.js +8 -8
  48. package/dist/commands/config/index.js +8 -8
  49. package/dist/commands/config/path.js +7 -7
  50. package/dist/commands/config/show.js +8 -8
  51. package/dist/commands/diff.js +7 -7
  52. package/dist/commands/doctor.js +7 -7
  53. package/dist/commands/edit.js +23 -23
  54. package/dist/commands/eject.js +7 -7
  55. package/dist/commands/import/skill.js +7 -7
  56. package/dist/commands/info.js +7 -7
  57. package/dist/commands/init.js +23 -23
  58. package/dist/commands/list.js +7 -7
  59. package/dist/commands/new/agent.js +8 -8
  60. package/dist/commands/new/marketplace.js +9 -9
  61. package/dist/commands/new/skill.js +8 -8
  62. package/dist/commands/outdated.js +7 -7
  63. package/dist/commands/search.js +7 -7
  64. package/dist/commands/uninstall.js +7 -7
  65. package/dist/commands/update.js +8 -8
  66. package/dist/commands/validate.js +7 -7
  67. package/dist/components/wizard/category-grid.js +2 -2
  68. package/dist/components/wizard/category-grid.test.js +11 -11
  69. package/dist/components/wizard/domain-selection.js +9 -9
  70. package/dist/components/wizard/source-grid.js +2 -2
  71. package/dist/components/wizard/source-grid.test.js +11 -11
  72. package/dist/components/wizard/stack-selection.js +8 -8
  73. package/dist/components/wizard/step-agents.js +9 -9
  74. package/dist/components/wizard/step-agents.test.js +13 -13
  75. package/dist/components/wizard/step-agents.test.js.map +1 -1
  76. package/dist/components/wizard/step-build.js +9 -9
  77. package/dist/components/wizard/step-build.test.js +12 -12
  78. package/dist/components/wizard/step-confirm.js +4 -4
  79. package/dist/components/wizard/step-confirm.test.js +10 -10
  80. package/dist/components/wizard/step-settings.js +7 -7
  81. package/dist/components/wizard/step-settings.test.js +10 -10
  82. package/dist/components/wizard/step-sources.js +9 -9
  83. package/dist/components/wizard/step-sources.test.js +12 -12
  84. package/dist/components/wizard/step-stack.js +9 -12
  85. package/dist/components/wizard/step-stack.test.js +19 -111
  86. package/dist/components/wizard/step-stack.test.js.map +1 -1
  87. package/dist/components/wizard/wizard-layout.js +10 -10
  88. package/dist/components/wizard/wizard-tabs.js +1 -1
  89. package/dist/components/wizard/wizard-tabs.test.js +12 -23
  90. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  91. package/dist/components/wizard/wizard.js +21 -21
  92. package/dist/config-exports.js +1 -1
  93. package/dist/hooks/init.js +23 -23
  94. package/dist/{loader-JMOO2A7C.js → loader-LI3EM4VG.js} +4 -4
  95. package/dist/{source-loader-D3VIG3GM.js → source-loader-TPUCZELX.js} +7 -7
  96. package/dist/source-manager-PJ5APXX2.js +19 -0
  97. package/dist/src/agents/meta/agent-summoner/workflow.md +10 -10
  98. package/dist/src/agents/meta/convention-keeper/critical-reminders.md +17 -0
  99. package/dist/src/agents/meta/convention-keeper/critical-requirements.md +15 -0
  100. package/dist/src/agents/meta/convention-keeper/examples.md +71 -0
  101. package/dist/src/agents/meta/convention-keeper/intro.md +11 -0
  102. package/dist/src/agents/meta/convention-keeper/metadata.yaml +12 -0
  103. package/dist/src/agents/meta/convention-keeper/output-format.md +134 -0
  104. package/dist/src/agents/meta/convention-keeper/workflow.md +258 -0
  105. package/dist/src/agents/meta/{documentor → scribe}/metadata.yaml +2 -2
  106. package/{src/agents/meta/documentor → dist/src/agents/meta/scribe}/workflow.md +1 -1
  107. package/dist/src/agents/planning/web-pm/workflow.md +1 -1
  108. package/dist/stores/wizard-store.js +7 -7
  109. package/dist/stores/wizard-store.test.js +19 -13
  110. package/dist/stores/wizard-store.test.js.map +1 -1
  111. package/package.json +1 -1
  112. package/src/agents/meta/agent-summoner/workflow.md +10 -10
  113. package/src/agents/meta/convention-keeper/critical-reminders.md +17 -0
  114. package/src/agents/meta/convention-keeper/critical-requirements.md +15 -0
  115. package/src/agents/meta/convention-keeper/examples.md +71 -0
  116. package/src/agents/meta/convention-keeper/intro.md +11 -0
  117. package/src/agents/meta/convention-keeper/metadata.yaml +12 -0
  118. package/src/agents/meta/convention-keeper/output-format.md +134 -0
  119. package/src/agents/meta/convention-keeper/workflow.md +258 -0
  120. package/src/agents/meta/{documentor → scribe}/metadata.yaml +2 -2
  121. package/{dist/src/agents/meta/documentor → src/agents/meta/scribe}/workflow.md +1 -1
  122. package/src/agents/planning/web-pm/workflow.md +1 -1
  123. package/dist/chunk-32HX6UYI.js.map +0 -1
  124. package/dist/chunk-B4C2S5LP.js.map +0 -1
  125. package/dist/chunk-EO6KJI5D.js.map +0 -1
  126. package/dist/chunk-FSK4TQX7.js.map +0 -1
  127. package/dist/chunk-HANGA633.js.map +0 -1
  128. package/dist/chunk-KQDGLEBF.js.map +0 -1
  129. package/dist/chunk-N2XGUAJU.js.map +0 -1
  130. package/dist/chunk-N34D3ROY.js.map +0 -1
  131. package/dist/chunk-OOWNDQCG.js.map +0 -1
  132. package/dist/chunk-QD3GQ2CH.js.map +0 -1
  133. package/dist/chunk-VDVLM3KB.js.map +0 -1
  134. package/dist/source-manager-FPYFJRR7.js +0 -19
  135. /package/dist/{chunk-XA7WF3BI.js.map → chunk-3C6AXGR7.js.map} +0 -0
  136. /package/dist/{chunk-7JQIMEUX.js.map → chunk-3SCIYMRK.js.map} +0 -0
  137. /package/dist/{chunk-MUCQ27HV.js.map → chunk-4R72372U.js.map} +0 -0
  138. /package/dist/{chunk-Q755X6QF.js.map → chunk-4VFBRV76.js.map} +0 -0
  139. /package/dist/{chunk-F4IZ3UAS.js.map → chunk-55AZIEK6.js.map} +0 -0
  140. /package/dist/{chunk-XYPAOBBV.js.map → chunk-633YIZOU.js.map} +0 -0
  141. /package/dist/{chunk-YFHVP3VA.js.map → chunk-F4VG5XWZ.js.map} +0 -0
  142. /package/dist/{chunk-NKLNT7N7.js.map → chunk-H3NQGJMB.js.map} +0 -0
  143. /package/dist/{chunk-FUWUCKES.js.map → chunk-LO4X32JC.js.map} +0 -0
  144. /package/dist/{chunk-D4T3HHE7.js.map → chunk-MNJAF4K2.js.map} +0 -0
  145. /package/dist/{chunk-KVRR4PEJ.js.map → chunk-NJCU7OC2.js.map} +0 -0
  146. /package/dist/{chunk-U2KFFRRX.js.map → chunk-NZAJTLEK.js.map} +0 -0
  147. /package/dist/{chunk-OTMIGYBB.js.map → chunk-RTHAMTDE.js.map} +0 -0
  148. /package/dist/{chunk-7LBYURQR.js.map → chunk-TQ363UUH.js.map} +0 -0
  149. /package/dist/{chunk-IFCASC6R.js.map → chunk-TZY7WNWO.js.map} +0 -0
  150. /package/dist/{chunk-SJNUTUSJ.js.map → chunk-W6PIVGMH.js.map} +0 -0
  151. /package/dist/{chunk-W46L2PXK.js.map → chunk-WZGROC5L.js.map} +0 -0
  152. /package/dist/{chunk-OIHZ2YH3.js.map → chunk-XFL7EIM7.js.map} +0 -0
  153. /package/dist/{chunk-7HGMFJ4Y.js.map → chunk-YDB5KXMG.js.map} +0 -0
  154. /package/dist/{loader-JMOO2A7C.js.map → loader-LI3EM4VG.js.map} +0 -0
  155. /package/dist/{source-loader-D3VIG3GM.js.map → source-loader-TPUCZELX.js.map} +0 -0
  156. /package/dist/{source-manager-FPYFJRR7.js.map → source-manager-PJ5APXX2.js.map} +0 -0
  157. /package/dist/src/agents/meta/{documentor → scribe}/critical-reminders.md +0 -0
  158. /package/dist/src/agents/meta/{documentor → scribe}/critical-requirements.md +0 -0
  159. /package/dist/src/agents/meta/{documentor → scribe}/examples.md +0 -0
  160. /package/dist/src/agents/meta/{documentor → scribe}/intro.md +0 -0
  161. /package/dist/src/agents/meta/{documentor → scribe}/output-format.md +0 -0
  162. /package/src/agents/meta/{documentor → scribe}/critical-reminders.md +0 -0
  163. /package/src/agents/meta/{documentor → scribe}/critical-requirements.md +0 -0
  164. /package/src/agents/meta/{documentor → scribe}/examples.md +0 -0
  165. /package/src/agents/meta/{documentor → scribe}/intro.md +0 -0
  166. /package/src/agents/meta/{documentor → scribe}/output-format.md +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,29 @@ Each release has detailed notes in its own file under [`changelogs/`](./changelo
7
7
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
8
8
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
+ ## [0.80.0] - 2026-03-21
11
+
12
+ **E2E test framework overhaul — POM framework, DRY migration, 142 new tests**
13
+
14
+ - Page Object Model framework with declarative test patterns (D-134)
15
+ - 142 new tests covering command flags, error paths, and pure functions (D-136)
16
+ - DRY migration: 265 raw exit codes → constants, centralized helpers, split slow files
17
+
18
+ See [changelogs/0.80.0.md](./changelogs/0.80.0.md) for full details.
19
+
20
+ ## [Unreleased]
21
+
22
+ ## [0.79.0] - 2026-03-21
23
+
24
+ **Scope-aware path resolution across all commands**
25
+
26
+ - Fix all commands to route global-scoped skills/agents to `~/` and project-scoped to project dir
27
+ - Always merge global and project local skills instead of fallback pattern
28
+ - Scope-aware config generation, installation, compilation, and mode migration
29
+ - 6 new E2E test suites for scope-aware behavior
30
+
31
+ See [changelogs/0.79.0.md](./changelogs/0.79.0.md) for full details.
32
+
10
33
  ## [0.78.0] - 2026-03-20
11
34
 
12
35
  **Wizard tab navigation, stats panel, e2e cleanup**
package/README.md CHANGED
@@ -83,8 +83,8 @@ Browse the full catalog on the [Plugin Marketplace](https://github.com/agents-in
83
83
  | Researchers | `web-researcher` `api-researcher` |
84
84
  | Planning | `web-pm` |
85
85
  | Pattern Analysis | `pattern-scout` `web-pattern-critique` |
86
- | Documentation | `documentor` |
87
- | Meta | `skill-summoner` `agent-summoner` |
86
+ | Documentation | `scribe` |
87
+ | Meta | `skill-summoner` `agent-summoner` `convention-keeper` |
88
88
 
89
89
  Each subagent is composed from modular partials (role, workflow, output format) plus its assigned skills. Everything is ejectable.
90
90
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  FRAMEWORK_CATEGORY
4
- } from "./chunk-MUCQ27HV.js";
4
+ } from "./chunk-4R72372U.js";
5
5
  import {
6
6
  SKILLS,
7
7
  TEST_CATEGORIES,
@@ -15,7 +15,7 @@ import {
15
15
  createTestSkill,
16
16
  renderSkillMd,
17
17
  testSkillToResolvedSkill
18
- } from "./chunk-FUWUCKES.js";
18
+ } from "./chunk-LO4X32JC.js";
19
19
  import {
20
20
  init_esm_shims
21
21
  } from "./chunk-DHET7RCE.js";
@@ -725,4 +725,4 @@ export {
725
725
  ALL_SKILLS_MULTI_DOMAIN_MATRIX,
726
726
  REACT_HONO_FRAMEWORK_API_MATRIX
727
727
  };
728
- //# sourceMappingURL=chunk-XA7WF3BI.js.map
728
+ //# sourceMappingURL=chunk-3C6AXGR7.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs
5
- } from "./chunk-KQDGLEBF.js";
5
+ } from "./chunk-TJXBRYM4.js";
6
6
  import {
7
7
  FEATURE_FLAGS
8
8
  } from "./chunk-V36FRPAU.js";
@@ -10,13 +10,13 @@ import {
10
10
  getDomainDisplayName,
11
11
  getStackName,
12
12
  orderDomains
13
- } from "./chunk-7JQIMEUX.js";
13
+ } from "./chunk-3SCIYMRK.js";
14
14
  import {
15
15
  HelpModal
16
16
  } from "./chunk-C22ACAL2.js";
17
17
  import {
18
18
  useWizardStore
19
- } from "./chunk-N34D3ROY.js";
19
+ } from "./chunk-TXFQBYOX.js";
20
20
  import {
21
21
  HOTKEY_FILTER_INCOMPATIBLE,
22
22
  HOTKEY_HELP,
@@ -147,6 +147,10 @@ var WizardLayout = ({
147
147
  const label = "Choose a stack";
148
148
  dropdowns.stack = { items: [{ id: label, label }] };
149
149
  }
150
+ if (store.step === "domains") {
151
+ const label = "Select domains";
152
+ dropdowns.domains = { items: [{ id: label, label }] };
153
+ }
150
154
  if (store.step === "sources") {
151
155
  const label = "Customize skill sources";
152
156
  dropdowns.sources = { items: [{ id: label, label }] };
@@ -247,4 +251,4 @@ var WizardLayout = ({
247
251
  export {
248
252
  WizardLayout
249
253
  };
250
- //# sourceMappingURL=chunk-VDVLM3KB.js.map
254
+ //# sourceMappingURL=chunk-3HWFTE3S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard-layout.tsx","../src/cli/components/hooks/use-terminal-dimensions.ts"],"sourcesContent":["import { Box, Static, Text } from \"ink\";\nimport React, { Fragment } from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { StartupMessage } from \"../../utils/logger.js\";\nimport { FEATURE_FLAGS } from \"../../lib/feature-flags.js\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { useTerminalDimensions } from \"../hooks/use-terminal-dimensions.js\";\nimport { HelpModal } from \"./help-modal.js\";\nimport {\n HOTKEY_HELP,\n HOTKEY_SCOPE,\n HOTKEY_SET_ALL_LOCAL,\n HOTKEY_SET_ALL_PLUGIN,\n HOTKEY_SETTINGS,\n HOTKEY_FILTER_INCOMPATIBLE,\n HOTKEY_TOGGLE_LABELS,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n KEY_LABEL_SPACE,\n} from \"./hotkeys.js\";\nimport {\n WIZARD_STEPS,\n WizardTabs,\n type DomainNavProps,\n type TabDropdownProps,\n} from \"./wizard-tabs.js\";\nimport { getDomainDisplayName, getStackName, orderDomains } from \"./utils.js\";\nimport type { Domain } from \"../../types/index.js\";\n\ntype KeyHintProps = {\n isVisible?: boolean;\n isActive?: boolean;\n label: string;\n values: string[];\n};\n\nconst DefinitionItem: React.FC<KeyHintProps> = ({\n isVisible = true,\n isActive = false,\n label,\n values,\n}) => {\n if (!isVisible) {\n return null;\n }\n\n return (\n <Text>\n {values.map((value) => (\n <Fragment key={value}>\n <Text\n backgroundColor=\"black\"\n color={isActive ? CLI_COLORS.PRIMARY : CLI_COLORS.UNFOCUSED}\n >\n {\" \"}\n {value}{\" \"}\n </Text>{\" \"}\n </Fragment>\n ))}\n <Text color={isActive ? CLI_COLORS.PRIMARY : undefined}>{label}</Text>\n </Text>\n );\n};\n\nconst HOT_KEYS: { label: string; values: string[] }[] = [\n { label: \"select\", values: [KEY_LABEL_SPACE] },\n { label: \"continue\", values: [KEY_LABEL_ENTER] },\n { label: \"back\", values: [KEY_LABEL_ESC] },\n];\n\nconst WizardFooter = () => {\n return (\n <Box\n columnGap={2}\n borderTop\n borderRight={false}\n borderBottom\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingLeft={1}\n paddingRight={1}\n >\n {HOT_KEYS.map((hotkey) => (\n <DefinitionItem {...hotkey} key={hotkey.label} />\n ))}\n </Box>\n );\n};\n\ntype WizardLayoutProps = {\n version?: string;\n logo?: string;\n startupMessages?: StartupMessage[];\n children: React.ReactNode;\n};\n\nexport const WizardLayout: React.FC<WizardLayoutProps> = ({\n version,\n logo,\n startupMessages,\n children,\n}) => {\n const store = useWizardStore();\n const { completedSteps, skippedSteps } = store.getStepProgress();\n const { rows: terminalHeight } = useTerminalDimensions();\n\n const handleSelectDomain = (domain: Domain) => {\n const index = store.selectedDomains.indexOf(domain);\n if (index !== -1) {\n useWizardStore.getState().setCurrentDomainIndex(index);\n }\n };\n\n const domainNav: DomainNavProps | undefined =\n store.step === \"build\" && store.selectedDomains.length > 0\n ? {\n domains: orderDomains(store.selectedDomains),\n activeDomain: (store.getCurrentDomain() || store.selectedDomains[0] || \"web\") as Domain,\n getDomainLabel: getDomainDisplayName,\n onSelectDomain: handleSelectDomain,\n }\n : undefined;\n\n // TODO: dropdowns should be in a map\n const dropdowns: Partial<Record<WizardStep, TabDropdownProps>> = {};\n\n if (store.step === \"stack\") {\n const label = \"Choose a stack\";\n dropdowns.stack = { items: [{ id: label, label }] };\n }\n\n if (store.step === \"domains\") {\n const label = \"Select domains\";\n dropdowns.domains = { items: [{ id: label, label }] };\n }\n\n if (store.step === \"sources\") {\n const label = \"Customize skill sources\";\n dropdowns.sources = { items: [{ id: label, label }] };\n }\n\n if (store.step === \"agents\") {\n const label = \"Select agents\";\n dropdowns.agents = { items: [{ id: label, label }] };\n }\n\n if (store.step === \"confirm\") {\n const stackName = getStackName(store.selectedStackId);\n const domainsText = store.selectedDomains.map(getDomainDisplayName).join(\" + \");\n const label = stackName\n ? `Ready to install ${stackName}`\n : `Ready to install your custom stack${domainsText ? ` (${domainsText})` : \"\"}`;\n dropdowns.confirm = { items: [{ id: label, label }] };\n }\n\n return (\n <>\n {startupMessages && startupMessages.length > 0 && (\n <Static items={startupMessages}>\n {(msg, index) => (\n <Box key={index}>\n <Text\n color={msg.level === \"warn\" ? \"yellow\" : msg.level === \"error\" ? \"red\" : undefined}\n >\n {msg.level === \"warn\" ? ` Warning: ${msg.text}` : msg.text}\n </Text>\n </Box>\n )}\n </Static>\n )}\n <Box flexDirection=\"column\" paddingX={1} height={terminalHeight}>\n {logo && store.step === \"stack\" && (\n <Box flexDirection=\"row\" marginTop={1} columnGap={1}>\n <Text>{logo}</Text>\n </Box>\n )}\n <WizardTabs\n steps={WIZARD_STEPS}\n currentStep={store.step}\n completedSteps={completedSteps}\n skippedSteps={skippedSteps}\n version={version}\n domainNav={domainNav}\n dropdowns={dropdowns}\n />\n {store.showHelp ? (\n <HelpModal currentStep={store.step} />\n ) : (\n <>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginTop={1}>\n {children}\n </Box>\n <Box paddingX={1} columnGap={2} marginTop={2}>\n <DefinitionItem\n label=\"Labels\"\n values={[HOTKEY_TOGGLE_LABELS.label]}\n isVisible={store.step === \"build\"}\n />\n <DefinitionItem\n label=\"Filter incompatible\"\n values={[HOTKEY_FILTER_INCOMPATIBLE.label]}\n isVisible={store.step === \"build\"}\n isActive={store.filterIncompatible}\n />\n <DefinitionItem\n label=\"Scope\"\n values={[HOTKEY_SCOPE.label]}\n isVisible={store.step === \"build\" || store.step === \"agents\"}\n />\n <DefinitionItem\n label=\"Set all local\"\n values={[HOTKEY_SET_ALL_LOCAL.label]}\n isVisible={store.step === \"sources\"}\n />\n <DefinitionItem\n label=\"Set all plugin\"\n values={[HOTKEY_SET_ALL_PLUGIN.label]}\n isVisible={store.step === \"sources\"}\n />\n <DefinitionItem\n label=\"Settings\"\n values={[HOTKEY_SETTINGS.label]}\n isVisible={store.step === \"sources\" && FEATURE_FLAGS.SOURCE_SEARCH}\n isActive={store.showSettings}\n />\n <DefinitionItem label=\"Help\" values={[HOTKEY_HELP.label]} />\n </Box>\n <WizardFooter />\n </>\n )}\n </Box>\n </>\n );\n};\n","import { useState, useEffect } from \"react\";\nimport { useStdout } from \"ink\";\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport type TerminalDimensions = {\n /** Terminal width in columns */\n columns: number;\n /** Terminal height in rows */\n rows: number;\n};\n\n/**\n * Tracks terminal dimensions reactively. Re-renders on resize.\n *\n * Falls back to DEFAULT_COLUMNS x DEFAULT_ROWS when stdout is not a TTY\n * (e.g., piped output, CI environments, tests).\n */\nexport function useTerminalDimensions(): TerminalDimensions {\n const { stdout } = useStdout();\n\n const [dimensions, setDimensions] = useState<TerminalDimensions>(() => ({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n }));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n });\n };\n\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return dimensions;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,QAAQ,YAAY;AAClC,SAAgB,gBAAgB;;;ACDhC;AAAA,SAAS,UAAU,iBAAiB;AACpC,SAAS,iBAAiB;AAE1B,IAAM,kBAAkB;AACxB,IAAM,eAAe;AAed,SAAS,wBAA4C;AAC1D,QAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,QAAM,CAAC,YAAY,aAAa,IAAI,SAA6B,OAAO;AAAA,IACtE,SAAS,OAAO,WAAW;AAAA,IAC3B,MAAM,OAAO,QAAQ;AAAA,EACvB,EAAE;AAEF,YAAU,MAAM;AACd,UAAM,eAAe,MAAM;AACzB,oBAAc;AAAA,QACZ,SAAS,OAAO,WAAW;AAAA,QAC3B,MAAM,OAAO,QAAQ;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,WAAO,GAAG,UAAU,YAAY;AAChC,WAAO,MAAM;AACX,aAAO,IAAI,UAAU,YAAY;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;;;ADQU,SA2IA,YAAAA,WAlIJ,KATI;AAkCF;AAhDR,IAAM,iBAAyC,CAAC;AAAA,EAC9C,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SACE,qBAAC,QACE;AAAA,WAAO,IAAI,CAAC,UACX,qBAAC,YACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,iBAAgB;AAAA,UAChB,OAAO,WAAW,WAAW,UAAU,WAAW;AAAA,UAEjD;AAAA;AAAA,YACA;AAAA,YAAO;AAAA;AAAA;AAAA,MACV;AAAA,MAAQ;AAAA,SAPK,KAQf,CACD;AAAA,IACD,oBAAC,QAAK,OAAO,WAAW,WAAW,UAAU,QAAY,iBAAM;AAAA,KACjE;AAEJ;AAEA,IAAM,WAAkD;AAAA,EACtD,EAAE,OAAO,UAAU,QAAQ,CAAC,eAAe,EAAE;AAAA,EAC7C,EAAE,OAAO,YAAY,QAAQ,CAAC,eAAe,EAAE;AAAA,EAC/C,EAAE,OAAO,QAAQ,QAAQ,CAAC,aAAa,EAAE;AAC3C;AAEA,IAAM,eAAe,MAAM;AACzB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,WAAS;AAAA,MACT,aAAa;AAAA,MACb,cAAY;AAAA,MACZ,YAAY;AAAA,MACZ,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,cAAc;AAAA,MAEb,mBAAS,IAAI,CAAC,WACb,8BAAC,kBAAgB,GAAG,QAAQ,KAAK,OAAO,OAAO,CAChD;AAAA;AAAA,EACH;AAEJ;AASO,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,eAAe;AAC7B,QAAM,EAAE,gBAAgB,aAAa,IAAI,MAAM,gBAAgB;AAC/D,QAAM,EAAE,MAAM,eAAe,IAAI,sBAAsB;AAEvD,QAAM,qBAAqB,CAAC,WAAmB;AAC7C,UAAM,QAAQ,MAAM,gBAAgB,QAAQ,MAAM;AAClD,QAAI,UAAU,IAAI;AAChB,qBAAe,SAAS,EAAE,sBAAsB,KAAK;AAAA,IACvD;AAAA,EACF;AAEA,QAAM,YACJ,MAAM,SAAS,WAAW,MAAM,gBAAgB,SAAS,IACrD;AAAA,IACE,SAAS,aAAa,MAAM,eAAe;AAAA,IAC3C,cAAe,MAAM,iBAAiB,KAAK,MAAM,gBAAgB,CAAC,KAAK;AAAA,IACvE,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB,IACA;AAGN,QAAM,YAA2D,CAAC;AAElE,MAAI,MAAM,SAAS,SAAS;AAC1B,UAAM,QAAQ;AACd,cAAU,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM,CAAC,EAAE;AAAA,EACpD;AAEA,MAAI,MAAM,SAAS,WAAW;AAC5B,UAAM,QAAQ;AACd,cAAU,UAAU,EAAE,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM,CAAC,EAAE;AAAA,EACtD;AAEA,MAAI,MAAM,SAAS,WAAW;AAC5B,UAAM,QAAQ;AACd,cAAU,UAAU,EAAE,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM,CAAC,EAAE;AAAA,EACtD;AAEA,MAAI,MAAM,SAAS,UAAU;AAC3B,UAAM,QAAQ;AACd,cAAU,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM,CAAC,EAAE;AAAA,EACrD;AAEA,MAAI,MAAM,SAAS,WAAW;AAC5B,UAAM,YAAY,aAAa,MAAM,eAAe;AACpD,UAAM,cAAc,MAAM,gBAAgB,IAAI,oBAAoB,EAAE,KAAK,KAAK;AAC9E,UAAM,QAAQ,YACV,oBAAoB,SAAS,KAC7B,qCAAqC,cAAc,KAAK,WAAW,MAAM,EAAE;AAC/E,cAAU,UAAU,EAAE,OAAO,CAAC,EAAE,IAAI,OAAO,MAAM,CAAC,EAAE;AAAA,EACtD;AAEA,SACE,qBAAAA,WAAA,EACG;AAAA,uBAAmB,gBAAgB,SAAS,KAC3C,oBAAC,UAAO,OAAO,iBACZ,WAAC,KAAK,UACL,oBAAC,OACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,IAAI,UAAU,SAAS,WAAW,IAAI,UAAU,UAAU,QAAQ;AAAA,QAExE,cAAI,UAAU,SAAS,cAAc,IAAI,IAAI,KAAK,IAAI;AAAA;AAAA,IACzD,KALQ,KAMV,GAEJ;AAAA,IAEF,qBAAC,OAAI,eAAc,UAAS,UAAU,GAAG,QAAQ,gBAC9C;AAAA,cAAQ,MAAM,SAAS,WACtB,oBAAC,OAAI,eAAc,OAAM,WAAW,GAAG,WAAW,GAChD,8BAAC,QAAM,gBAAK,GACd;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,aAAa,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MACC,MAAM,WACL,oBAAC,aAAU,aAAa,MAAM,MAAM,IAEpC,qBAAAA,WAAA,EACE;AAAA,4BAAC,OAAI,eAAc,UAAS,UAAU,GAAG,WAAW,GAAG,WAAW,GAC/D,UACH;AAAA,QACA,qBAAC,OAAI,UAAU,GAAG,WAAW,GAAG,WAAW,GACzC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQ,CAAC,qBAAqB,KAAK;AAAA,cACnC,WAAW,MAAM,SAAS;AAAA;AAAA,UAC5B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQ,CAAC,2BAA2B,KAAK;AAAA,cACzC,WAAW,MAAM,SAAS;AAAA,cAC1B,UAAU,MAAM;AAAA;AAAA,UAClB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQ,CAAC,aAAa,KAAK;AAAA,cAC3B,WAAW,MAAM,SAAS,WAAW,MAAM,SAAS;AAAA;AAAA,UACtD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQ,CAAC,qBAAqB,KAAK;AAAA,cACnC,WAAW,MAAM,SAAS;AAAA;AAAA,UAC5B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQ,CAAC,sBAAsB,KAAK;AAAA,cACpC,WAAW,MAAM,SAAS;AAAA;AAAA,UAC5B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQ,CAAC,gBAAgB,KAAK;AAAA,cAC9B,WAAW,MAAM,SAAS,aAAa,cAAc;AAAA,cACrD,UAAU,MAAM;AAAA;AAAA,UAClB;AAAA,UACA,oBAAC,kBAAe,OAAM,QAAO,QAAQ,CAAC,YAAY,KAAK,GAAG;AAAA,WAC5D;AAAA,QACA,oBAAC,gBAAa;AAAA,SAChB;AAAA,OAEJ;AAAA,KACF;AAEJ;","names":["Fragment"]}
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  findStack
4
- } from "./chunk-FSK4TQX7.js";
4
+ } from "./chunk-4R6I6A3U.js";
5
5
  import {
6
6
  AGENT_NAMES,
7
7
  DOMAINS
8
- } from "./chunk-32HX6UYI.js";
8
+ } from "./chunk-BN73X3JN.js";
9
9
  import {
10
10
  BUILT_IN_DOMAIN_ORDER
11
11
  } from "./chunk-FMYAYX6W.js";
@@ -51,4 +51,4 @@ export {
51
51
  getStackName,
52
52
  orderDomains
53
53
  };
54
- //# sourceMappingURL=chunk-7JQIMEUX.js.map
54
+ //# sourceMappingURL=chunk-3SCIYMRK.js.map
@@ -7,10 +7,10 @@ import {
7
7
  } from "./chunk-SQ7WINEU.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-N34D3ROY.js";
10
+ } from "./chunk-TXFQBYOX.js";
11
11
  import {
12
12
  matrix
13
- } from "./chunk-FSK4TQX7.js";
13
+ } from "./chunk-4R6I6A3U.js";
14
14
  import {
15
15
  CLI_COLORS,
16
16
  DEFAULT_SCRATCH_DOMAINS,
@@ -74,7 +74,7 @@ var StackSection = ({ title, items, focusedId }) => /* @__PURE__ */ jsxs(Box, {
74
74
  })
75
75
  ] });
76
76
  var StackSelection = ({ onCancel }) => {
77
- const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } = useWizardStore();
77
+ const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain, setStep } = useWizardStore();
78
78
  const stacks = matrix.suggestedStacks;
79
79
  const groups = useMemo(() => groupStacks(stacks), [stacks]);
80
80
  const focusableIds = useMemo(() => buildFocusableIds(groups), [groups]);
@@ -130,6 +130,7 @@ var StackSelection = ({ onCancel }) => {
130
130
  for (const domain of DEFAULT_SCRATCH_DOMAINS) {
131
131
  toggleDomain(domain);
132
132
  }
133
+ setStep("domains");
133
134
  return;
134
135
  }
135
136
  const focusedStack = stacks.find((s) => s.id === focusedId);
@@ -138,6 +139,7 @@ var StackSelection = ({ onCancel }) => {
138
139
  setStackAction("customize");
139
140
  populateFromSkillIds(focusedStack.allSkillIds);
140
141
  setApproach("stack");
142
+ setStep("domains");
141
143
  }
142
144
  }
143
145
  });
@@ -189,4 +191,4 @@ var StackSelection = ({ onCancel }) => {
189
191
  export {
190
192
  StackSelection
191
193
  };
192
- //# sourceMappingURL=chunk-OOWNDQCG.js.map
194
+ //# sourceMappingURL=chunk-3WDZKBCE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/stack-selection.tsx"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React, { useMemo, useState } from \"react\";\nimport { CLI_COLORS, DEFAULT_SCRATCH_DOMAINS, UI_SYMBOLS } from \"../../consts.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { useRowScroll } from \"../hooks/use-row-scroll.js\";\n\nimport type { SkillId } from \"../../types/index.js\";\n\ntype StackItem = { id: string; name: string; description: string };\ntype StackGroup = { label: string; items: StackItem[] };\ntype FocusId = string | \"scratch\";\n\nconst REACT_FRAMEWORK_ID = \"web-framework-react\";\nconst SCRATCH_LABEL = \"Start from scratch\";\nconst SCRATCH_DESCRIPTION = \"Select domains and skills manually\";\n\nfunction groupStacks(\n stacks: { id: string; name: string; description: string; allSkillIds: SkillId[] }[],\n): StackGroup[] {\n const reactItems: StackItem[] = [];\n const otherItems: StackItem[] = [];\n\n for (const stack of stacks) {\n const isReact = stack.allSkillIds.some((id) => id.startsWith(REACT_FRAMEWORK_ID));\n const item: StackItem = { id: stack.id, name: stack.name, description: stack.description };\n if (isReact) {\n reactItems.push(item);\n } else {\n otherItems.push(item);\n }\n }\n\n const groups: StackGroup[] = [];\n if (reactItems.length > 0) {\n groups.push({ label: \"React\", items: reactItems });\n }\n if (otherItems.length > 0) {\n groups.push({ label: \"Other Frameworks\", items: otherItems });\n }\n return groups;\n}\n\nfunction buildFocusableIds(groups: StackGroup[]): FocusId[] {\n return [...groups.flatMap((g) => g.items.map((i) => i.id)), \"scratch\"];\n}\n\n/** Renders a section header + stack items. Focus state is managed by the parent. */\nconst StackSection: React.FC<{\n title: string;\n items: StackItem[];\n focusedId: FocusId;\n}> = ({ title, items, focusedId }) => (\n <Box flexDirection=\"column\">\n <Box flexShrink={0}>\n <Text dimColor bold>\n {\" \"}\n {title}\n </Text>\n </Box>\n {items.map((item) => {\n const isFocused = item.id === focusedId;\n const pointer = isFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n return (\n <Box key={item.id} flexShrink={0}>\n <Text>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined}>{pointer}</Text>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined} bold={isFocused}>\n {\" \"}\n {item.name}\n </Text>\n <Text dimColor>\n {\" \"}\n {item.description}\n </Text>\n </Text>\n </Box>\n );\n })}\n </Box>\n);\n\nexport type StackSelectionProps = {\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onCancel?: () => void;\n};\n\nexport const StackSelection: React.FC<StackSelectionProps> = ({ onCancel }) => {\n const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain, setStep } =\n useWizardStore();\n\n const stacks = matrix.suggestedStacks;\n const groups = useMemo(() => groupStacks(stacks), [stacks]);\n const focusableIds = useMemo(() => buildFocusableIds(groups), [groups]);\n\n const [focusedId, setFocusedId] = useState<FocusId>(focusableIds[0] ?? \"scratch\");\n const { ref: listRef, measuredHeight: listHeight } = useMeasuredHeight();\n\n // Compute visual row counts for scroll: header + items per group, spacers between groups, spacer + scratch row\n const totalRowCount = useMemo(() => {\n const groupRows = groups.reduce(\n (sum, g, i) =>\n sum + 1 /* header */ + g.items.length + (i > 0 ? 1 : 0) /* spacer between groups */,\n 0,\n );\n return groupRows + 1 /* spacer before scratch */ + 1 /* scratch row */;\n }, [groups]);\n\n // Map focusedId to a visual row index for scrolling\n const focusedVisualRow = useMemo(() => {\n let row = 0;\n for (let gi = 0; gi < groups.length; gi++) {\n if (gi > 0) row++; // spacer between groups\n row++; // header\n for (const item of groups[gi].items) {\n if (item.id === focusedId) return row;\n row++;\n }\n }\n row++; // spacer before scratch\n return row; // scratch row\n }, [groups, focusedId]);\n\n const { scrollEnabled, scrollTop } = useRowScroll({\n focusedIndex: focusedVisualRow,\n itemCount: totalRowCount,\n availableHeight: listHeight,\n });\n\n useInput((input, key) => {\n if (key.escape) {\n if (onCancel) {\n onCancel();\n }\n return;\n }\n\n const currentIdx = focusableIds.indexOf(focusedId);\n\n if (key.upArrow || input === \"k\") {\n const nextIdx = currentIdx <= 0 ? focusableIds.length - 1 : currentIdx - 1;\n setFocusedId(focusableIds[nextIdx]!);\n return;\n }\n if (key.downArrow || input === \"j\") {\n const nextIdx = currentIdx >= focusableIds.length - 1 ? 0 : currentIdx + 1;\n setFocusedId(focusableIds[nextIdx]!);\n return;\n }\n\n if (key.return) {\n if (focusedId === \"scratch\") {\n selectStack(null);\n setApproach(\"scratch\");\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n toggleDomain(domain);\n }\n setStep(\"domains\");\n return;\n }\n const focusedStack = stacks.find((s) => s.id === focusedId);\n if (focusedStack) {\n selectStack(focusedStack.id);\n setStackAction(\"customize\");\n populateFromSkillIds(focusedStack.allSkillIds);\n setApproach(\"stack\");\n setStep(\"domains\");\n }\n }\n });\n\n const isScratchFocused = focusedId === \"scratch\";\n const scratchPointer = isScratchFocused ? UI_SYMBOLS.CHEVRON : UI_SYMBOLS.CHEVRON_SPACER;\n\n return (\n <Box ref={listRef} flexDirection=\"column\" flexGrow={1} flexBasis={0}>\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n {...(scrollEnabled && { overflow: \"hidden\" as const })}\n >\n <Box\n flexDirection=\"column\"\n marginTop={scrollTop > 0 ? -scrollTop : 0}\n {...(scrollEnabled && { flexShrink: 0 })}\n >\n {groups.map((group, gi) => (\n <React.Fragment key={group.label}>\n {gi > 0 && (\n <Box flexShrink={0}>\n <Text> </Text>\n </Box>\n )}\n <StackSection title={group.label} items={group.items} focusedId={focusedId} />\n </React.Fragment>\n ))}\n\n <Box key=\"scratch-spacer\" flexShrink={0}>\n <Text> </Text>\n </Box>\n <Box key=\"scratch\" flexShrink={0}>\n <Text>\n <Text color={isScratchFocused ? CLI_COLORS.PRIMARY : undefined}>\n {scratchPointer}\n </Text>\n <Text\n color={isScratchFocused ? CLI_COLORS.PRIMARY : undefined}\n bold={isScratchFocused}\n >\n {\" \"}\n {SCRATCH_LABEL}\n </Text>\n <Text dimColor>\n {\" \"}\n {SCRATCH_DESCRIPTION}\n </Text>\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,MAAM,gBAAgB;AACpC,OAAO,SAAS,SAAS,gBAAgB;AAsDrC,cACE,YADF;AAzCJ,IAAM,qBAAqB;AAC3B,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAE5B,SAAS,YACP,QACc;AACd,QAAM,aAA0B,CAAC;AACjC,QAAM,aAA0B,CAAC;AAEjC,aAAW,SAAS,QAAQ;AAC1B,UAAM,UAAU,MAAM,YAAY,KAAK,CAAC,OAAO,GAAG,WAAW,kBAAkB,CAAC;AAChF,UAAM,OAAkB,EAAE,IAAI,MAAM,IAAI,MAAM,MAAM,MAAM,aAAa,MAAM,YAAY;AACzF,QAAI,SAAS;AACX,iBAAW,KAAK,IAAI;AAAA,IACtB,OAAO;AACL,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,SAAuB,CAAC;AAC9B,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO,KAAK,EAAE,OAAO,SAAS,OAAO,WAAW,CAAC;AAAA,EACnD;AACA,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO,KAAK,EAAE,OAAO,oBAAoB,OAAO,WAAW,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAiC;AAC1D,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,SAAS;AACvE;AAGA,IAAM,eAID,CAAC,EAAE,OAAO,OAAO,UAAU,MAC9B,qBAAC,OAAI,eAAc,UACjB;AAAA,sBAAC,OAAI,YAAY,GACf,+BAAC,QAAK,UAAQ,MAAC,MAAI,MAChB;AAAA;AAAA,IACA;AAAA,KACH,GACF;AAAA,EACC,MAAM,IAAI,CAAC,SAAS;AACnB,UAAM,YAAY,KAAK,OAAO;AAC9B,UAAM,UAAU,YAAY,WAAW,UAAU,WAAW;AAC5D,WACE,oBAAC,OAAkB,YAAY,GAC7B,+BAAC,QACC;AAAA,0BAAC,QAAK,OAAO,YAAY,WAAW,UAAU,QAAY,mBAAQ;AAAA,MAClE,qBAAC,QAAK,OAAO,YAAY,WAAW,UAAU,QAAW,MAAM,WAC5D;AAAA;AAAA,QACA,KAAK;AAAA,SACR;AAAA,MACA,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,QACA,KAAK;AAAA,SACR;AAAA,OACF,KAXQ,KAAK,EAYf;AAAA,EAEJ,CAAC;AAAA,GACH;AASK,IAAM,iBAAgD,CAAC,EAAE,SAAS,MAAM;AAC7E,QAAM,EAAE,aAAa,aAAa,gBAAgB,sBAAsB,cAAc,QAAQ,IAC5F,eAAe;AAEjB,QAAM,SAAS,OAAO;AACtB,QAAM,SAAS,QAAQ,MAAM,YAAY,MAAM,GAAG,CAAC,MAAM,CAAC;AAC1D,QAAM,eAAe,QAAQ,MAAM,kBAAkB,MAAM,GAAG,CAAC,MAAM,CAAC;AAEtE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAkB,aAAa,CAAC,KAAK,SAAS;AAChF,QAAM,EAAE,KAAK,SAAS,gBAAgB,WAAW,IAAI,kBAAkB;AAGvE,QAAM,gBAAgB,QAAQ,MAAM;AAClC,UAAM,YAAY,OAAO;AAAA,MACvB,CAAC,KAAK,GAAG,MACP,MAAM,IAAiB,EAAE,MAAM,UAAU,IAAI,IAAI,IAAI;AAAA,MACvD;AAAA,IACF;AACA,WAAO,YAAY,IAAgC;AAAA,EACrD,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,mBAAmB,QAAQ,MAAM;AACrC,QAAI,MAAM;AACV,aAAS,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM;AACzC,UAAI,KAAK,EAAG;AACZ;AACA,iBAAW,QAAQ,OAAO,EAAE,EAAE,OAAO;AACnC,YAAI,KAAK,OAAO,UAAW,QAAO;AAClC;AAAA,MACF;AAAA,IACF;AACA;AACA,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,QAAM,EAAE,eAAe,UAAU,IAAI,aAAa;AAAA,IAChD,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,EACnB,CAAC;AAED,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,UAAM,aAAa,aAAa,QAAQ,SAAS;AAEjD,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,YAAM,UAAU,cAAc,IAAI,aAAa,SAAS,IAAI,aAAa;AACzE,mBAAa,aAAa,OAAO,CAAE;AACnC;AAAA,IACF;AACA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,YAAM,UAAU,cAAc,aAAa,SAAS,IAAI,IAAI,aAAa;AACzE,mBAAa,aAAa,OAAO,CAAE;AACnC;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,UAAI,cAAc,WAAW;AAC3B,oBAAY,IAAI;AAChB,oBAAY,SAAS;AACrB,mBAAW,UAAU,yBAAyB;AAC5C,uBAAa,MAAM;AAAA,QACrB;AACA,gBAAQ,SAAS;AACjB;AAAA,MACF;AACA,YAAM,eAAe,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AAC1D,UAAI,cAAc;AAChB,oBAAY,aAAa,EAAE;AAC3B,uBAAe,WAAW;AAC1B,6BAAqB,aAAa,WAAW;AAC7C,oBAAY,OAAO;AACnB,gBAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,mBAAmB,cAAc;AACvC,QAAM,iBAAiB,mBAAmB,WAAW,UAAU,WAAW;AAE1E,SACE,oBAAC,OAAI,KAAK,SAAS,eAAc,UAAS,UAAU,GAAG,WAAW,GAChE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,UAAU;AAAA,MACT,GAAI,iBAAiB,EAAE,UAAU,SAAkB;AAAA,MAEpD;AAAA,QAAC;AAAA;AAAA,UACC,eAAc;AAAA,UACd,WAAW,YAAY,IAAI,CAAC,YAAY;AAAA,UACvC,GAAI,iBAAiB,EAAE,YAAY,EAAE;AAAA,UAErC;AAAA,mBAAO,IAAI,CAAC,OAAO,OAClB,qBAAC,MAAM,UAAN,EACE;AAAA,mBAAK,KACJ,oBAAC,OAAI,YAAY,GACf,8BAAC,QAAK,eAAC,GACT;AAAA,cAEF,oBAAC,gBAAa,OAAO,MAAM,OAAO,OAAO,MAAM,OAAO,WAAsB;AAAA,iBANzD,MAAM,KAO3B,CACD;AAAA,YAED,oBAAC,OAAyB,YAAY,GACpC,8BAAC,QAAK,eAAC,KADA,gBAET;AAAA,YACA,oBAAC,OAAkB,YAAY,GAC7B,+BAAC,QACC;AAAA,kCAAC,QAAK,OAAO,mBAAmB,WAAW,UAAU,QAClD,0BACH;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,mBAAmB,WAAW,UAAU;AAAA,kBAC/C,MAAM;AAAA,kBAEL;AAAA;AAAA,oBACA;AAAA;AAAA;AAAA,cACH;AAAA,cACA,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,gBACA;AAAA,iBACH;AAAA,eACF,KAhBO,SAiBT;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}