magus-cli 0.0.0-placeholder → 7.1.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 (330) hide show
  1. package/README.md +309 -0
  2. package/bin/magus.js +170 -0
  3. package/package.json +67 -3
  4. package/scripts/build-binaries.ts +113 -0
  5. package/scripts/capture-builtin.ts +412 -0
  6. package/scripts/check-optional-deps.ts +49 -0
  7. package/scripts/test-isolated.ts +49 -0
  8. package/scripts/verify-binary.ts +95 -0
  9. package/scripts/verify-community-registry.ts +272 -0
  10. package/src/__tests__/active-closure.test.ts +184 -0
  11. package/src/__tests__/alias-adopt.test.ts +365 -0
  12. package/src/__tests__/alias-parser.test.ts +417 -0
  13. package/src/__tests__/alias-shell-writer.test.ts +681 -0
  14. package/src/__tests__/alias-store.test.ts +163 -0
  15. package/src/__tests__/binary-signing.test.ts +120 -0
  16. package/src/__tests__/blackbox-active-closure.test.ts +119 -0
  17. package/src/__tests__/blackbox-convergence.test.ts +334 -0
  18. package/src/__tests__/blackbox-parity.test.ts +725 -0
  19. package/src/__tests__/blackbox-plugin-state.test.ts +545 -0
  20. package/src/__tests__/blackbox-tool-state.test.ts +669 -0
  21. package/src/__tests__/cache-provenance.test.ts +84 -0
  22. package/src/__tests__/capture-builtin.test.ts +92 -0
  23. package/src/__tests__/catalog-cache-store.test.ts +309 -0
  24. package/src/__tests__/catalog-notice.test.ts +155 -0
  25. package/src/__tests__/cli-ansi.test.ts +297 -0
  26. package/src/__tests__/cli-apply-seams.test.ts +288 -0
  27. package/src/__tests__/cli-live.test.ts +391 -0
  28. package/src/__tests__/cli-router.test.ts +240 -0
  29. package/src/__tests__/cli-tool-commands.test.ts +239 -0
  30. package/src/__tests__/cli-tools-adapter.test.ts +294 -0
  31. package/src/__tests__/cli-update-view.test.ts +524 -0
  32. package/src/__tests__/community-fetch.test.ts +545 -0
  33. package/src/__tests__/community-registry.test.ts +269 -0
  34. package/src/__tests__/community-staleness.test.ts +720 -0
  35. package/src/__tests__/component-badge.test.ts +98 -0
  36. package/src/__tests__/component-icons.test.ts +94 -0
  37. package/src/__tests__/content-drift.test.ts +353 -0
  38. package/src/__tests__/conventions-integration.test.ts +830 -0
  39. package/src/__tests__/conventions-manager.test.ts +1236 -0
  40. package/src/__tests__/doctor-bins.test.ts +43 -0
  41. package/src/__tests__/doctor.test.ts +463 -0
  42. package/src/__tests__/dotenv.test.ts +195 -0
  43. package/src/__tests__/enabled-not-installed.test.ts +94 -0
  44. package/src/__tests__/file-locking.test.ts +208 -0
  45. package/src/__tests__/fixtures/tool-probe/brew-list-versions-tmux.txt +2 -0
  46. package/src/__tests__/fixtures/tool-probe/brew-outdated-behind-homebrew-spec.txt +29 -0
  47. package/src/__tests__/fixtures/tool-probe/brew-outdated-tmux-current.txt +7 -0
  48. package/src/__tests__/fixtures/tool-probe/brew-outdated-unknown-formula.txt +6 -0
  49. package/src/__tests__/fixtures/tool-probe/go-version-m-tmux-mcp.txt +27 -0
  50. package/src/__tests__/fixtures/tool-probe/npm-dist-tags-missing-scoped.txt +4 -0
  51. package/src/__tests__/fixtures/tool-probe/npm-dist-tags-openai-codex.txt +4 -0
  52. package/src/__tests__/fixtures/tool-probe/pypi-cowsay.txt +3 -0
  53. package/src/__tests__/fixtures/tool-probe/uv-receipt-browser-use.toml +10 -0
  54. package/src/__tests__/fixtures/tool-probe/uv-receipt-cowsay-git.toml +8 -0
  55. package/src/__tests__/fixtures/tool-probe/uv-receipt-cowsay-pinned.toml +8 -0
  56. package/src/__tests__/fixtures/tool-probe/uv-receipt-graphifyy.toml +7 -0
  57. package/src/__tests__/fixtures/tool-probe/uv-receipt-mcp.toml +6 -0
  58. package/src/__tests__/fixtures/tool-probe/uv-receipt-serena-agent.toml +9 -0
  59. package/src/__tests__/fixtures/tool-probe/uv-tool-list-outdated-pinned.txt +5 -0
  60. package/src/__tests__/fixtures/tool-probe/uv-tool-list-outdated.txt +11 -0
  61. package/src/__tests__/fixtures/tool-probe/uv-tool-list.txt +22 -0
  62. package/src/__tests__/footer-hints.test.ts +40 -0
  63. package/src/__tests__/format-command.test.ts +78 -0
  64. package/src/__tests__/git-worktree.test.ts +108 -0
  65. package/src/__tests__/github-budget.test.ts +206 -0
  66. package/src/__tests__/gitignore-check.test.ts +71 -0
  67. package/src/__tests__/gitignore-detector.test.ts +176 -0
  68. package/src/__tests__/gitignore-fixer.test.ts +317 -0
  69. package/src/__tests__/gitignore-resolver.test.ts +193 -0
  70. package/src/__tests__/gitignore-service.test.ts +137 -0
  71. package/src/__tests__/go-module.test.ts +43 -0
  72. package/src/__tests__/hook-import-policy.test.ts +90 -0
  73. package/src/__tests__/hook-process.test.ts +256 -0
  74. package/src/__tests__/hook-registration.test.ts +224 -0
  75. package/src/__tests__/install-command.test.ts +81 -0
  76. package/src/__tests__/install-plan.test.ts +104 -0
  77. package/src/__tests__/launcher-signal.test.ts +308 -0
  78. package/src/__tests__/local-marketplace-scan.test.ts +248 -0
  79. package/src/__tests__/manifest.test.ts +281 -0
  80. package/src/__tests__/markdown-renderer.test.ts +142 -0
  81. package/src/__tests__/marketplace-badge.test.ts +140 -0
  82. package/src/__tests__/marketplace-refresh.test.ts +340 -0
  83. package/src/__tests__/marketplace-version.test.ts +84 -0
  84. package/src/__tests__/marketplaces.test.ts +128 -0
  85. package/src/__tests__/mate-availability.test.ts +156 -0
  86. package/src/__tests__/mate-catalog.test.ts +295 -0
  87. package/src/__tests__/mcp-registry.test.ts +158 -0
  88. package/src/__tests__/model-visuals.test.tsx +2466 -0
  89. package/src/__tests__/models-adapter.test.ts +332 -0
  90. package/src/__tests__/models-cli.test.ts +273 -0
  91. package/src/__tests__/models-core.test.ts +802 -0
  92. package/src/__tests__/models-manager.test.ts +500 -0
  93. package/src/__tests__/models-presets-marketplace.test.ts +168 -0
  94. package/src/__tests__/models-screen-state.test.ts +315 -0
  95. package/src/__tests__/open-file.test.ts +59 -0
  96. package/src/__tests__/owned-marketplaces.test.ts +93 -0
  97. package/src/__tests__/plugin-checkout.test.ts +66 -0
  98. package/src/__tests__/plugin-cli-argv.test.ts +109 -0
  99. package/src/__tests__/plugin-contents.test.ts +371 -0
  100. package/src/__tests__/plugin-manager-fallback.test.ts +320 -0
  101. package/src/__tests__/plugin-releases.test.ts +98 -0
  102. package/src/__tests__/plugin-requires.test.ts +187 -0
  103. package/src/__tests__/plugin-row-text.test.ts +345 -0
  104. package/src/__tests__/plugin-setup.test.ts +1016 -0
  105. package/src/__tests__/profile-adopt.test.ts +177 -0
  106. package/src/__tests__/profile-command.test.ts +110 -0
  107. package/src/__tests__/profile-materializer.test.ts +238 -0
  108. package/src/__tests__/profile-sync.test.ts +154 -0
  109. package/src/__tests__/registry-version-resolution.test.ts +88 -0
  110. package/src/__tests__/resolve-executable.test.ts +42 -0
  111. package/src/__tests__/resolver.test.ts +351 -0
  112. package/src/__tests__/scope-action.test.ts +134 -0
  113. package/src/__tests__/scope-squares.test.tsx +164 -0
  114. package/src/__tests__/selection-scope.test.ts +100 -0
  115. package/src/__tests__/settings-file.test.ts +179 -0
  116. package/src/__tests__/shell-script-callers.test.ts +92 -0
  117. package/src/__tests__/skill-install-files.test.ts +136 -0
  118. package/src/__tests__/skills-catalog-client.test.ts +48 -0
  119. package/src/__tests__/style-wrap.test.ts +220 -0
  120. package/src/__tests__/styles-manager.test.ts +1098 -0
  121. package/src/__tests__/styles-origins.test.ts +414 -0
  122. package/src/__tests__/styles-screen-state.test.ts +457 -0
  123. package/src/__tests__/styles-status-line.test.ts +72 -0
  124. package/src/__tests__/styles-sync.test.ts +452 -0
  125. package/src/__tests__/symlink-manager.test.ts +180 -0
  126. package/src/__tests__/tabbar-layout.test.ts +100 -0
  127. package/src/__tests__/terminology-filler.test.ts +214 -0
  128. package/src/__tests__/theme-adaptive-colors.test.ts +354 -0
  129. package/src/__tests__/theme-env.test.ts +310 -0
  130. package/src/__tests__/theme-resolve.test.ts +380 -0
  131. package/src/__tests__/tool-probe.test.ts +1400 -0
  132. package/src/__tests__/toolchain.test.ts +232 -0
  133. package/src/__tests__/ui-version-writers.test.ts +88 -0
  134. package/src/__tests__/update-apply.test.ts +637 -0
  135. package/src/__tests__/update-plan.test.ts +1396 -0
  136. package/src/__tests__/uppercase-keybindings.test.ts +101 -0
  137. package/src/__tests__/useGitignoreModal.test.ts +79 -0
  138. package/src/__tests__/version-check-refresh.test.ts +45 -0
  139. package/src/__tests__/version-snapshot.test.ts +212 -0
  140. package/src/__tests__/version-unknown-state.test.ts +403 -0
  141. package/src/__tests__/worktree-registry-resolution.test.ts +107 -0
  142. package/src/cli/ansi.ts +528 -0
  143. package/src/cli/bootstrap.ts +134 -0
  144. package/src/cli/doctor.ts +218 -0
  145. package/src/cli/hook.ts +129 -0
  146. package/src/cli/install.ts +382 -0
  147. package/src/cli/live.ts +374 -0
  148. package/src/cli/models.ts +297 -0
  149. package/src/cli/profile.ts +197 -0
  150. package/src/cli/prompt.ts +32 -0
  151. package/src/cli/router.ts +264 -0
  152. package/src/cli/update-view.ts +717 -0
  153. package/src/cli/update.ts +600 -0
  154. package/src/cli/upgrade.ts +97 -0
  155. package/src/data/alias-flags.ts +301 -0
  156. package/src/data/cli-tools.ts +146 -0
  157. package/src/data/community-styles.ts +531 -0
  158. package/src/data/gitignore-defaults.ts +33 -0
  159. package/src/data/gitignore-reasons.ts +93 -0
  160. package/src/data/gitignore-templates.ts +25 -0
  161. package/src/data/marketplaces.ts +278 -0
  162. package/src/data/mcp-servers.ts +51 -0
  163. package/src/data/models-presets.ts +329 -0
  164. package/src/data/predefined-profiles.ts +252 -0
  165. package/src/data/settings-catalog.ts +714 -0
  166. package/src/data/skill-repos.ts +91 -0
  167. package/src/data/styles/asd-ste100.md +38 -0
  168. package/src/data/styles/calibrated.md +24 -0
  169. package/src/data/styles/direct.md +23 -0
  170. package/src/data/styles/evidence-first.md +22 -0
  171. package/src/data/styles/explanatory.md +23 -0
  172. package/src/data/styles/index.ts +57 -0
  173. package/src/data/styles/no-slop.md +32 -0
  174. package/src/data/styles/plain-language.md +23 -0
  175. package/src/data/styles/structured.md +30 -0
  176. package/src/data/styles/terminology.md +28 -0
  177. package/src/data/styles/terse.md +20 -0
  178. package/src/main.tsx +110 -0
  179. package/src/markdown.d.ts +13 -0
  180. package/src/opentui.d.ts +203 -0
  181. package/src/services/active-closure.ts +117 -0
  182. package/src/services/alias-settings.ts +60 -0
  183. package/src/services/alias-shell-writer.ts +1244 -0
  184. package/src/services/alias-store.ts +172 -0
  185. package/src/services/binary-signing.ts +78 -0
  186. package/src/services/catalog-cache-store.ts +316 -0
  187. package/src/services/claude-cli.ts +304 -0
  188. package/src/services/claude-runner.ts +31 -0
  189. package/src/services/claude-settings.ts +1564 -0
  190. package/src/services/cli-tool-commands.ts +133 -0
  191. package/src/services/community-fetcher.ts +90 -0
  192. package/src/services/community-styles.ts +1194 -0
  193. package/src/services/content-drift.ts +208 -0
  194. package/src/services/conventions-manager.ts +945 -0
  195. package/src/services/doctor-bins.ts +63 -0
  196. package/src/services/doctor.ts +570 -0
  197. package/src/services/dotenv.ts +181 -0
  198. package/src/services/git-worktree.ts +129 -0
  199. package/src/services/github-budget.ts +274 -0
  200. package/src/services/gitignore-check.ts +63 -0
  201. package/src/services/gitignore-detector.ts +167 -0
  202. package/src/services/gitignore-fixer.ts +280 -0
  203. package/src/services/gitignore-resolver.ts +208 -0
  204. package/src/services/gitignore-service.ts +167 -0
  205. package/src/services/hook-registration.ts +218 -0
  206. package/src/services/install-plan.ts +107 -0
  207. package/src/services/local-marketplace.ts +657 -0
  208. package/src/services/manifest.ts +250 -0
  209. package/src/services/marketplace-catalog-git.ts +173 -0
  210. package/src/services/marketplace-catalog.ts +129 -0
  211. package/src/services/marketplace-fetcher.ts +400 -0
  212. package/src/services/marketplace-refresh.ts +245 -0
  213. package/src/services/marketplace-sync.ts +145 -0
  214. package/src/services/mate-availability.ts +133 -0
  215. package/src/services/mate-catalog.ts +265 -0
  216. package/src/services/mcp-registry.ts +171 -0
  217. package/src/services/models-core.ts +969 -0
  218. package/src/services/models-manager.ts +606 -0
  219. package/src/services/plugin-checkout.ts +186 -0
  220. package/src/services/plugin-manager.ts +847 -0
  221. package/src/services/plugin-mcp-config.ts +242 -0
  222. package/src/services/plugin-releases.ts +47 -0
  223. package/src/services/plugin-requires.ts +227 -0
  224. package/src/services/plugin-setup.ts +965 -0
  225. package/src/services/profile-adopt.ts +206 -0
  226. package/src/services/profile-materializer.ts +133 -0
  227. package/src/services/profile-sync.ts +158 -0
  228. package/src/services/profiles.ts +225 -0
  229. package/src/services/resolver.ts +377 -0
  230. package/src/services/settings-file.ts +69 -0
  231. package/src/services/settings-manager.ts +307 -0
  232. package/src/services/skills-manager.ts +1111 -0
  233. package/src/services/skillsmp-client.ts +193 -0
  234. package/src/services/styles-manager.ts +1294 -0
  235. package/src/services/symlink-manager.ts +189 -0
  236. package/src/services/terminology-filler.ts +266 -0
  237. package/src/services/tool-probe.ts +1637 -0
  238. package/src/services/toolchain.ts +431 -0
  239. package/src/services/update-engine.ts +691 -0
  240. package/src/services/update-plan.ts +820 -0
  241. package/src/services/version-check.ts +127 -0
  242. package/src/services/version-snapshot.ts +189 -0
  243. package/src/tui.tsx +112 -0
  244. package/src/types/bun.d.ts +27 -0
  245. package/src/types/gitignore.ts +68 -0
  246. package/src/types/index.ts +447 -0
  247. package/src/ui/App.tsx +535 -0
  248. package/src/ui/adapters/catalogNotice.ts +122 -0
  249. package/src/ui/adapters/cliToolsAdapter.ts +176 -0
  250. package/src/ui/adapters/modelsAdapter.ts +213 -0
  251. package/src/ui/adapters/pluginsAdapter.ts +413 -0
  252. package/src/ui/adapters/settingsAdapter.ts +168 -0
  253. package/src/ui/adapters/skillsAdapter.ts +229 -0
  254. package/src/ui/adapters/stylesAdapter.ts +403 -0
  255. package/src/ui/components/CategoryHeader.tsx +64 -0
  256. package/src/ui/components/EmptyFilterState.tsx +32 -0
  257. package/src/ui/components/FlagDetailEditor.tsx +0 -0
  258. package/src/ui/components/ScopeIndicator.tsx +63 -0
  259. package/src/ui/components/ScrollableList.tsx +95 -0
  260. package/src/ui/components/SearchInput.tsx +57 -0
  261. package/src/ui/components/StyledText.tsx +75 -0
  262. package/src/ui/components/TabBar.tsx +101 -0
  263. package/src/ui/components/layout/FooterHints.tsx +78 -0
  264. package/src/ui/components/layout/Panel.tsx +63 -0
  265. package/src/ui/components/layout/ProgressBar.tsx +44 -0
  266. package/src/ui/components/layout/ScopeTabs.tsx +54 -0
  267. package/src/ui/components/layout/ScreenLayout.tsx +321 -0
  268. package/src/ui/components/layout/index.ts +9 -0
  269. package/src/ui/components/modals/ConfirmModal.tsx +62 -0
  270. package/src/ui/components/modals/InputModal.tsx +75 -0
  271. package/src/ui/components/modals/LoadingModal.tsx +51 -0
  272. package/src/ui/components/modals/MessageModal.tsx +66 -0
  273. package/src/ui/components/modals/ModalContainer.tsx +159 -0
  274. package/src/ui/components/modals/SelectModal.tsx +90 -0
  275. package/src/ui/components/modals/index.ts +6 -0
  276. package/src/ui/components/primitives/ActionHints.tsx +44 -0
  277. package/src/ui/components/primitives/DetailSection.tsx +23 -0
  278. package/src/ui/components/primitives/KeyValueLine.tsx +26 -0
  279. package/src/ui/components/primitives/ListCategoryRow.tsx +45 -0
  280. package/src/ui/components/primitives/MetaText.tsx +40 -0
  281. package/src/ui/components/primitives/ScopeDetail.tsx +67 -0
  282. package/src/ui/components/primitives/ScopeSquares.tsx +58 -0
  283. package/src/ui/components/primitives/SelectableRow.tsx +30 -0
  284. package/src/ui/components/primitives/index.ts +9 -0
  285. package/src/ui/hooks/index.ts +2 -0
  286. package/src/ui/hooks/useGitignoreModal.ts +95 -0
  287. package/src/ui/hooks/useKeyboard.ts +24 -0
  288. package/src/ui/hooks/useKeyboardHandler.ts +63 -0
  289. package/src/ui/registry.ts +33 -0
  290. package/src/ui/renderers/cliToolRenderers.tsx +326 -0
  291. package/src/ui/renderers/gitignoreRenderers.tsx +80 -0
  292. package/src/ui/renderers/markdownRenderer.tsx +302 -0
  293. package/src/ui/renderers/mcpRenderers.tsx +149 -0
  294. package/src/ui/renderers/modelRenderers.tsx +1309 -0
  295. package/src/ui/renderers/modelVisuals.tsx +1402 -0
  296. package/src/ui/renderers/pluginRenderers.tsx +1089 -0
  297. package/src/ui/renderers/pluginRowText.ts +70 -0
  298. package/src/ui/renderers/pluginStatusText.ts +56 -0
  299. package/src/ui/renderers/profileRenderers.tsx +406 -0
  300. package/src/ui/renderers/settingsRenderers.tsx +218 -0
  301. package/src/ui/renderers/skillRenderers.tsx +479 -0
  302. package/src/ui/renderers/styleRenderers.tsx +813 -0
  303. package/src/ui/screens/AliasScreen.tsx +1558 -0
  304. package/src/ui/screens/CliToolsScreen.tsx +367 -0
  305. package/src/ui/screens/EnvVarsScreen.tsx +221 -0
  306. package/src/ui/screens/GitignoreScreen.tsx +562 -0
  307. package/src/ui/screens/McpRegistryScreen.tsx +366 -0
  308. package/src/ui/screens/McpScreen.tsx +256 -0
  309. package/src/ui/screens/ModelsScreen.tsx +542 -0
  310. package/src/ui/screens/PluginsScreen.tsx +1423 -0
  311. package/src/ui/screens/ProfilesScreen.tsx +438 -0
  312. package/src/ui/screens/SkillsScreen.tsx +853 -0
  313. package/src/ui/screens/StylesScreen.tsx +1064 -0
  314. package/src/ui/screens/index.ts +11 -0
  315. package/src/ui/state/AppContext.tsx +233 -0
  316. package/src/ui/state/DimensionsContext.tsx +154 -0
  317. package/src/ui/state/reducer.ts +810 -0
  318. package/src/ui/state/types.ts +503 -0
  319. package/src/ui/theme-mode.ts +440 -0
  320. package/src/ui/theme-resolve.ts +147 -0
  321. package/src/ui/theme.ts +175 -0
  322. package/src/utils/clipboard.ts +58 -0
  323. package/src/utils/command-utils.ts +149 -0
  324. package/src/utils/config-dir.ts +45 -0
  325. package/src/utils/file-locking.ts +146 -0
  326. package/src/utils/fuzzy-search.ts +138 -0
  327. package/src/utils/go-module.ts +36 -0
  328. package/src/utils/open-file.ts +84 -0
  329. package/src/utils/run.ts +67 -0
  330. package/src/utils/string-utils.ts +88 -0
