feat: note in the plugins tab that community plugins are coming

This commit is contained in:
LukeGus committed 2026-10-09 14:16:29 -05:00
1 parent 2ba11652eb
commit 28fe98e787
6 files changed
+62 -2

No files matched your search

+1
View File
@@ -7,6 +7,7 @@
- Plugins. Every feature beyond hosts, credentials and sharing is now its own plugin with its own repo, and you pick which ones you want
- A Plugins tab to install, update, pin, turn off and remove plugins from the official registry, with release notes and a beta channel per plugin
- Developer mode to install a plugin from a file, and a plugin SDK on npm to build your own
- The community plugin registry is open for submissions. Termix can install community plugins in a later update
- Redesigned UI with a Manage tab for hosts and credentials and a Settings tab with search
- New full screen onboarding where you choose which plugins to start with
- Beta channel for Termix itself in Settings > Updates
+1 -1
View File
@@ -92,7 +92,7 @@ Plugins add everything else. The official ones ship with Termix, and admins can
| [Web Endpoint](https://github.com/Termix-SSH/Plugin-Web-Endpoint) | Open a host's web UI inside Termix, directly or over an SSH tunnel. |
| [Workspaces](https://github.com/Termix-SSH/Plugin-Workspaces) | Save your open tabs and split layouts and reopen them in one click. |
Want to build your own? Start from the [plugin template](https://github.com/Termix-SSH/Termix-Plugin-Template). Plugins you can install are listed in the [registry](https://github.com/Termix-SSH/Termix-Registry).
Want to build your own? Start from the [plugin template](https://github.com/Termix-SSH/Termix-Plugin-Template). Plugins you can install are listed in the [registry](https://github.com/Termix-SSH/Termix-Registry). Its community registry is open for submissions now, and Termix will be able to install community plugins in a later update. See [submitting a plugin](https://docs.termix.site/develop/community-registry).
<br />
+2 -1
View File
@@ -37,5 +37,6 @@
"plugins": "guide/plugins",
"pluginCatalog": "plugins",
"cli": "cli",
"develop": "develop"
"develop": "develop",
"communityRegistry": "develop/community-registry"
}
+2
View File
@@ -2017,6 +2017,8 @@
"noneInstalled": "No plugins installed yet. Browse to add some.",
"nothingHere": "Nothing here.",
"nothingHereHint": "Try another category or search.",
"communitySoon": "Community plugins are coming in a later update. Plugin authors can already submit theirs to the community registry.",
"communitySubmit": "How to submit",
"upToDate": "Everything is up to date.",
"lastChecked": "Last checked {{time}}",
"updatesReady_one": "{{count}} update ready.",
+7
View File
@@ -658,6 +658,13 @@ function BrowseSection({
))}
</div>
)}
<p className="text-[11px] text-muted-foreground">
{t("plugins.manager.communitySoon")}{" "}
<DocsLink core="communityRegistry" className="text-[11px]">
{t("plugins.manager.communitySubmit")}
</DocsLink>
</p>
</div>
);
}
+49
View File
@@ -0,0 +1,49 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
import i18next from "i18next";
import { I18nextProvider, initReactI18next } from "react-i18next";
import en from "@/locales/en.json";
import { PluginsTab } from "@/plugins/PluginsTab";
import { docsUrl } from "@/lib/docs";
vi.mock("@/plugins/use-plugins-manager", () => ({
usePluginsManager: () => ({
plugins: [],
loading: false,
refreshing: false,
refresh: vi.fn(),
registryError: null,
managedByServer: false,
busy: new Set(),
consent: null,
setConsent: vi.fn(),
confirmConsent: vi.fn(),
developerMode: false,
signedOnly: false,
}),
}));
afterEach(cleanup);
describe("PluginsTab", () => {
it("tells people community plugins are coming and links the guide", async () => {
const i18n = i18next.createInstance();
await i18n.use(initReactI18next).init({
lng: "en",
resources: { en: { translation: en } },
});
render(
<I18nextProvider i18n={i18n}>
<PluginsTab />
</I18nextProvider>,
);
fireEvent.click(screen.getByText(en.plugins.manager.tabs.browse));
expect(
screen.getByText(en.plugins.manager.communitySoon, { exact: false }),
).toBeTruthy();
const link = screen.getByText(en.plugins.manager.communitySubmit);
expect(link.getAttribute("href")).toBe(docsUrl("communityRegistry"));
});
});