@@ -0,0 +1,447 @@
1
+ import type { ModelsConfig } from "../services/models-core.js";
2
+
3
+ export interface McpServer {
4
+ name: string;
5
+ description: string;
6
+ // Command-based MCP server
7
+ command?: string;
8
+ args?: string[];
9
+ env?: Record<string, string>;
10
+ // HTTP-based MCP server
11
+ type?: "http";
12
+ url?: string;
13
+ // Common fields
14
+ category:
15
+ | "browser"
16
+ | "ai"
17
+ | "design"
18
+ | "dev-tools"
19
+ | "cloud"
20
+ | "database"
21
+ | "productivity"
22
+ | "seo";
23
+ requiresConfig?: boolean;
24
+ configFields?: ConfigField[];
25
+ }
26
+
27
+ export interface ConfigField {
28
+ name: string;
29
+ label: string;
30
+ type: "string" | "path" | "url" | "boolean";
31
+ required: boolean;
32
+ default?: string;
33
+ envVar?: string;
34
+ }
35
+
36
+ export interface Marketplace {
37
+ name: string;
38
+ displayName: string;
39
+ source: {
40
+ source: "github";
41
+ repo: string;
42
+ };
43
+ description: string;
44
+ official?: boolean;
45
+ featured?: boolean; // Featured marketplaces have plugins fetched by default (like official)
46
+ deprecated?: boolean; // Deprecated marketplaces are sorted to the bottom of the list
47
+ owned?: boolean; // Our own marketplaces (magus*): always listed even when uninstalled, and sorted to the top
48
+ }
49
+
50
+ export interface DiscoveredMarketplace {
51
+ name: string;
52
+ source: "default" | "configured" | "inferred";
53
+ config?: MarketplaceSource;
54
+ }
55
+
56
+ /**
57
+ * One entry of a plugin's recent release history, as published in marketplace.json.
58
+ *
59
+ * Kept separate from `description` on purpose: `description` says what a plugin *is*
60
+ * and changes rarely, while this says what *changed* and turns over every release.
61
+ * Folding the second into the first is what left plugin panels showing a changelog
62
+ * line where the plugin's purpose should be.
63
+ */
64
+ export interface PluginRelease {
65
+ version: string;
66
+ /** ISO date (YYYY-MM-DD). Absent on entries whose heading carried no date. */
67
+ date?: string;
68
+ /** Change categories in the entry — "Added", "Changed", "Fixed", … */
69
+ kinds?: string[];
70
+ summary: string;
71
+ }
72
+
73
+ export interface Plugin {
74
+ name: string;
75
+ version: string;
76
+ description: string;
77
+ marketplace: string;
78
+ installed: boolean;
79
+ availableVersion?: string;
80
+ hasUpdate?: boolean;
81
+ }
82
+
83
+ export interface MarketplaceSource {
84
+ source: {
85
+ source: "github";
86
+ repo: string;
87
+ };
88
+ autoUpdate?: boolean; // Enable auto-update for this marketplace (default: true for new marketplaces)
89
+ }
90
+
91
+ export interface ClaudeHookEntry {
92
+ type: string;
93
+ command: string;
94
+ }
95
+
96
+ export interface ClaudeHookGroup {
97
+ hooks: ClaudeHookEntry[];
98
+ }
99
+
100
+ export interface ClaudeSettings {
101
+ enabledMcpServers?: Record<string, boolean>;
102
+ mcpServers?: Record<string, McpServerConfig>;
103
+ enabledPlugins?: Record<string, boolean>;
104
+ extraKnownMarketplaces?: Record<string, MarketplaceSource>;
105
+ installedPluginVersions?: Record<string, string>;
106
+ statusLine?: string | { type: string; template?: string; command?: string };
107
+ hooks?: Record<string, ClaudeHookGroup[]>;
108
+ }
109
+
110
+ export interface McpServerConfig {
111
+ // Command-based
112
+ command?: string;
113
+ args?: string[];
114
+ env?: Record<string, string>;
115
+ // HTTP-based
116
+ type?: "http";
117
+ url?: string;
118
+ }
119
+
120
+ export interface ClaudeLocalSettings extends ClaudeSettings {
121
+ allowMcp?: boolean;
122
+ enabledMcpjsonServers?: string[];
123
+ enableAllProjectMcpServers?: boolean;
124
+ env?: Record<string, string>;
125
+ }
126
+
127
+ export type Screen =
128
+ | "main"
129
+ | "mcp"
130
+ | "mcp-registry"
131
+ | "plugins"
132
+ | "statusline"
133
+ | "cli-tools"
134
+ | "env-vars"
135
+ | "skills";
136
+
137
+ // ─── Skill Types ──────────────────────────────────────────────────────────────
138
+
139
+ /** A configured skill repository (entry in skill-repos.ts) */
140
+ export interface SkillSource {
141
+ /** Human-readable label, e.g. "vercel-labs/agent-skills" */
142
+ label: string;
143
+ /** GitHub owner/repo, e.g. "vercel-labs/agent-skills" */
144
+ repo: string;
145
+ /** Sub-path within the repo where skills live, e.g. "skills" */
146
+ skillsPath: string;
147
+ }
148
+
149
+ /** YAML frontmatter extracted from a SKILL.md file */
150
+ export interface SkillFrontmatter {
151
+ name: string;
152
+ description: string;
153
+ category?: string;
154
+ author?: string;
155
+ version?: string;
156
+ tags?: string[];
157
+ [key: string]: unknown;
158
+ }
159
+
160
+ /** A skill entry from the available-skills list (may or may not be installed) */
161
+ export interface SkillInfo {
162
+ /** Unique key: "{owner}/{repo}/{path}" */
163
+ id: string;
164
+ /** Slug used as directory name: last segment of path */
165
+ name: string;
166
+ /** Source repo this skill comes from */
167
+ source: SkillSource;
168
+ /** Relative path within repo, e.g. "skills/researcher/SKILL.md" */
169
+ repoPath: string;
170
+ /** Git blob SHA from Tree API response */
171
+ gitBlobSha: string;
172
+ /** Parsed frontmatter (null if not yet fetched) */
173
+ frontmatter: SkillFrontmatter | null;
174
+ /** Whether the skill is installed (either scope) */
175
+ installed: boolean;
176
+ /** Scope of the installed copy */
177
+ installedScope: "user" | "project" | null;
178
+ /** True when lock file SHA differs from Tree API SHA */
179
+ hasUpdate: boolean;
180
+ /** Whether this is a recommended skill */
181
+ isRecommended?: boolean;
182
+ /** GitHub star count from the skills API */
183
+ stars?: number;
184
+ /** Short description (from API, before frontmatter is loaded) */
185
+ description?: string;
186
+ /** How reliable the star count is as a quality signal for this skill */
187
+ starReliability?: "dedicated" | "mega-repo" | "skill-dump";
188
+ }
189
+
190
+ /** How reliable the star count is as a quality signal for this skill */
191
+ export type StarReliability = "dedicated" | "mega-repo" | "skill-dump";
192
+
193
+ /** A skill set — a group of skills from a single repo */
194
+ export interface SkillSetInfo {
195
+ /** Unique key, e.g. "huggingface/skills" */
196
+ id: string;
197
+ /** Display name, e.g. "Hugging Face" */
198
+ name: string;
199
+ /** Repo description */
200
+ description: string;
201
+ /** GitHub owner/repo */
202
+ repo: string;
203
+ /** Icon/emoji for display */
204
+ icon: string;
205
+ /** GitHub star count */
206
+ stars?: number;
207
+ /** Individual skills within this set (fetched lazily via Tree API) */
208
+ skills: SkillInfo[];
209
+ /** Whether skills have been fetched yet */
210
+ loaded: boolean;
211
+ /** Loading state */
212
+ loading: boolean;
213
+ /** Error if fetch failed */
214
+ error?: string;
215
+ }
216
+
217
+ // ─── GitHub Tree API types ────────────────────────────────────────────────────
218
+
219
+ export interface GitTreeItem {
220
+ path: string;
221
+ mode: string;
222
+ type: "blob" | "tree";
223
+ sha: string;
224
+ size?: number;
225
+ url: string;
226
+ }
227
+
228
+ export interface GitTreeResponse {
229
+ sha: string;
230
+ url: string;
231
+ tree: GitTreeItem[];
232
+ truncated: boolean;
233
+ }
234
+
235
+ // MCP Registry Types (registry.modelcontextprotocol.io)
236
+ export interface McpRegistryServer {
237
+ name: string;
238
+ url: string;
239
+ short_description: string;
240
+ version?: string;
241
+ source_code_url?: string;
242
+ package_registry?: string;
243
+ published_at?: string;
244
+ }
245
+
246
+ export interface McpRegistryResponse {
247
+ servers: McpRegistryServer[];
248
+ next_cursor?: string;
249
+ }
250
+
251
+ // installed_plugins.json registry types
252
+ export interface InstalledPluginEntry {
253
+ scope: "user" | "project" | "local";
254
+ projectPath?: string;
255
+ installPath: string;
256
+ version: string;
257
+ installedAt: string;
258
+ lastUpdated: string;
259
+ gitCommitSha?: string;
260
+ }
261
+
262
+ export interface InstalledPluginsRegistry {
263
+ version: number;
264
+ plugins: Record<string, InstalledPluginEntry[]>;
265
+ }
266
+
267
+ // ─── Plugin Conventions (declarative project hygiene) ───────────────────────────
268
+
269
+ /** Convention declarations for a plugin */
270
+ export interface PluginConventions {
271
+ gitignore?: GitignoreConventions;
272
+ claudemd?: ClaudeMdConventions;
273
+ }
274
+
275
+ /** Gitignore entries a plugin needs */
276
+ export interface GitignoreConventions {
277
+ /** Entries for project .gitignore (team-visible, committed) */
278
+ project?: string[];
279
+ /** Advisory entries for global gitignore (personal, not committed).
280
+ * Resolved via `git config --global core.excludesfile`,
281
+ * falling back to ~/.config/git/ignore if unset. */
282
+ global?: string[];
283
+ }
284
+
285
+ /** CLAUDE.md section injection config */
286
+ export interface ClaudeMdConventions {
287
+ /** Section identifier used in markers: <!-- BEGIN magus:{section} -->
288
+ * MUST equal the plugin's `name` field. */
289
+ section: string;
290
+ /** Path to markdown template, relative to plugin root */
291
+ template: string;
292
+ /** Semantic version of the template content */
293
+ version: string;
294
+ }
295
+
296
+ // ─── Plugin Profile Types ──────────────────────────────────────────────────────
297
+
298
+ export interface Profile {
299
+ name: string;
300
+ plugins: Record<string, boolean>;
301
+ createdAt: string;
302
+ updatedAt: string;
303
+ }
304
+
305
+ export interface ProfilesFile {
306
+ version: number;
307
+ profiles: Record<string, Profile>;
308
+ }
309
+
310
+ /** A profile with its id and scope, as used in UI lists */
311
+ export interface ProfileEntry {
312
+ id: string;
313
+ name: string;
314
+ plugins: Record<string, boolean>;
315
+ createdAt: string;
316
+ updatedAt: string;
317
+ scope: "user" | "project";
318
+ }
319
+
320
+ // NOTE: The built-in profile type lives with its data in
321
+ // data/predefined-profiles.ts (that file declares and exports its own
322
+ // PredefinedProfile). A second, unused definition previously lived here and
323
+ // has been removed to avoid two competing shapes.
324
+
325
+ // ─── Team Profile Manifest (v2, committed .claude/profiles.json) ────────────────
326
+ //
327
+ // The v1 `Profile`/`ProfilesFile` above are the TUI's saved presets (plugins
328
+ // only). The v2 manifest below is the committed, team-shared source of truth:
329
+ // a superset that also carries marketplaces, MCP servers, CLI tools, skills,
330
+ // settings, and env requirements. A v1 profile is a structural subset of a v2
331
+ // entry, so v1 files migrate forward by a version bump alone.
332
+
333
+ /** A marketplace a profile depends on (registered before its plugins install). */
334
+ export interface ProfileMarketplaceRef {
335
+ source: "github" | "directory";
336
+ /** owner/repo — for source: "github" */
337
+ repo?: string;
338
+ /** absolute or repo-relative path — for source: "directory" */
339
+ path?: string;
340
+ }
341
+
342
+ /** A skill a profile installs (resolved from a GitHub repo + path). */
343
+ export interface ProfileSkillRef {
344
+ name: string;
345
+ repo: string;
346
+ path: string;
347
+ }
348
+
349
+ /** Environment variables a profile declares (values live in settings.local.json). */
350
+ export interface ProfileEnvRequirements {
351
+ required?: string[];
352
+ optional?: string[];
353
+ }
354
+
355
+ /**
356
+ * A single team profile in .claude/profiles.json (v2).
357
+ * `plugins` maps a plugin id to a version pin ("1.2.0"), "latest", or `true`
358
+ * (equivalent to "latest" — the shape v1 saved profiles use).
359
+ */
360
+ export interface ProfileManifestEntry {
361
+ name: string;
362
+ /** Optional predefined-profile id to inherit plugins/skills/settings from. */
363
+ extends?: string;
364
+ marketplaces?: Record<string, ProfileMarketplaceRef>;
365
+ plugins?: Record<string, string | boolean>;
366
+ mcpServers?: Record<string, McpServerConfig>;
367
+ /** cliTool name -> version pin | "latest". */
368
+ cliTools?: Record<string, string>;
369
+ skills?: ProfileSkillRef[];
370
+ settings?: Record<string, unknown>;
371
+ /**
372
+ * Per-subagent model routing. A PROFILE property, so switching profiles
373
+ * switches routing, and materialization writes it to
374
+ * `_profiles/<name>/models.json` for `.claude/models.json` to link at.
375
+ */
376
+ models?: ModelsConfig;
377
+ env?: ProfileEnvRequirements;
378
+ /** Optional bookkeeping carried over from v1 saved profiles. */
379
+ createdAt?: string;
380
+ updatedAt?: string;
381
+ }
382
+
383
+ /** The .claude/profiles.json manifest (v2). */
384
+ export interface ProfileManifest {
385
+ version: 2;
386
+ /** When true, `install --check` fails on any plugin version drift. */
387
+ strictVersions?: boolean;
388
+ profiles: Record<string, ProfileManifestEntry>;
389
+ }
390
+
391
+ // ─── Plugin binary requirements (plugin.json `requires.bin`) ────────────────────
392
+
393
+ /** How a binary dependency is installed. */
394
+ export type BinInstaller = "bun" | "brew" | "npm" | "pip" | "go";
395
+
396
+ /** A single binary dependency a plugin (or profile) declares. */
397
+ export interface BinRequirement {
398
+ /** The executable name expected on PATH (also the dedup key). */
399
+ name: string;
400
+ via: BinInstaller;
401
+ /** Package id for bun/npm/pip (defaults to `name`). */
402
+ package?: string;
403
+ /** Formula for brew (defaults to `name`). */
404
+ formula?: string;
405
+ /** Module path for `go install` (defaults to `name`). */
406
+ module?: string;
407
+ /** Command that verifies presence, e.g. "tmux -V" (defaults to `<name> --version`). */
408
+ check?: string;
409
+ /** Optional version pin (real for bun/npm/pip; advisory for brew/go). */
410
+ version?: string;
411
+ }
412
+
413
+ /** The `requires` block a plugin may declare in its plugin.json. */
414
+ export interface PluginRequires {
415
+ bin?: BinRequirement[];
416
+ }
417
+
418
+ // ─── Resolved install closure (resolver output) ─────────────────────────────────
419
+
420
+ /** A binary requirement after dedup + pin precedence, with provenance. */
421
+ export interface ResolvedBin extends BinRequirement {
422
+ /** Where this requirement came from, for diagnostics. */
423
+ sources: string[];
424
+ }
425
+
426
+ /**
427
+ * The fully-resolved set of things to install for a profile (or the union of
428
+ * all profiles). Produced by the resolver; consumed by `magus install`.
429
+ */
430
+ export interface ResolvedClosure {
431
+ marketplaces: Record<string, ProfileMarketplaceRef>;
432
+ /** pluginId -> version pin | "latest". */
433
+ plugins: Record<string, string>;
434
+ mcpServers: Record<string, McpServerConfig>;
435
+ bins: ResolvedBin[];
436
+ skills: ProfileSkillRef[];
437
+ settings: Record<string, unknown>;
438
+ /**
439
+ * The profile's model routing, if it declares any. Absent means the
440
+ * materialized profile carries no models.json — and materialization DELETES
441
+ * a stale one, which is what makes `magus models off` take effect.
442
+ */
443
+ models?: ModelsConfig;
444
+ env: { required: string[]; optional: string[] };
445
+ /** Cross-profile version conflicts detected while unioning profiles. */
446
+ conflicts?: string[];
447
+ }