mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-28 06:05:24 +00:00
chore: rework plugin readmes, json changelogs and standalone repo setup
This commit is contained in:
1 parent
a8f383d2b3
commit
29a946d02e
500 files changed
+6729
-1250
No files matched your search
@@ -435,7 +435,9 @@ Interested in a paid placement to support development? Email [mail@termix.site](
|
||||
|
||||
## Support
|
||||
|
||||
Need help or want to request a feature? Open a [new issue](https://github.com/Termix-SSH/Support/issues) and add as much detail as you can, in English if possible. You can also ask in the support channel on [Discord](https://discord.gg/jVQGdvHDrf), though replies there can take longer.
|
||||
To report a bug or request a feature, open a [support ticket](https://github.com/Termix-SSH/Support/issues/new/choose). You need to be logged in to GitHub. Please be as detailed as possible, preferably in English.
|
||||
|
||||
For discussions and questions, join the [Discord](https://discord.gg/jVQGdvHDrf) server.
|
||||
|
||||
<br />
|
||||
|
||||
@@ -501,4 +503,4 @@ See [Projects](https://github.com/orgs/Termix-SSH/projects/5) for all planned fe
|
||||
|
||||
## License
|
||||
|
||||
Distributed under the Apache License Version 2.0. See `LICENSE` for more information.
|
||||
Distributed under the Apache License Version 2.0. See [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) for more information.
|
||||
@@ -440,7 +440,9 @@ Termix مجاني ومفتوح المصدر، بلا اشتراكات ولا خ
|
||||
|
||||
## الدعم
|
||||
|
||||
تحتاج مساعدة أو تريد طلب ميزة؟ افتح [مشكلة جديدة](https://github.com/Termix-SSH/Support/issues) واذكر أكبر قدر ممكن من التفاصيل، بالإنجليزية إن أمكن. يمكنك أيضًا السؤال في قناة الدعم على [Discord](https://discord.gg/jVQGdvHDrf)، وإن كانت الردود هناك قد تتأخر.
|
||||
للإبلاغ عن خطأ أو طلب ميزة، افتح [تذكرة دعم](https://github.com/Termix-SSH/Support/issues/new/choose). يجب أن تكون مسجلًا الدخول إلى GitHub. اذكر أكبر قدر ممكن من التفاصيل، ويفضل بالإنجليزية.
|
||||
|
||||
للنقاشات والأسئلة، انضم إلى خادم [Discord](https://discord.gg/jVQGdvHDrf).
|
||||
|
||||
<br />
|
||||
|
||||
@@ -506,4 +508,4 @@ Termix مجاني ومفتوح المصدر، بلا اشتراكات ولا خ
|
||||
|
||||
## الترخيص
|
||||
|
||||
يوزَّع بموجب ترخيص Apache الإصدار 2.0. راجع ملف `LICENSE` لمزيد من المعلومات.
|
||||
يوزَّع بموجب ترخيص Apache الإصدار 2.0. راجع ملف [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) لمزيد من المعلومات.
|
||||
@@ -434,7 +434,9 @@ Termix 免费且开源,没有订阅也没有付费方案。如果你觉得它
|
||||
|
||||
## 支持
|
||||
|
||||
需要帮助或想提功能建议?可以[新建一个 issue](https://github.com/Termix-SSH/Support/issues),尽量写清楚细节,如果方便请用英文。你也可以在 [Discord](https://discord.gg/jVQGdvHDrf) 的支持频道提问,不过那边回复可能会慢一些。
|
||||
要报告 bug 或提功能建议,请提交一个[支持工单](https://github.com/Termix-SSH/Support/issues/new/choose)。你需要先登录 GitHub。请尽量写清楚细节,最好用英文。
|
||||
|
||||
讨论和提问请加入 [Discord](https://discord.gg/jVQGdvHDrf) 服务器。
|
||||
|
||||
<br />
|
||||
|
||||
@@ -500,5 +502,5 @@ Termix 免费且开源,没有订阅也没有付费方案。如果你觉得它
|
||||
|
||||
## 许可证
|
||||
|
||||
基于 Apache License 2.0 发布。详见 `LICENSE`。
|
||||
基于 Apache License 2.0 发布。详见 [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE)。
|
||||
</content>
|
||||
@@ -435,7 +435,9 @@ Interesse an einer bezahlten Platzierung zur Unterstützung der Entwicklung? Sch
|
||||
|
||||
## Support
|
||||
|
||||
Brauchst du Hilfe oder möchtest du eine Funktion vorschlagen? Erstelle ein [neues Issue](https://github.com/Termix-SSH/Support/issues) und beschreibe es so genau wie möglich, nach Möglichkeit auf Englisch. Du kannst auch im Support-Kanal auf [Discord](https://discord.gg/jVQGdvHDrf) fragen, dort dauern Antworten aber manchmal länger.
|
||||
Um einen Fehler zu melden oder eine Funktion vorzuschlagen, erstelle ein [Support-Ticket](https://github.com/Termix-SSH/Support/issues/new/choose). Du musst bei GitHub angemeldet sein. Beschreibe alles so genau wie möglich, am besten auf Englisch.
|
||||
|
||||
Für Diskussionen und Fragen tritt dem [Discord](https://discord.gg/jVQGdvHDrf)-Server bei.
|
||||
|
||||
<br />
|
||||
|
||||
@@ -501,4 +503,4 @@ Alle geplanten Funktionen stehen unter [Projects](https://github.com/orgs/Termix
|
||||
|
||||
## Lizenz
|
||||
|
||||
Veröffentlicht unter der Apache-Lizenz Version 2.0. Mehr dazu in `LICENSE`.
|
||||
Veröffentlicht unter der Apache-Lizenz Version 2.0. Mehr dazu in [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE).
|
||||
@@ -435,7 +435,9 @@ Termix es gratuito y de código abierto, sin suscripciones ni planes de pago. Si
|
||||
|
||||
## Soporte
|
||||
|
||||
¿Necesitas ayuda o quieres pedir una función? Abre una [nueva incidencia](https://github.com/Termix-SSH/Support/issues) y añade todo el detalle que puedas, en inglés si te es posible. También puedes preguntar en el canal de soporte de [Discord](https://discord.gg/jVQGdvHDrf), aunque allí las respuestas pueden tardar más.
|
||||
Para informar de un error o pedir una función, abre un [ticket de soporte](https://github.com/Termix-SSH/Support/issues/new/choose). Necesitas haber iniciado sesión en GitHub. Añade todo el detalle que puedas, preferiblemente en inglés.
|
||||
|
||||
Para debates y preguntas, únete al servidor de [Discord](https://discord.gg/jVQGdvHDrf).
|
||||
|
||||
<br />
|
||||
|
||||
@@ -501,4 +503,4 @@ Todas las funciones planeadas están en [Projects](https://github.com/orgs/Termi
|
||||
|
||||
## Licencia
|
||||
|
||||
Distribuido bajo la Licencia Apache versión 2.0. Consulta `LICENSE` para más información.
|
||||
Distribuido bajo la Licencia Apache versión 2.0. Consulta [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) para más información.
|
||||
@@ -433,7 +433,9 @@ Intéressé par un emplacement payant pour soutenir le développement ? Écrivez
|
||||
|
||||
## Support
|
||||
|
||||
Besoin d'aide ou envie de proposer une fonctionnalité ? Ouvrez un [nouveau ticket](https://github.com/Termix-SSH/Support/issues) avec le plus de détails possible, en anglais si vous le pouvez. Vous pouvez aussi demander dans le canal support sur [Discord](https://discord.gg/jVQGdvHDrf), même si les réponses y prennent parfois plus de temps.
|
||||
Pour signaler un bug ou proposer une fonctionnalité, ouvrez un [ticket de support](https://github.com/Termix-SSH/Support/issues/new/choose). Vous devez être connecté à GitHub. Donnez le plus de détails possible, de préférence en anglais.
|
||||
|
||||
Pour les discussions et les questions, rejoignez le serveur [Discord](https://discord.gg/jVQGdvHDrf).
|
||||
|
||||
<br />
|
||||
|
||||
@@ -499,4 +501,4 @@ Toutes les fonctionnalités prévues sont dans [Projects](https://github.com/org
|
||||
|
||||
## Licence
|
||||
|
||||
Distribué sous licence Apache version 2.0. Voir `LICENSE` pour plus d'informations.
|
||||
Distribué sous licence Apache version 2.0. Voir [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) pour plus d'informations.
|
||||
@@ -440,7 +440,9 @@ Termix मुफ़्त और ओपन सोर्स है, न कोई
|
||||
|
||||
## सहायता
|
||||
|
||||
मदद चाहिए या कोई सुविधा माँगनी है? एक [नया issue](https://github.com/Termix-SSH/Support/issues) खोलें और जितना हो सके विस्तार से लिखें, हो सके तो अंग्रेज़ी में। आप [Discord](https://discord.gg/jVQGdvHDrf) के सपोर्ट चैनल में भी पूछ सकते हैं, हालाँकि वहाँ जवाब आने में ज़्यादा समय लग सकता है।
|
||||
बग रिपोर्ट करने या कोई सुविधा माँगने के लिए एक [सपोर्ट टिकट](https://github.com/Termix-SSH/Support/issues/new/choose) खोलें। इसके लिए GitHub में लॉग इन होना ज़रूरी है। जितना हो सके विस्तार से लिखें, हो सके तो अंग्रेज़ी में।
|
||||
|
||||
चर्चा और सवालों के लिए [Discord](https://discord.gg/jVQGdvHDrf) सर्वर से जुड़ें।
|
||||
|
||||
<br />
|
||||
|
||||
@@ -506,4 +508,4 @@ Termix मुफ़्त और ओपन सोर्स है, न कोई
|
||||
|
||||
## लाइसेंस
|
||||
|
||||
Apache License संस्करण 2.0 के तहत वितरित। अधिक जानकारी के लिए `LICENSE` देखें।
|
||||
Apache License संस्करण 2.0 के तहत वितरित। अधिक जानकारी के लिए [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) देखें।
|
||||
@@ -435,7 +435,9 @@ Ti interessa uno spazio a pagamento per sostenere lo sviluppo? Scrivi a [mail@te
|
||||
|
||||
## Supporto
|
||||
|
||||
Ti serve aiuto o vuoi proporre una funzionalità? Apri una [nuova issue](https://github.com/Termix-SSH/Support/issues) con più dettagli possibile, in inglese se ci riesci. Puoi anche chiedere nel canale di supporto su [Discord](https://discord.gg/jVQGdvHDrf), anche se lì le risposte possono richiedere più tempo.
|
||||
Per segnalare un bug o proporre una funzionalità, apri un [ticket di supporto](https://github.com/Termix-SSH/Support/issues/new/choose). Devi aver effettuato l'accesso a GitHub. Aggiungi più dettagli possibile, preferibilmente in inglese.
|
||||
|
||||
Per discussioni e domande, unisciti al server [Discord](https://discord.gg/jVQGdvHDrf).
|
||||
|
||||
<br />
|
||||
|
||||
@@ -501,6 +503,6 @@ Tutte le funzionalità pianificate sono su [Projects](https://github.com/orgs/Te
|
||||
|
||||
## Licenza
|
||||
|
||||
Distribuito con licenza Apache versione 2.0. Vedi `LICENSE` per maggiori informazioni.
|
||||
Distribuito con licenza Apache versione 2.0. Vedi [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) per maggiori informazioni.
|
||||
</content>
|
||||
</invoke>
|
||||
@@ -435,7 +435,9 @@ Termix は無料でオープンソースで、サブスクリプションも有
|
||||
|
||||
## サポート
|
||||
|
||||
困ったときや機能の要望があるときは、[新しい issue](https://github.com/Termix-SSH/Support/issues) を作って、できるだけ詳しく、できれば英語で書いてください。[Discord](https://discord.gg/jVQGdvHDrf) のサポートチャンネルでも質問できますが、返信には時間がかかることがあります。
|
||||
バグの報告や機能の要望は、[サポートチケット](https://github.com/Termix-SSH/Support/issues/new/choose)を作成してください。GitHub へのログインが必要です。できるだけ詳しく、できれば英語で書いてください。
|
||||
|
||||
議論や質問は [Discord](https://discord.gg/jVQGdvHDrf) サーバーに参加してください。
|
||||
|
||||
<br />
|
||||
|
||||
@@ -501,5 +503,5 @@ Termix は無料でオープンソースで、サブスクリプションも有
|
||||
|
||||
## ライセンス
|
||||
|
||||
Apache License 2.0 のもとで配布しています。詳しくは `LICENSE` をご覧ください。
|
||||
Apache License 2.0 のもとで配布しています。詳しくは [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) をご覧ください。
|
||||
</content>
|
||||
@@ -433,7 +433,9 @@ Termix는 무료 오픈 소스이고 구독이나 유료 요금제가 없습니
|
||||
|
||||
## 지원
|
||||
|
||||
도움이 필요하거나 기능을 제안하고 싶으신가요? [새 이슈](https://github.com/Termix-SSH/Support/issues)를 올리면서 되도록 자세히, 가능하면 영어로 적어 주세요. [Discord](https://discord.gg/jVQGdvHDrf) 지원 채널에서 물어봐도 되지만 답변이 늦을 수 있습니다.
|
||||
버그를 신고하거나 기능을 요청하려면 [지원 티켓](https://github.com/Termix-SSH/Support/issues/new/choose)을 여세요. GitHub에 로그인되어 있어야 합니다. 되도록 자세히, 가능하면 영어로 적어 주세요.
|
||||
|
||||
토론과 질문은 [Discord](https://discord.gg/jVQGdvHDrf) 서버에 참여해 주세요.
|
||||
|
||||
<br />
|
||||
|
||||
@@ -499,4 +501,4 @@ Termix는 무료 오픈 소스이고 구독이나 유료 요금제가 없습니
|
||||
|
||||
## 라이선스
|
||||
|
||||
Apache License 2.0에 따라 배포합니다. 자세한 내용은 `LICENSE`를 참고하세요.
|
||||
Apache License 2.0에 따라 배포합니다. 자세한 내용은 [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE)를 참고하세요.
|
||||
@@ -431,7 +431,9 @@ Tens interesse num espaço pago para apoiar o desenvolvimento? Escreve para [mai
|
||||
|
||||
## Suporte
|
||||
|
||||
Precisas de ajuda ou queres pedir uma funcionalidade? Abre uma [nova issue](https://github.com/Termix-SSH/Support/issues) com o máximo de detalhes possível, em inglês se der. Também podes perguntar no canal de suporte do [Discord](https://discord.gg/jVQGdvHDrf), embora as respostas por lá possam demorar mais.
|
||||
Para reportar um bug ou pedir uma funcionalidade, abre um [ticket de suporte](https://github.com/Termix-SSH/Support/issues/new/choose). Precisas de ter sessão iniciada no GitHub. Dá o máximo de detalhes possível, de preferência em inglês.
|
||||
|
||||
Para discussões e perguntas, junta-te ao servidor do [Discord](https://discord.gg/jVQGdvHDrf).
|
||||
|
||||
<br />
|
||||
|
||||
@@ -497,4 +499,4 @@ Todas as funcionalidades planejadas estão em [Projects](https://github.com/orgs
|
||||
|
||||
## Licença
|
||||
|
||||
Distribuído sob a Licença Apache versão 2.0. Vê `LICENSE` para mais informações.
|
||||
Distribuído sob a Licença Apache versão 2.0. Vê [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) para mais informações.
|
||||
@@ -431,7 +431,9 @@ Termix бесплатен и открыт, без подписок и платн
|
||||
|
||||
## Поддержка
|
||||
|
||||
Нужна помощь или хотите предложить функцию? Создайте [новое обращение](https://github.com/Termix-SSH/Support/issues) и опишите всё как можно подробнее, по возможности на английском. Ещё можно спросить в канале поддержки в [Discord](https://discord.gg/jVQGdvHDrf), хотя там ответа иногда приходится ждать дольше.
|
||||
Чтобы сообщить об ошибке или предложить функцию, создайте [обращение в поддержку](https://github.com/Termix-SSH/Support/issues/new/choose). Нужно войти в GitHub. Опишите всё как можно подробнее, желательно на английском.
|
||||
|
||||
Для обсуждений и вопросов присоединяйтесь к серверу [Discord](https://discord.gg/jVQGdvHDrf).
|
||||
|
||||
<br />
|
||||
|
||||
@@ -497,4 +499,4 @@ Termix бесплатен и открыт, без подписок и платн
|
||||
|
||||
## Лицензия
|
||||
|
||||
Распространяется по лицензии Apache версии 2.0. Подробности в файле `LICENSE`.
|
||||
Распространяется по лицензии Apache версии 2.0. Подробности в файле [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE).
|
||||
@@ -431,7 +431,9 @@ Geliştirmeyi desteklemek için ücretli bir yerleşim ilginizi çeker mi? [mail
|
||||
|
||||
## Destek
|
||||
|
||||
Yardıma mı ihtiyacınız var ya da bir özellik mi istiyorsunuz? [Yeni bir konu](https://github.com/Termix-SSH/Support/issues) açın ve olabildiğince ayrıntı ekleyin, mümkünse İngilizce yazın. [Discord](https://discord.gg/jVQGdvHDrf) üzerindeki destek kanalında da sorabilirsiniz, ancak oradaki yanıtlar daha uzun sürebilir.
|
||||
Bir hata bildirmek veya özellik istemek için bir [destek talebi](https://github.com/Termix-SSH/Support/issues/new/choose) açın. GitHub'a giriş yapmış olmanız gerekir. Olabildiğince ayrıntılı yazın, mümkünse İngilizce.
|
||||
|
||||
Tartışmalar ve sorular için [Discord](https://discord.gg/jVQGdvHDrf) sunucusuna katılın.
|
||||
|
||||
<br />
|
||||
|
||||
@@ -497,4 +499,4 @@ Planlanan tüm özellikler [Projects](https://github.com/orgs/Termix-SSH/project
|
||||
|
||||
## Lisans
|
||||
|
||||
Apache Lisansı Sürüm 2.0 ile dağıtılır. Ayrıntılar için `LICENSE` dosyasına bakın.
|
||||
Apache Lisansı Sürüm 2.0 ile dağıtılır. Ayrıntılar için [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) dosyasına bakın.
|
||||
@@ -431,7 +431,9 @@ Bạn muốn đặt quảng cáo trả phí để ủng hộ việc phát triể
|
||||
|
||||
## Hỗ trợ
|
||||
|
||||
Cần giúp đỡ hoặc muốn đề xuất tính năng? Hãy mở một [issue mới](https://github.com/Termix-SSH/Support/issues) và mô tả càng chi tiết càng tốt, bằng tiếng Anh nếu được. Bạn cũng có thể hỏi trong kênh hỗ trợ trên [Discord](https://discord.gg/jVQGdvHDrf), tuy nhiên ở đó có thể lâu được trả lời hơn.
|
||||
Để báo lỗi hoặc đề xuất tính năng, hãy mở một [phiếu hỗ trợ](https://github.com/Termix-SSH/Support/issues/new/choose). Bạn cần đăng nhập GitHub. Hãy mô tả càng chi tiết càng tốt, ưu tiên bằng tiếng Anh.
|
||||
|
||||
Để thảo luận và đặt câu hỏi, hãy tham gia máy chủ [Discord](https://discord.gg/jVQGdvHDrf).
|
||||
|
||||
<br />
|
||||
|
||||
@@ -497,4 +499,4 @@ Toàn bộ tính năng dự kiến nằm ở [Projects](https://github.com/orgs/
|
||||
|
||||
## Giấy phép
|
||||
|
||||
Phát hành theo Giấy phép Apache phiên bản 2.0. Xem `LICENSE` để biết thêm chi tiết.
|
||||
Phát hành theo Giấy phép Apache phiên bản 2.0. Xem [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) để biết thêm chi tiết.
|
||||
Generated
+171
-1
@@ -18568,7 +18568,7 @@
|
||||
"packages/plugin-sdk": {
|
||||
"name": "@termix/plugin-sdk",
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@tailwindcss/node": "^4.2.4",
|
||||
"@tailwindcss/oxide": "^4.2.4",
|
||||
@@ -18623,13 +18623,18 @@
|
||||
"acme-client": "^5.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18649,6 +18654,8 @@
|
||||
"remark-gfm": "^4.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -18656,7 +18663,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18676,6 +18686,8 @@
|
||||
"nodemailer": "^10.0.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -18683,7 +18695,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18701,6 +18716,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -18708,7 +18725,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18732,13 +18752,18 @@
|
||||
"react-xtermjs": "^1.0.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18777,6 +18802,8 @@
|
||||
"remark-gfm": "^4.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/jest-dom": "^7.0.1",
|
||||
@@ -18786,7 +18813,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18813,12 +18843,17 @@
|
||||
"tailwind-merge": "^3.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18838,6 +18873,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -18845,7 +18882,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18862,6 +18902,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/jest-dom": "^7.0.1",
|
||||
@@ -18870,7 +18912,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18890,6 +18935,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -18897,7 +18944,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18917,12 +18967,17 @@
|
||||
"react-cytoscapejs": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18940,6 +18995,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -18947,7 +19004,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -18988,12 +19048,17 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19014,13 +19079,18 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19039,6 +19109,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19046,7 +19118,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19068,13 +19143,18 @@
|
||||
"serialport": "^13.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19093,12 +19173,17 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19119,6 +19204,8 @@
|
||||
"redis": "^6.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19126,7 +19213,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19145,6 +19235,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19152,7 +19244,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19178,6 +19273,8 @@
|
||||
"react-xtermjs": "^1.0.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/jest-dom": "^7.0.1",
|
||||
@@ -19187,7 +19284,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19212,6 +19312,8 @@
|
||||
"undici": "^8.10.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19219,7 +19321,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19238,6 +19343,8 @@
|
||||
"redis": "^6.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19245,7 +19352,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19263,6 +19373,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19270,7 +19382,10 @@
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19288,13 +19403,18 @@
|
||||
"drizzle-orm": "^0.45.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19311,6 +19431,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19318,7 +19440,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19337,6 +19462,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19344,7 +19471,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19364,6 +19494,8 @@
|
||||
"speakeasy": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19371,7 +19503,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19389,6 +19524,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19396,7 +19533,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19416,6 +19556,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19423,7 +19565,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19442,11 +19587,16 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19459,10 +19609,15 @@
|
||||
"name": "@termix-plugin/warpgate",
|
||||
"version": "1.0.0",
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19476,6 +19631,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/jest-dom": "^7.0.1",
|
||||
@@ -19483,7 +19640,10 @@
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19504,6 +19664,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19511,7 +19673,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -19529,6 +19694,8 @@
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -19536,7 +19703,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
||||
@@ -1,18 +1,62 @@
|
||||
# @termix/plugin-sdk
|
||||
<div align="center">
|
||||
|
||||
Everything a [Termix](https://github.com/Termix-SSH/Termix) plugin builds
|
||||
against: the types for `activate(ctx)` and `activate(app)`, table
|
||||
definitions, the manifest schema, test helpers, a vitest preset and the
|
||||
`termix-plugin` CLI.
|
||||
<img src="https://raw.githubusercontent.com/Termix-SSH/Termix/main/public/icon.svg" width="120" height="120" alt="Termix Logo" />
|
||||
|
||||
<h1>Termix Plugin SDK</h1>
|
||||
|
||||
<p>Everything you need to build a Termix plugin</p>
|
||||
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
## Overview
|
||||
|
||||
`@termix/plugin-sdk` is what every [Termix](https://github.com/Termix-SSH/Termix) plugin builds against, including the ones that ship with Termix. It has the types for a plugin's backend and frontend, table definitions, the manifest schema, test helpers, and the `termix-plugin` CLI. The easiest way to start is the [Termix Plugin Template](https://github.com/Termix-SSH/Termix-Plugin-Template).
|
||||
|
||||
<br />
|
||||
|
||||
## What's Inside
|
||||
|
||||
- **Backend:** the types for `activate(ctx)`, database and table helpers, host commands and SSH certificates
|
||||
- **Frontend:** the types for `activate(app)`, plus `@termix/plugin-sdk/ui`, the components and theme Termix serves to plugins
|
||||
- **Manifest:** the manifest schema, the capability catalog and settings types
|
||||
- **Testing:** `createMockCtx()`, `createTestDb()`, `renderWithApp()` and a Vitest preset
|
||||
- **CLI:** `termix-plugin`, which builds, tests, validates, packs and signs a plugin and writes its migrations
|
||||
|
||||
<br />
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
npm install --save-dev @termix/plugin-sdk
|
||||
npx termix-plugin build # bundle dist/backend.js and dist/frontend.js
|
||||
npx termix-plugin test # run the plugin's vitest suite
|
||||
npx termix-plugin validate # check manifest.json and the files it names
|
||||
npx termix-plugin pack # write <id>-<version>.tmxplug
|
||||
npx termix-plugin sign <file.tmxplug> # needs TERMIX_PLUGIN_SIGNING_KEY
|
||||
```
|
||||
|
||||
Start from
|
||||
[Termix-Plugin-Template](https://github.com/Termix-SSH/Termix-Plugin-Template).
|
||||
<br />
|
||||
|
||||
## CLI
|
||||
|
||||
```bash
|
||||
npx termix-plugin build # bundle dist/backend.js and dist/frontend.js
|
||||
npx termix-plugin test # run the plugin's Vitest suite
|
||||
npx termix-plugin validate # check manifest.json and the files it names
|
||||
npx termix-plugin migrations # write migrations from the table definitions
|
||||
npx termix-plugin pack # write <id>-<version>.tmxplug
|
||||
npx termix-plugin sign <file.tmxplug> # sign it, needs TERMIX_PLUGIN_SIGNING_KEY
|
||||
npx termix-plugin verify <file.tmxplug> --key <base64> # check a signature
|
||||
npx termix-plugin keygen --out <dir> # make a new signing key pair
|
||||
```
|
||||
|
||||
<br />
|
||||
|
||||
## Support
|
||||
|
||||
To report a bug or request a feature, open a [support ticket](https://github.com/Termix-SSH/Support/issues/new/choose). You need to be logged in to GitHub. Please be as detailed as possible, preferably in English.
|
||||
|
||||
For discussions and questions, join the [Discord](https://discord.gg/jVQGdvHDrf) server.
|
||||
|
||||
<br />
|
||||
|
||||
## License
|
||||
|
||||
Distributed under the Apache License Version 2.0. See [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) for more information.
|
||||
@@ -2,6 +2,7 @@ import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { readManifest } from "../lib/plugin-dir.mjs";
|
||||
import { validateChangelog } from "../lib/changelog.mjs";
|
||||
|
||||
/**
|
||||
* The manifest rules live in src/manifest.ts, which the server uses too, so
|
||||
@@ -40,6 +41,7 @@ export async function validate({ cwd }) {
|
||||
);
|
||||
problems.push(...validateNativeDependencies(cwd, raw));
|
||||
problems.push(...validatePackage(cwd, raw));
|
||||
problems.push(...validateChangelogFile(cwd, raw));
|
||||
|
||||
if (problems.length > 0) {
|
||||
for (const problem of problems) console.error(` ${problem}`);
|
||||
@@ -79,6 +81,30 @@ function validatePackage(cwd, raw) {
|
||||
return problems;
|
||||
}
|
||||
|
||||
/**
|
||||
* CHANGELOG.json is optional, but when it is there it has to parse and its
|
||||
* newest release has to match the manifest version.
|
||||
*/
|
||||
function validateChangelogFile(cwd, raw) {
|
||||
const jsonPath = path.join(cwd, "CHANGELOG.json");
|
||||
if (!fs.existsSync(jsonPath)) {
|
||||
return fs.existsSync(path.join(cwd, "CHANGELOG.md"))
|
||||
? [
|
||||
"CHANGELOG.md is no longer shipped; move the release notes to CHANGELOG.json",
|
||||
]
|
||||
: [];
|
||||
}
|
||||
let changelog;
|
||||
try {
|
||||
changelog = JSON.parse(fs.readFileSync(jsonPath, "utf8"));
|
||||
} catch (error) {
|
||||
return [`CHANGELOG.json is not valid JSON: ${error.message}`];
|
||||
}
|
||||
return validateChangelog(changelog, raw.version).map(
|
||||
(problem) => `CHANGELOG.json: ${problem}`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* A native dependency has to actually be a real dependency of the plugin, or
|
||||
* the build's external declaration points at nothing node_modules can
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
export const CHANGE_TYPES = [
|
||||
"added",
|
||||
"changed",
|
||||
"fixed",
|
||||
"removed",
|
||||
"deprecated",
|
||||
"security",
|
||||
];
|
||||
|
||||
const SEMVER = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
|
||||
const DATE = /^\d{4}-\d{2}-\d{2}$/;
|
||||
const TOP_KEYS = ["$schema", "unreleased", "releases"];
|
||||
const RELEASE_KEYS = ["version", "date", "notes", "changes"];
|
||||
const CHANGE_KEYS = ["type", "text"];
|
||||
|
||||
function compareVersions(a, b) {
|
||||
const pa = SEMVER.exec(a);
|
||||
const pb = SEMVER.exec(b);
|
||||
for (let i = 1; i <= 3; i++) {
|
||||
const diff = Number(pa[i]) - Number(pb[i]);
|
||||
if (diff !== 0) return diff;
|
||||
}
|
||||
if (pa[4] === pb[4]) return 0;
|
||||
if (!pa[4]) return 1;
|
||||
if (!pb[4]) return -1;
|
||||
return pa[4] < pb[4] ? -1 : 1;
|
||||
}
|
||||
|
||||
function unknownKeys(value, allowed, where, problems) {
|
||||
for (const key of Object.keys(value)) {
|
||||
if (!allowed.includes(key))
|
||||
problems.push(`${where} has unknown key "${key}"`);
|
||||
}
|
||||
}
|
||||
|
||||
function checkChanges(changes, where, problems) {
|
||||
if (!Array.isArray(changes)) {
|
||||
problems.push(`${where} must be an array`);
|
||||
return;
|
||||
}
|
||||
changes.forEach((change, i) => {
|
||||
const at = `${where}[${i}]`;
|
||||
if (!change || typeof change !== "object" || Array.isArray(change)) {
|
||||
problems.push(`${at} must be an object`);
|
||||
return;
|
||||
}
|
||||
unknownKeys(change, CHANGE_KEYS, at, problems);
|
||||
if (!CHANGE_TYPES.includes(change.type)) {
|
||||
problems.push(`${at}.type must be one of ${CHANGE_TYPES.join(", ")}`);
|
||||
}
|
||||
if (typeof change.text !== "string" || change.text.trim() === "") {
|
||||
problems.push(`${at}.text must be a non-empty string`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks a parsed CHANGELOG.json. The newest release has to be the version
|
||||
* in the manifest, so a release never ships without its notes.
|
||||
*/
|
||||
export function validateChangelog(changelog, manifestVersion) {
|
||||
const problems = [];
|
||||
if (!changelog || typeof changelog !== "object" || Array.isArray(changelog)) {
|
||||
return ["CHANGELOG.json must be an object"];
|
||||
}
|
||||
unknownKeys(changelog, TOP_KEYS, "CHANGELOG.json", problems);
|
||||
|
||||
if (changelog.unreleased !== undefined) {
|
||||
checkChanges(changelog.unreleased, "unreleased", problems);
|
||||
}
|
||||
|
||||
const releases = changelog.releases;
|
||||
if (!Array.isArray(releases) || releases.length === 0) {
|
||||
problems.push("releases must be a non-empty array");
|
||||
return problems;
|
||||
}
|
||||
|
||||
const seen = new Set();
|
||||
releases.forEach((release, i) => {
|
||||
const at = `releases[${i}]`;
|
||||
if (!release || typeof release !== "object" || Array.isArray(release)) {
|
||||
problems.push(`${at} must be an object`);
|
||||
return;
|
||||
}
|
||||
unknownKeys(release, RELEASE_KEYS, at, problems);
|
||||
if (typeof release.version !== "string" || !SEMVER.test(release.version)) {
|
||||
problems.push(`${at}.version must be a version like 1.2.3`);
|
||||
} else if (seen.has(release.version)) {
|
||||
problems.push(`${at}.version ${release.version} is listed twice`);
|
||||
} else {
|
||||
seen.add(release.version);
|
||||
}
|
||||
if (
|
||||
release.date !== undefined &&
|
||||
(typeof release.date !== "string" || !DATE.test(release.date))
|
||||
) {
|
||||
problems.push(`${at}.date must be a date like 2026-10-01`);
|
||||
}
|
||||
if (release.notes !== undefined && typeof release.notes !== "string") {
|
||||
problems.push(`${at}.notes must be a string`);
|
||||
}
|
||||
checkChanges(release.changes, `${at}.changes`, problems);
|
||||
if (Array.isArray(release.changes) && release.changes.length === 0) {
|
||||
problems.push(`${at}.changes must list at least one change`);
|
||||
}
|
||||
});
|
||||
|
||||
const versions = releases
|
||||
.map((release) => release?.version)
|
||||
.filter((v) => typeof v === "string" && SEMVER.test(v));
|
||||
for (let i = 1; i < versions.length; i++) {
|
||||
if (compareVersions(versions[i - 1], versions[i]) < 0) {
|
||||
problems.push("releases must be listed newest first");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const newest = releases[0]?.version;
|
||||
if (manifestVersion && newest !== manifestVersion) {
|
||||
problems.push(
|
||||
`the newest release is ${newest}, but manifest version is ${manifestVersion}`,
|
||||
);
|
||||
}
|
||||
|
||||
return problems;
|
||||
}
|
||||
@@ -9,7 +9,7 @@ export const TMXPLUG_CONTENTS = [
|
||||
"locales",
|
||||
"migrations",
|
||||
"README.md",
|
||||
"CHANGELOG.md",
|
||||
"CHANGELOG.json",
|
||||
"icon.svg",
|
||||
];
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "@termix/plugin-sdk",
|
||||
"version": "1.0.0",
|
||||
"description": "The contract between Termix core and a plugin: types, the capability catalog and the manifest schema.",
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/Termix-SSH/Termix.git",
|
||||
@@ -75,6 +75,7 @@
|
||||
},
|
||||
"./tsconfig.plugin.json": "./tsconfig.plugin.json",
|
||||
"./schema/manifest.schema.json": "./schema/manifest.schema.json",
|
||||
"./schema/changelog.schema.json": "./schema/changelog.schema.json",
|
||||
"./ui": {
|
||||
"types": "./dist/host/ui.d.ts",
|
||||
"default": "./dist/host/ui.js"
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://raw.githubusercontent.com/Termix-SSH/Termix/main/packages/plugin-sdk/schema/changelog.schema.json",
|
||||
"title": "Termix plugin changelog",
|
||||
"description": "Every release of a plugin, newest first. The newest release must match the manifest version.",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["releases"],
|
||||
"properties": {
|
||||
"$schema": { "type": "string" },
|
||||
"unreleased": {
|
||||
"description": "Changes that are merged but not released yet.",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/change" }
|
||||
},
|
||||
"releases": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": { "$ref": "#/$defs/release" }
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"release": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["version", "changes"],
|
||||
"properties": {
|
||||
"version": {
|
||||
"type": "string",
|
||||
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$"
|
||||
},
|
||||
"date": {
|
||||
"description": "When the version was released. Leave it out until it ships.",
|
||||
"type": "string",
|
||||
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
||||
},
|
||||
"notes": {
|
||||
"description": "A short line shown above the list of changes.",
|
||||
"type": "string"
|
||||
},
|
||||
"changes": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": { "$ref": "#/$defs/change" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"change": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["type", "text"],
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"added",
|
||||
"changed",
|
||||
"fixed",
|
||||
"removed",
|
||||
"deprecated",
|
||||
"security"
|
||||
]
|
||||
},
|
||||
"text": { "type": "string", "minLength": 1 }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"extends": ["@commitlint/config-conventional"],
|
||||
"rules": {
|
||||
"type-enum": [
|
||||
2,
|
||||
"always",
|
||||
[
|
||||
"feat",
|
||||
"fix",
|
||||
"docs",
|
||||
"style",
|
||||
"refactor",
|
||||
"perf",
|
||||
"test",
|
||||
"chore",
|
||||
"revert"
|
||||
]
|
||||
],
|
||||
"subject-case": [0]
|
||||
}
|
||||
}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
custom: https://donate.termix.site/
|
||||
@@ -0,0 +1,34 @@
|
||||
# Overview
|
||||
|
||||
_Short summary of what this PR does_
|
||||
|
||||
- [ ] Added: ...
|
||||
- [ ] Updated: ...
|
||||
- [ ] Removed: ...
|
||||
- [ ] Fixed: ...
|
||||
|
||||
# Changes Made
|
||||
|
||||
_Detailed explanation of changes (if needed)_
|
||||
|
||||
- ...
|
||||
|
||||
# Related Issues
|
||||
|
||||
_Link any issues this PR addresses_
|
||||
|
||||
- Closes #ISSUE_NUMBER
|
||||
- Related to #ISSUE_NUMBER
|
||||
|
||||
# Screenshots / Demos
|
||||
|
||||
_(Optional: add before/after screenshots, GIFs, or console output)_
|
||||
|
||||
# Checklist
|
||||
|
||||
- [ ] Code follows project style guidelines
|
||||
- [ ] Supports mobile and desktop UI/app (if applicable)
|
||||
- [ ] Added the change to `CHANGELOG.json`
|
||||
- [ ] `npm run test`, `npm run typecheck` and `npm run validate` pass
|
||||
- [ ] I have read `CONTRIBUTING.md`
|
||||
- [ ] This is not a translation request. See [docs](https://docs.termix.site/translations)
|
||||
@@ -0,0 +1,9 @@
|
||||
node_modules
|
||||
dist
|
||||
coverage
|
||||
*.log
|
||||
.env
|
||||
*.tmxplug
|
||||
*.tmxplug.sig
|
||||
termix-plugin-signing.key
|
||||
.termix-tables-*
|
||||
@@ -0,0 +1 @@
|
||||
npx --no -- commitlint --edit "$1"
|
||||
@@ -0,0 +1 @@
|
||||
npx lint-staged
|
||||
@@ -0,0 +1,4 @@
|
||||
dist
|
||||
coverage
|
||||
node_modules
|
||||
package-lock.json
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 80,
|
||||
"arrowParens": "always",
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/Termix-SSH/Termix/main/packages/plugin-sdk/schema/changelog.schema.json",
|
||||
"releases": [
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"changes": [
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Certificates from Let's Encrypt or any ACME directory"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "HTTP challenge on port 80, or a Cloudflare DNS challenge when port 80 is closed"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Renews before the certificate expires"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Swaps in the new certificate without a restart"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.0
|
||||
|
||||
First release, bundled with Termix 2.9.0.
|
||||
|
||||
Gets the HTTPS certificate Termix serves from Let's Encrypt or another ACME provider and renews it before it expires. Supports the HTTP challenge and the Cloudflare DNS challenge.
|
||||
@@ -0,0 +1,27 @@
|
||||
# Contributing to ACME Certificates
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
npm run validate # check manifest.json
|
||||
npm run format # format the code with Prettier
|
||||
```
|
||||
|
||||
## Settings
|
||||
|
||||
### Admin
|
||||
|
||||
- **Renew automatically:** checks twice a day and renews when there is no certificate, it is self-signed, it does not cover the domain, or it expires within 30 days
|
||||
- **Domain:** the public domain name the certificate covers
|
||||
- **Email:** the contact email for the ACME account
|
||||
- **Certificate authority:** Let's Encrypt, Let's Encrypt staging, or a custom ACME directory
|
||||
- **ACME directory URL:** only for a custom authority, and must be https
|
||||
- **Challenge type:** HTTP or DNS (Cloudflare)
|
||||
- **Cloudflare API token:** used by the DNS challenge, stored encrypted
|
||||
|
||||
## Permissions
|
||||
|
||||
- `acme-ssl.manage`: see the certificate status and request a new certificate. Only admins have it by default.
|
||||
+27
-30
@@ -1,41 +1,38 @@
|
||||
# ACME Certificates
|
||||
<div align="center">
|
||||
|
||||
Gets and renews the Termix HTTPS certificate from Let's Encrypt or another ACME provider.
|
||||
<img src="https://raw.githubusercontent.com/Termix-SSH/Termix/main/public/icon.svg" width="120" height="120" alt="Termix Logo" />
|
||||
|
||||
<h1>ACME Certificates</h1>
|
||||
|
||||
<p>Free HTTPS certificates for your Termix server, renewed for you</p>
|
||||
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
## Overview
|
||||
|
||||
ACME Certificates gets the HTTPS certificate Termix serves from Let's Encrypt or any other ACME provider and keeps it renewed.
|
||||
|
||||
<br />
|
||||
|
||||
## Features
|
||||
|
||||
- Gets a certificate from Let's Encrypt, Let's Encrypt staging or any ACME directory URL.
|
||||
- Checks twice a day and renews when there is no certificate, the current one is self-signed, it does not cover the domain or it expires within 30 days.
|
||||
- Swaps in the new certificate without a restart.
|
||||
- Shows the current certificate and the last attempt, with a button to request one now.
|
||||
- Certificates from Let's Encrypt or any ACME directory
|
||||
- HTTP challenge on port 80, or a Cloudflare DNS challenge when port 80 is closed
|
||||
- Renews before the certificate expires
|
||||
- Swaps in the new certificate without a restart
|
||||
|
||||
## Setup
|
||||
<br />
|
||||
|
||||
Pick a challenge type:
|
||||
## Support
|
||||
|
||||
- HTTP: the provider fetches `http://<domain>/.well-known/acme-challenge/...`, so port 80 must reach Termix.
|
||||
- DNS (Cloudflare): needs a Cloudflare API token with Zone:DNS:Edit. Works when port 80 is closed.
|
||||
To report a bug or request a feature, open a [support ticket](https://github.com/Termix-SSH/Support/issues/new/choose). You need to be logged in to GitHub. Please be as detailed as possible, preferably in English.
|
||||
|
||||
If you turn this plugin off, Termix keeps serving the current certificate but nothing renews it. Admin Settings > HTTPS certificate warns you before it expires. Uploading your own certificate is still done there.
|
||||
For discussions and questions, join the [Discord](https://discord.gg/jVQGdvHDrf) server.
|
||||
|
||||
## Settings
|
||||
<br />
|
||||
|
||||
### Admin
|
||||
## License
|
||||
|
||||
- Renew automatically: turn automatic renewal on or off.
|
||||
- Domain and Email: the domain to cover and the contact email for the provider.
|
||||
- Certificate authority: Let's Encrypt, Let's Encrypt staging or a custom ACME directory URL.
|
||||
- Challenge type: HTTP or DNS (Cloudflare).
|
||||
- Cloudflare API token: used by the DNS challenge. Stored encrypted.
|
||||
|
||||
## Permissions
|
||||
|
||||
- `acme-ssl.manage`: Manage ACME certificates. Only admins have it by default.
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
```
|
||||
Distributed under the Apache License Version 2.0. See [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) for more information.
|
||||
@@ -2,16 +2,16 @@
|
||||
"id": "acme-ssl",
|
||||
"name": "ACME Certificates",
|
||||
"version": "1.0.0",
|
||||
"description": "Gets and renews the Termix HTTPS certificate from Let's Encrypt or another ACME provider.",
|
||||
"description": "Gets the Termix HTTPS certificate from Let's Encrypt or any ACME provider and renews it for you.",
|
||||
"author": {
|
||||
"name": "Termix"
|
||||
},
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"repository": "https://github.com/Termix-SSH/Termix",
|
||||
"category": "Access & Security",
|
||||
"icon": "Lock",
|
||||
"engine": {
|
||||
"termix": ">=2.9.0",
|
||||
"termix": ">=26.10.0",
|
||||
"api": "1"
|
||||
},
|
||||
"capabilities": [
|
||||
|
||||
@@ -7,19 +7,27 @@
|
||||
"build": "termix-plugin build",
|
||||
"test": "termix-plugin test",
|
||||
"typecheck": "tsc -p .",
|
||||
"validate": "termix-plugin validate"
|
||||
"validate": "termix-plugin validate",
|
||||
"format": "prettier --write .",
|
||||
"format:check": "prettier --check .",
|
||||
"prepare": "husky || true"
|
||||
},
|
||||
"dependencies": {
|
||||
"acme-client": "^5.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -27,5 +35,10 @@
|
||||
"express": "^5.2.1",
|
||||
"react": "^19.2.8",
|
||||
"sonner": "^2.0.8"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{ts,tsx,js,jsx,mjs,cjs,json,css,md}": [
|
||||
"prettier --write"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"extends": ["@commitlint/config-conventional"],
|
||||
"rules": {
|
||||
"type-enum": [
|
||||
2,
|
||||
"always",
|
||||
[
|
||||
"feat",
|
||||
"fix",
|
||||
"docs",
|
||||
"style",
|
||||
"refactor",
|
||||
"perf",
|
||||
"test",
|
||||
"chore",
|
||||
"revert"
|
||||
]
|
||||
],
|
||||
"subject-case": [0]
|
||||
}
|
||||
}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
custom: https://donate.termix.site/
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
# Overview
|
||||
|
||||
_Short summary of what this PR does_
|
||||
|
||||
- [ ] Added: ...
|
||||
- [ ] Updated: ...
|
||||
- [ ] Removed: ...
|
||||
- [ ] Fixed: ...
|
||||
|
||||
# Changes Made
|
||||
|
||||
_Detailed explanation of changes (if needed)_
|
||||
|
||||
- ...
|
||||
|
||||
# Related Issues
|
||||
|
||||
_Link any issues this PR addresses_
|
||||
|
||||
- Closes #ISSUE_NUMBER
|
||||
- Related to #ISSUE_NUMBER
|
||||
|
||||
# Screenshots / Demos
|
||||
|
||||
_(Optional: add before/after screenshots, GIFs, or console output)_
|
||||
|
||||
# Checklist
|
||||
|
||||
- [ ] Code follows project style guidelines
|
||||
- [ ] Supports mobile and desktop UI/app (if applicable)
|
||||
- [ ] Added the change to `CHANGELOG.json`
|
||||
- [ ] `npm run test`, `npm run typecheck` and `npm run validate` pass
|
||||
- [ ] I have read `CONTRIBUTING.md`
|
||||
- [ ] This is not a translation request. See [docs](https://docs.termix.site/translations)
|
||||
@@ -0,0 +1,9 @@
|
||||
node_modules
|
||||
dist
|
||||
coverage
|
||||
*.log
|
||||
.env
|
||||
*.tmxplug
|
||||
*.tmxplug.sig
|
||||
termix-plugin-signing.key
|
||||
.termix-tables-*
|
||||
@@ -0,0 +1 @@
|
||||
npx --no -- commitlint --edit "$1"
|
||||
@@ -0,0 +1 @@
|
||||
npx lint-staged
|
||||
@@ -0,0 +1,4 @@
|
||||
dist
|
||||
coverage
|
||||
node_modules
|
||||
package-lock.json
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 80,
|
||||
"arrowParens": "always",
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/Termix-SSH/Termix/main/packages/plugin-sdk/schema/changelog.schema.json",
|
||||
"releases": [
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"changes": [
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Ask about your hosts, snippets, fleets, alerts, automations and more"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Proposes changes instead of making them, and nothing runs until you approve it"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Can run safe read-only commands like `df` and `uptime` if you allow it"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Ask about a host right from its terminal"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Works with Ollama, Anthropic, OpenAI, Google Gemini and any OpenAI compatible endpoint"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "AI Agents: run Pi, OpenCode, Claude Code or Codex on an SSH host using one of your Termix providers, with tool approvals, queued messages, attachments, Git diffs and worktrees"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "One-click install of the selected agent and Node.js, and a button to set up SSH loopback forwarding"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.0
|
||||
|
||||
First release, bundled with Termix 2.9.0.
|
||||
|
||||
Adds an AI assistant that can read your hosts, snippets, fleets, alerts and automations and suggest changes for you to approve. Works with Ollama, Anthropic, OpenAI, Google Gemini and any OpenAI compatible provider.
|
||||
@@ -0,0 +1,37 @@
|
||||
# Contributing to AI Assistant
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
npm run validate # check manifest.json
|
||||
npm run format # format the code with Prettier
|
||||
```
|
||||
|
||||
## Settings
|
||||
|
||||
### Admin
|
||||
|
||||
- **AI assistant:** let users turn the assistant on. While this is off it is hidden and blocked for everyone
|
||||
- **Allowed private AI hosts:** hosts on your private network a provider may point at, such as a self-hosted Ollama
|
||||
|
||||
### User
|
||||
|
||||
- **Enable the AI assistant:** turn the assistant on for yourself
|
||||
- **Allow read-only diagnostic commands:** let the assistant run safe commands without asking
|
||||
- **Providers:** your AI providers, models and API keys
|
||||
|
||||
### Host
|
||||
|
||||
- **Enable AI Assistant:** let the assistant help in this host's terminal. Off by default
|
||||
|
||||
## Permissions
|
||||
|
||||
- `ai.use`: use the assistant. Admins and users have it by default.
|
||||
- `ai.manage_providers`: add, edit and remove AI providers and their API keys. Admins and users have it by default.
|
||||
- `ai.apply_proposals`: let the assistant carry out the changes it suggests. Admins and users have it by default.
|
||||
- `ai.services.use`: let other features call the assistant for you. Admins and users have it by default.
|
||||
- `ai.secrets.share`: let other features use the stored API key without seeing it. Admins and users have it by default.
|
||||
- `ai.agents`: run coding agents on SSH hosts. Only admins have it by default.
|
||||
+37
-39
@@ -1,50 +1,48 @@
|
||||
# AI Assistant
|
||||
<div align="center">
|
||||
|
||||
An AI assistant that can read your hosts, snippets, fleets, alerts and automations, and suggest changes for you to approve.
|
||||
<img src="https://raw.githubusercontent.com/Termix-SSH/Termix/main/public/icon.svg" width="120" height="120" alt="Termix Logo" />
|
||||
|
||||
<h1>AI Assistant</h1>
|
||||
|
||||
<p>An optional AI assistant that knows your servers</p>
|
||||
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
## Overview
|
||||
|
||||
AI Assistant is a chat that can read your Termix setup and propose changes for you to approve. It can also run coding agents on your SSH hosts.
|
||||
|
||||
<br />
|
||||
|
||||
## Features
|
||||
|
||||
- Chat with an assistant that can read your hosts, snippets, fleets, alerts, automations, workspaces, network graph and homepage.
|
||||
- The assistant suggests changes, and nothing is applied until you approve it.
|
||||
- Can run read-only diagnostic commands on a host if you allow it.
|
||||
- Open the assistant from the terminal toolbar with the current session as context.
|
||||
- Works with Ollama, Anthropic, OpenAI, Google Gemini and any OpenAI compatible provider.
|
||||
- Ask about your hosts, snippets, fleets, alerts, automations and more
|
||||
- Proposes changes instead of making them, and nothing runs until you approve it
|
||||
- Can run safe read-only commands like `df` and `uptime` if you allow it
|
||||
- Ask about a host right from its terminal
|
||||
- Works with Ollama, Anthropic, OpenAI, Google Gemini and any OpenAI compatible endpoint
|
||||
- Run Pi, OpenCode, Claude Code or Codex as a coding agent on an SSH host, using your own provider
|
||||
|
||||
## Settings
|
||||
|
||||
### Admin
|
||||
|
||||
- AI assistant: let users turn the assistant on. While this is off it is hidden for everyone.
|
||||
- Allowed private AI hosts: hosts on your private network a provider may point at, such as a self-hosted Ollama.
|
||||
|
||||
### User
|
||||
|
||||
- Enable the AI assistant: turn the assistant on for yourself.
|
||||
- Allow read-only diagnostic commands: let the assistant run safe commands on your hosts.
|
||||
- Providers: the AI providers, models and API keys you use.
|
||||
|
||||
### Host
|
||||
|
||||
- Enable AI Assistant: allow the assistant to work with this host.
|
||||
|
||||
## Permissions
|
||||
|
||||
- `ai.use`: Open the assistant and ask it things. Admins and users have it by default.
|
||||
- `ai.manage_providers`: Add, edit and remove AI providers and their API keys. Admins and users have it by default.
|
||||
- `ai.apply_proposals`: Let the assistant carry out the changes it suggests. Admins and users have it by default.
|
||||
- `ai.services.use`: Let other features call the assistant for you. Admins and users have it by default.
|
||||
- `ai.secrets.share`: Let other features use the stored AI API key without seeing it. Admins and users have it by default.
|
||||
<br />
|
||||
|
||||
## Services
|
||||
|
||||
Uses from other plugins:
|
||||
Uses from other plugins, each one optional:
|
||||
|
||||
- `workspaces.saved`, `network-topology.graph`, `snippets.access`, `fleets.access`, `terminal.history`, `automations.access` and `homepage.items` to read your data. Each one is optional.
|
||||
- `workspaces.saved`, `network-topology.graph`, `snippets.access`, `fleets.access`, `terminal.history`, `automations.access` and `homepage.items` to read your data
|
||||
|
||||
## Development
|
||||
<br />
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
```
|
||||
## Support
|
||||
|
||||
To report a bug or request a feature, open a [support ticket](https://github.com/Termix-SSH/Support/issues/new/choose). You need to be logged in to GitHub. Please be as detailed as possible, preferably in English.
|
||||
|
||||
For discussions and questions, join the [Discord](https://discord.gg/jVQGdvHDrf) server.
|
||||
|
||||
<br />
|
||||
|
||||
## License
|
||||
|
||||
Distributed under the Apache License Version 2.0. See [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) for more information.
|
||||
@@ -2,16 +2,16 @@
|
||||
"id": "ai",
|
||||
"name": "AI Assistant",
|
||||
"version": "1.0.0",
|
||||
"description": "An AI assistant that can read your hosts, snippets, fleets, alerts and automations, and suggest changes for you to approve.",
|
||||
"description": "An optional AI assistant that reads your setup and proposes changes for you to approve.",
|
||||
"author": {
|
||||
"name": "Termix"
|
||||
},
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"repository": "https://github.com/Termix-SSH/Termix",
|
||||
"category": "Productivity",
|
||||
"icon": "Sparkles",
|
||||
"engine": {
|
||||
"termix": ">=2.9.0",
|
||||
"termix": ">=26.10.0",
|
||||
"api": "1"
|
||||
},
|
||||
"capabilities": [
|
||||
|
||||
+14
-1
@@ -7,7 +7,10 @@
|
||||
"build": "termix-plugin build",
|
||||
"test": "termix-plugin test",
|
||||
"typecheck": "tsc -p .",
|
||||
"validate": "termix-plugin validate"
|
||||
"validate": "termix-plugin validate",
|
||||
"format": "prettier --write .",
|
||||
"format:check": "prettier --check .",
|
||||
"prepare": "husky || true"
|
||||
},
|
||||
"dependencies": {
|
||||
"@anthropic-ai/sdk": "^0.120.0",
|
||||
@@ -16,6 +19,8 @@
|
||||
"remark-gfm": "^4.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -23,7 +28,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -33,5 +41,10 @@
|
||||
"react": "^19.2.8",
|
||||
"sonner": "^2.0.8",
|
||||
"ssh2": "^1.17.0"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{ts,tsx,js,jsx,mjs,cjs,json,css,md}": [
|
||||
"prettier --write"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"extends": ["@commitlint/config-conventional"],
|
||||
"rules": {
|
||||
"type-enum": [
|
||||
2,
|
||||
"always",
|
||||
[
|
||||
"feat",
|
||||
"fix",
|
||||
"docs",
|
||||
"style",
|
||||
"refactor",
|
||||
"perf",
|
||||
"test",
|
||||
"chore",
|
||||
"revert"
|
||||
]
|
||||
],
|
||||
"subject-case": [0]
|
||||
}
|
||||
}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
custom: https://donate.termix.site/
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
# Overview
|
||||
|
||||
_Short summary of what this PR does_
|
||||
|
||||
- [ ] Added: ...
|
||||
- [ ] Updated: ...
|
||||
- [ ] Removed: ...
|
||||
- [ ] Fixed: ...
|
||||
|
||||
# Changes Made
|
||||
|
||||
_Detailed explanation of changes (if needed)_
|
||||
|
||||
- ...
|
||||
|
||||
# Related Issues
|
||||
|
||||
_Link any issues this PR addresses_
|
||||
|
||||
- Closes #ISSUE_NUMBER
|
||||
- Related to #ISSUE_NUMBER
|
||||
|
||||
# Screenshots / Demos
|
||||
|
||||
_(Optional: add before/after screenshots, GIFs, or console output)_
|
||||
|
||||
# Checklist
|
||||
|
||||
- [ ] Code follows project style guidelines
|
||||
- [ ] Supports mobile and desktop UI/app (if applicable)
|
||||
- [ ] Added the change to `CHANGELOG.json`
|
||||
- [ ] `npm run test`, `npm run typecheck` and `npm run validate` pass
|
||||
- [ ] I have read `CONTRIBUTING.md`
|
||||
- [ ] This is not a translation request. See [docs](https://docs.termix.site/translations)
|
||||
@@ -0,0 +1,9 @@
|
||||
node_modules
|
||||
dist
|
||||
coverage
|
||||
*.log
|
||||
.env
|
||||
*.tmxplug
|
||||
*.tmxplug.sig
|
||||
termix-plugin-signing.key
|
||||
.termix-tables-*
|
||||
@@ -0,0 +1 @@
|
||||
npx --no -- commitlint --edit "$1"
|
||||
@@ -0,0 +1 @@
|
||||
npx lint-staged
|
||||
@@ -0,0 +1,4 @@
|
||||
dist
|
||||
coverage
|
||||
node_modules
|
||||
package-lock.json
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 80,
|
||||
"arrowParens": "always",
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/Termix-SSH/Termix/main/packages/plugin-sdk/schema/changelog.schema.json",
|
||||
"releases": [
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"changes": [
|
||||
{
|
||||
"type": "added",
|
||||
"text": "One inbox for alerts from every part of Termix"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Popups for new alerts"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Send alerts to Discord, ntfy, email or a webhook"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Rules that pick which alerts go where"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Optional news from the Termix team, like security notices and releases"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.0
|
||||
|
||||
First release, bundled with Termix 2.9.0.
|
||||
|
||||
Adds one inbox for every alert in Termix. Alerts can also be sent to webhooks, ntfy, Discord and email, with delivery rules to pick what goes where.
|
||||
@@ -0,0 +1,27 @@
|
||||
# Contributing to Alerts
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
npm run validate # check manifest.json
|
||||
npm run format # format the code with Prettier
|
||||
```
|
||||
|
||||
## Settings
|
||||
|
||||
### Admin
|
||||
|
||||
- **Termix announcements:** show news from the Termix team in everyone's inbox
|
||||
- **Keep alerts for (days):** older alerts are removed from every inbox
|
||||
- **SMTP server, port, TLS, username, password and from address:** needed for email channels. Leave the server empty to turn email off
|
||||
|
||||
### User
|
||||
|
||||
- **Alert popups:** all alerts, warnings and critical, critical only, or none
|
||||
|
||||
## Permissions
|
||||
|
||||
- `alerts.use`: get alerts in the inbox and send them to your own channels. Admins and users have it by default.
|
||||
+28
-28
@@ -1,39 +1,39 @@
|
||||
# Alerts
|
||||
<div align="center">
|
||||
|
||||
One inbox for every alert, with delivery to webhooks, ntfy, Discord and email.
|
||||
<img src="https://raw.githubusercontent.com/Termix-SSH/Termix/main/public/icon.svg" width="120" height="120" alt="Termix Logo" />
|
||||
|
||||
<h1>Alerts</h1>
|
||||
|
||||
<p>One inbox for every alert in Termix</p>
|
||||
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
## Overview
|
||||
|
||||
Alerts is the inbox every Termix alert lands in, with delivery to Discord, ntfy, email or a webhook.
|
||||
|
||||
<br />
|
||||
|
||||
## Features
|
||||
|
||||
- One inbox for alerts from every part of Termix.
|
||||
- Popups for new alerts, filtered by severity.
|
||||
- Channels that send alerts to webhooks, ntfy, Discord and email.
|
||||
- Delivery rules that pick which alerts go to which channel.
|
||||
- Optional news from the Termix team, like security notices and new releases.
|
||||
- One inbox for alerts from every part of Termix
|
||||
- Popups for new alerts
|
||||
- Send alerts to Discord, ntfy, email or a webhook
|
||||
- Rules that pick which alerts go where
|
||||
- Optional news from the Termix team, like security notices and releases
|
||||
|
||||
## Settings
|
||||
<br />
|
||||
|
||||
### Admin
|
||||
## Support
|
||||
|
||||
- Termix announcements: show news from the Termix team in everyone's inbox.
|
||||
- Keep alerts for (days): older alerts are removed from every inbox.
|
||||
- SMTP server, port, TLS, username, password and from address: needed for email channels. Leave the server empty to turn email off.
|
||||
To report a bug or request a feature, open a [support ticket](https://github.com/Termix-SSH/Support/issues/new/choose). You need to be logged in to GitHub. Please be as detailed as possible, preferably in English.
|
||||
|
||||
### User
|
||||
For discussions and questions, join the [Discord](https://discord.gg/jVQGdvHDrf) server.
|
||||
|
||||
- Alert popups: all alerts, warnings and critical, critical only, or none.
|
||||
<br />
|
||||
|
||||
## Permissions
|
||||
## License
|
||||
|
||||
- `alerts.use`: Get alerts in the inbox and send them to your own channels. Admins and users have it by default.
|
||||
|
||||
## For plugin authors
|
||||
|
||||
Send an alert from any plugin with `ctx.notify.send()`. This plugin stores it and delivers it. Do not build a separate notification system into a plugin.
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
```
|
||||
Distributed under the Apache License Version 2.0. See [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) for more information.
|
||||
@@ -2,16 +2,16 @@
|
||||
"id": "alerts",
|
||||
"name": "Alerts",
|
||||
"version": "1.0.0",
|
||||
"description": "One inbox for every alert, with delivery to webhooks, ntfy, Discord and email.",
|
||||
"description": "One inbox for every alert in Termix, with delivery to webhooks, ntfy, Discord and email.",
|
||||
"author": {
|
||||
"name": "Termix"
|
||||
},
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"repository": "https://github.com/Termix-SSH/Termix",
|
||||
"category": "Monitoring",
|
||||
"icon": "Bell",
|
||||
"engine": {
|
||||
"termix": ">=2.9.0",
|
||||
"termix": ">=26.10.0",
|
||||
"api": "1"
|
||||
},
|
||||
"capabilities": [
|
||||
|
||||
@@ -7,13 +7,18 @@
|
||||
"build": "termix-plugin build",
|
||||
"test": "termix-plugin test",
|
||||
"typecheck": "tsc -p .",
|
||||
"validate": "termix-plugin validate"
|
||||
"validate": "termix-plugin validate",
|
||||
"format": "prettier --write .",
|
||||
"format:check": "prettier --check .",
|
||||
"prepare": "husky || true"
|
||||
},
|
||||
"dependencies": {
|
||||
"lucide-react": "^1.33.0",
|
||||
"nodemailer": "^10.0.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -21,7 +26,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -30,5 +38,10 @@
|
||||
"express": "^5.2.1",
|
||||
"react": "^19.2.8",
|
||||
"sonner": "^2.0.8"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{ts,tsx,js,jsx,mjs,cjs,json,css,md}": [
|
||||
"prettier --write"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"extends": ["@commitlint/config-conventional"],
|
||||
"rules": {
|
||||
"type-enum": [
|
||||
2,
|
||||
"always",
|
||||
[
|
||||
"feat",
|
||||
"fix",
|
||||
"docs",
|
||||
"style",
|
||||
"refactor",
|
||||
"perf",
|
||||
"test",
|
||||
"chore",
|
||||
"revert"
|
||||
]
|
||||
],
|
||||
"subject-case": [0]
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
custom: https://donate.termix.site/
|
||||
@@ -0,0 +1,34 @@
|
||||
# Overview
|
||||
|
||||
_Short summary of what this PR does_
|
||||
|
||||
- [ ] Added: ...
|
||||
- [ ] Updated: ...
|
||||
- [ ] Removed: ...
|
||||
- [ ] Fixed: ...
|
||||
|
||||
# Changes Made
|
||||
|
||||
_Detailed explanation of changes (if needed)_
|
||||
|
||||
- ...
|
||||
|
||||
# Related Issues
|
||||
|
||||
_Link any issues this PR addresses_
|
||||
|
||||
- Closes #ISSUE_NUMBER
|
||||
- Related to #ISSUE_NUMBER
|
||||
|
||||
# Screenshots / Demos
|
||||
|
||||
_(Optional: add before/after screenshots, GIFs, or console output)_
|
||||
|
||||
# Checklist
|
||||
|
||||
- [ ] Code follows project style guidelines
|
||||
- [ ] Supports mobile and desktop UI/app (if applicable)
|
||||
- [ ] Added the change to `CHANGELOG.json`
|
||||
- [ ] `npm run test`, `npm run typecheck` and `npm run validate` pass
|
||||
- [ ] I have read `CONTRIBUTING.md`
|
||||
- [ ] This is not a translation request. See [docs](https://docs.termix.site/translations)
|
||||
@@ -0,0 +1,9 @@
|
||||
node_modules
|
||||
dist
|
||||
coverage
|
||||
*.log
|
||||
.env
|
||||
*.tmxplug
|
||||
*.tmxplug.sig
|
||||
termix-plugin-signing.key
|
||||
.termix-tables-*
|
||||
@@ -0,0 +1 @@
|
||||
npx --no -- commitlint --edit "$1"
|
||||
@@ -0,0 +1 @@
|
||||
npx lint-staged
|
||||
@@ -0,0 +1,4 @@
|
||||
dist
|
||||
coverage
|
||||
node_modules
|
||||
package-lock.json
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 80,
|
||||
"arrowParens": "always",
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/Termix-SSH/Termix/main/packages/plugin-sdk/schema/changelog.schema.json",
|
||||
"releases": [
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"changes": [
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Triggers for metrics, hosts going up or down, health checks, schedules, container events and webhooks"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Steps that run commands and snippets, control containers and tunnels, wake hosts, call URLs and send alerts"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Conditions, waits and variables for more complex flows"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Run on one host, a fleet or every host"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Test runs and a history of every run"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Maintenance windows that pause automations while you work on a host"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.0
|
||||
|
||||
First release, bundled with Termix 2.9.0.
|
||||
|
||||
Runs actions on your hosts on a schedule or when something happens, like a host going down, a metric crossing a limit, a container event or an incoming webhook. Each automation is a list of steps, such as running a command, sending an alert or calling a URL.
|
||||
@@ -0,0 +1,19 @@
|
||||
# Contributing to Automations
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
npm run validate # check manifest.json
|
||||
npm run format # format the code with Prettier
|
||||
```
|
||||
|
||||
## Permissions
|
||||
|
||||
- `automations.view`: see automations and their runs. Admins and users have it by default.
|
||||
- `automations.create`: create automations. Admins and users have it by default.
|
||||
- `automations.edit`: change automations. Admins and users have it by default.
|
||||
- `automations.delete`: delete automations. Admins and users have it by default.
|
||||
- `automations.run`: run automations by hand. Admins and users have it by default.
|
||||
@@ -1,51 +1,53 @@
|
||||
# Automations
|
||||
<div align="center">
|
||||
|
||||
Run actions on your hosts on a schedule or when something happens, like a host going down or a metric crossing a limit.
|
||||
<img src="https://raw.githubusercontent.com/Termix-SSH/Termix/main/public/icon.svg" width="120" height="120" alt="Termix Logo" />
|
||||
|
||||
<h1>Automations</h1>
|
||||
|
||||
<p>Make your servers react on their own</p>
|
||||
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
## Overview
|
||||
|
||||
Automations runs steps on your hosts when something happens, like cleaning up a disk when it fills or restarting a container when it stops.
|
||||
|
||||
<br />
|
||||
|
||||
## Features
|
||||
|
||||
- Triggers: a schedule, a host going up or down, a metric crossing a limit, a health check change, a container event, a Termix event or an incoming webhook.
|
||||
- Steps: send an alert, call a URL, run a snippet or command, control a container or tunnel, wake a host, wait, set a variable, branch with if / otherwise, run another automation or stop.
|
||||
- Run an automation on the host that triggered it or on any host or fleet you pick.
|
||||
- See the output and errors of each step for every run.
|
||||
- Triggers for metrics, hosts going up or down, health checks, schedules, container events and webhooks
|
||||
- Steps that run commands and snippets, control containers and tunnels, wake hosts, call URLs and send alerts
|
||||
- Conditions, waits and variables for more complex flows
|
||||
- Run on one host, a fleet or every host
|
||||
- Test runs and a history of every run
|
||||
- Maintenance windows that pause automations while you work on a host
|
||||
|
||||
## Permissions
|
||||
|
||||
- `automations.view`: See automations and their runs. Admins and users have it by default.
|
||||
- `automations.create`: Create automations. Admins and users have it by default.
|
||||
- `automations.edit`: Change automations. Admins and users have it by default.
|
||||
- `automations.delete`: Delete automations. Admins and users have it by default.
|
||||
- `automations.run`: Run automations by hand. Admins and users have it by default.
|
||||
<br />
|
||||
|
||||
## Services
|
||||
|
||||
Provides to other plugins:
|
||||
|
||||
- `automations.access`: list and run automations.
|
||||
- `automations.access`: list and run automations
|
||||
|
||||
Uses from other plugins:
|
||||
|
||||
- `snippets.access` for the run snippet step. Required.
|
||||
- `fleets.access`, `tunnels.access`, `docker.containers`, `docker.events`, `host-metrics.viewers` and `wake-on-lan.send` for their steps and triggers. Each one is optional.
|
||||
- `snippets.access` for the run snippet step. Required
|
||||
- `fleets.access`, `tunnels.access`, `docker.containers`, `docker.events`, `host-metrics.viewers` and `wake-on-lan.send` for their steps and triggers. Each one is optional
|
||||
|
||||
## Development
|
||||
<br />
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
```
|
||||
## Support
|
||||
|
||||
## Host maintenance
|
||||
To report a bug or request a feature, open a [support ticket](https://github.com/Termix-SSH/Support/issues/new/choose). You need to be logged in to GitHub. Please be as detailed as possible, preferably in English.
|
||||
|
||||
Open **Maintenance** from a saved host's actions. Its owner can start maintenance now, record a reason and estimated duration, or add a one-time, weekly or monthly schedule. Viewing requires `automations.view`; changes require `automations.edit`. Active maintenance appears as a host badge. The Automations plugin must remain enabled for maintenance scheduling and suppression to operate.
|
||||
For discussions and questions, join the [Discord](https://discord.gg/jVQGdvHDrf) server.
|
||||
|
||||
Schedules use UTC, including through daylight-saving changes. A monthly schedule for a day missing from a month skips that month. Up to 20 plans per host are stored; remove completed one-time plans when no longer needed. Planned windows cannot overlap (touching endpoints are allowed), and recurring conflicts are checked over the Gregorian calendar cycle. Removing a plan cancels future occurrences, not maintenance already in progress.
|
||||
<br />
|
||||
|
||||
The estimated completion time is informational. Maintenance **only ends when its owner explicitly ends it**. If work overruns into another scheduled window, the host stays in maintenance and the estimate extends to the later planned end. After server downtime, due plans are caught up without briefly exposing an outage between maintenance windows. Each plan's next occurrence and the active state survive restarts.
|
||||
## License
|
||||
|
||||
While active, maintenance suppresses new host-status, health-check, metric-threshold, container-event and tunnel-disconnection automation runs for that host. This pauses the entire triggered automation, including any remediation steps. Monitoring continues to report the real status; observed status/health baselines still advance and metric dwell windows are reset. Manual runs, schedules, webhooks, security login events and runs already in progress continue normally. Maintenance does not globally silence alerts from unrelated plugins.
|
||||
|
||||
An optional overdue reminder uses the estimate plus a configurable grace period (20 minutes by default). It only sends after core has observed the host offline at or after that deadline; an unknown, online or older cached status does not qualify. Enable host status checks to supply those observations. Reminders use the Alerts hub and category `automations.maintenance_overdue`, which can be routed through the user's notification rules. A successful reminder is remembered across restarts; an extended estimate permits another reminder for the new deadline. No reminder automatically ends maintenance.
|
||||
|
||||
Maintenance rows reference their owner and host with cascading deletion. SQLite, PostgreSQL and MySQL migrations add only the new maintenance table.
|
||||
Distributed under the Apache License Version 2.0. See [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) for more information.
|
||||
@@ -2,16 +2,16 @@
|
||||
"id": "automations",
|
||||
"name": "Automations",
|
||||
"version": "1.0.0",
|
||||
"description": "Run actions on your hosts on a schedule or when something happens, like a host going down or a metric crossing a limit.",
|
||||
"description": "Run steps on your hosts on a schedule or when something happens, like a host going down or a metric crossing a limit.",
|
||||
"author": {
|
||||
"name": "Termix"
|
||||
},
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"repository": "https://github.com/Termix-SSH/Termix",
|
||||
"category": "Infrastructure",
|
||||
"icon": "Workflow",
|
||||
"engine": {
|
||||
"termix": ">=2.9.0",
|
||||
"termix": ">=26.10.0",
|
||||
"api": "1"
|
||||
},
|
||||
"capabilities": [
|
||||
|
||||
@@ -7,12 +7,17 @@
|
||||
"build": "termix-plugin build",
|
||||
"test": "termix-plugin test",
|
||||
"typecheck": "tsc -p .",
|
||||
"validate": "termix-plugin validate"
|
||||
"validate": "termix-plugin validate",
|
||||
"format": "prettier --write .",
|
||||
"format:check": "prettier --check .",
|
||||
"prepare": "husky || true"
|
||||
},
|
||||
"dependencies": {
|
||||
"lucide-react": "^1.33.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
@@ -20,7 +25,10 @@
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"better-sqlite3": "^13.0.3",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -30,5 +38,10 @@
|
||||
"react": "^19.2.8",
|
||||
"sonner": "^2.0.8",
|
||||
"ssh2": "^1.17.0"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{ts,tsx,js,jsx,mjs,cjs,json,css,md}": [
|
||||
"prettier --write"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"extends": ["@commitlint/config-conventional"],
|
||||
"rules": {
|
||||
"type-enum": [
|
||||
2,
|
||||
"always",
|
||||
[
|
||||
"feat",
|
||||
"fix",
|
||||
"docs",
|
||||
"style",
|
||||
"refactor",
|
||||
"perf",
|
||||
"test",
|
||||
"chore",
|
||||
"revert"
|
||||
]
|
||||
],
|
||||
"subject-case": [0]
|
||||
}
|
||||
}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
custom: https://donate.termix.site/
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
# Overview
|
||||
|
||||
_Short summary of what this PR does_
|
||||
|
||||
- [ ] Added: ...
|
||||
- [ ] Updated: ...
|
||||
- [ ] Removed: ...
|
||||
- [ ] Fixed: ...
|
||||
|
||||
# Changes Made
|
||||
|
||||
_Detailed explanation of changes (if needed)_
|
||||
|
||||
- ...
|
||||
|
||||
# Related Issues
|
||||
|
||||
_Link any issues this PR addresses_
|
||||
|
||||
- Closes #ISSUE_NUMBER
|
||||
- Related to #ISSUE_NUMBER
|
||||
|
||||
# Screenshots / Demos
|
||||
|
||||
_(Optional: add before/after screenshots, GIFs, or console output)_
|
||||
|
||||
# Checklist
|
||||
|
||||
- [ ] Code follows project style guidelines
|
||||
- [ ] Supports mobile and desktop UI/app (if applicable)
|
||||
- [ ] Added the change to `CHANGELOG.json`
|
||||
- [ ] `npm run test`, `npm run typecheck` and `npm run validate` pass
|
||||
- [ ] I have read `CONTRIBUTING.md`
|
||||
- [ ] This is not a translation request. See [docs](https://docs.termix.site/translations)
|
||||
@@ -0,0 +1,9 @@
|
||||
node_modules
|
||||
dist
|
||||
coverage
|
||||
*.log
|
||||
.env
|
||||
*.tmxplug
|
||||
*.tmxplug.sig
|
||||
termix-plugin-signing.key
|
||||
.termix-tables-*
|
||||
@@ -0,0 +1 @@
|
||||
npx --no -- commitlint --edit "$1"
|
||||
@@ -0,0 +1 @@
|
||||
npx lint-staged
|
||||
@@ -0,0 +1,4 @@
|
||||
dist
|
||||
coverage
|
||||
node_modules
|
||||
package-lock.json
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 80,
|
||||
"arrowParens": "always",
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/Termix-SSH/Termix/main/packages/plugin-sdk/schema/changelog.schema.json",
|
||||
"releases": [
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"changes": [
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Start, stop, restart, pause and remove containers"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Live CPU, memory, network and disk stats"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Read and download container logs"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Open a shell inside a container"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Works with Docker and Podman"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.0
|
||||
|
||||
First release, bundled with Termix 2.9.0.
|
||||
|
||||
Manages Docker and Podman containers over SSH. List, inspect, start, stop and remove containers, read their logs and open a console inside them.
|
||||
@@ -0,0 +1,22 @@
|
||||
# Contributing to Docker
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
npm run validate # check manifest.json
|
||||
npm run format # format the code with Prettier
|
||||
```
|
||||
|
||||
## Settings
|
||||
|
||||
### Host
|
||||
|
||||
- **Enable Docker:** show the Docker tab for this host
|
||||
- **Container Runtime:** Docker or Podman
|
||||
|
||||
## Permissions
|
||||
|
||||
- `docker.use`: open the Docker manager and container consoles on hosts with Docker turned on. Admins and users have it by default.
|
||||
+36
-25
@@ -1,37 +1,48 @@
|
||||
# Docker
|
||||
<div align="center">
|
||||
|
||||
Manage Docker and Podman containers over SSH, with logs and a container console.
|
||||
<img src="https://raw.githubusercontent.com/Termix-SSH/Termix/main/public/icon.svg" width="120" height="120" alt="Termix Logo" />
|
||||
|
||||
<h1>Docker</h1>
|
||||
|
||||
<p>Manage Docker and Podman containers on your hosts</p>
|
||||
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
## Overview
|
||||
|
||||
Docker manages the containers running on your hosts over SSH. It is not meant to replace Portainer or Dockge, just to handle the containers you already have.
|
||||
|
||||
<br />
|
||||
|
||||
## Features
|
||||
|
||||
- List, inspect, start, stop, restart, pause and remove containers.
|
||||
- Read and download container logs.
|
||||
- Open an interactive console inside a container.
|
||||
- Works with Docker or Podman.
|
||||
- Adds a Docker widget to the homepage.
|
||||
- Start, stop, restart, pause and remove containers
|
||||
- Live CPU, memory, network and disk stats
|
||||
- Read and download container logs
|
||||
- Open a shell inside a container
|
||||
- Works with Docker and Podman
|
||||
|
||||
## Settings
|
||||
|
||||
### Host
|
||||
|
||||
- Enable Docker: show the Docker tab for this host.
|
||||
- Container Runtime: Docker or Podman.
|
||||
|
||||
## Permissions
|
||||
|
||||
- `docker.use`: Use Docker. Admins and users have it by default.
|
||||
<br />
|
||||
|
||||
## Services
|
||||
|
||||
Provides to other plugins:
|
||||
|
||||
- `docker.containers`: list containers and start, stop, restart, pause, unpause or remove them.
|
||||
- `docker.events`: get notified when a container starts, exits, restarts or turns unhealthy.
|
||||
- `docker.containers`: list containers and start, stop, restart, pause, unpause or remove them
|
||||
- `docker.events`: get notified when a container starts, exits, restarts or turns unhealthy
|
||||
|
||||
## Development
|
||||
<br />
|
||||
|
||||
```bash
|
||||
npm run build # build into dist/
|
||||
npm run test # run this plugin's tests
|
||||
npm run typecheck # type-check this plugin
|
||||
```
|
||||
## Support
|
||||
|
||||
To report a bug or request a feature, open a [support ticket](https://github.com/Termix-SSH/Support/issues/new/choose). You need to be logged in to GitHub. Please be as detailed as possible, preferably in English.
|
||||
|
||||
For discussions and questions, join the [Discord](https://discord.gg/jVQGdvHDrf) server.
|
||||
|
||||
<br />
|
||||
|
||||
## License
|
||||
|
||||
Distributed under the Apache License Version 2.0. See [LICENSE](https://github.com/Termix-SSH/Termix/blob/main/LICENSE) for more information.
|
||||
@@ -2,16 +2,16 @@
|
||||
"id": "docker",
|
||||
"name": "Docker",
|
||||
"version": "1.0.0",
|
||||
"description": "Manage Docker and Podman containers over SSH, with logs and a container console.",
|
||||
"description": "Manage Docker and Podman containers on your hosts over SSH, with logs, stats and a console.",
|
||||
"author": {
|
||||
"name": "Termix"
|
||||
},
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"repository": "https://github.com/Termix-SSH/Termix",
|
||||
"category": "Infrastructure",
|
||||
"icon": "Box",
|
||||
"engine": {
|
||||
"termix": ">=2.9.0",
|
||||
"termix": ">=26.10.0",
|
||||
"api": "1"
|
||||
},
|
||||
"capabilities": [
|
||||
|
||||
@@ -7,7 +7,10 @@
|
||||
"build": "termix-plugin build",
|
||||
"test": "termix-plugin test",
|
||||
"typecheck": "tsc -p .",
|
||||
"validate": "termix-plugin validate"
|
||||
"validate": "termix-plugin validate",
|
||||
"format": "prettier --write .",
|
||||
"format:check": "prettier --check .",
|
||||
"prepare": "husky || true"
|
||||
},
|
||||
"dependencies": {
|
||||
"@xterm/addon-clipboard": "^0.2.0",
|
||||
@@ -18,13 +21,18 @@
|
||||
"react-xtermjs": "^1.0.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.2.2",
|
||||
"@commitlint/config-conventional": "^21.2.0",
|
||||
"@termix/plugin-sdk": "^1.0.0",
|
||||
"@testing-library/dom": "^10.4.2",
|
||||
"@testing-library/react": "^16.3.3",
|
||||
"@types/node": "^26.2.0",
|
||||
"@types/react": "^19.2.18",
|
||||
"@types/react-dom": "^19.2.4",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^30.0.1",
|
||||
"lint-staged": "^17.2.0",
|
||||
"prettier": "3.9.9",
|
||||
"vitest": "^4.1.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -44,5 +52,10 @@
|
||||
"react-xtermjs": {
|
||||
"@xterm/xterm": "$@xterm/xterm"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{ts,tsx,js,jsx,mjs,cjs,json,css,md}": [
|
||||
"prettier --write"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"extends": ["@commitlint/config-conventional"],
|
||||
"rules": {
|
||||
"type-enum": [
|
||||
2,
|
||||
"always",
|
||||
[
|
||||
"feat",
|
||||
"fix",
|
||||
"docs",
|
||||
"style",
|
||||
"refactor",
|
||||
"perf",
|
||||
"test",
|
||||
"chore",
|
||||
"revert"
|
||||
]
|
||||
],
|
||||
"subject-case": [0]
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
custom: https://donate.termix.site/
|
||||
@@ -0,0 +1,34 @@
|
||||
# Overview
|
||||
|
||||
_Short summary of what this PR does_
|
||||
|
||||
- [ ] Added: ...
|
||||
- [ ] Updated: ...
|
||||
- [ ] Removed: ...
|
||||
- [ ] Fixed: ...
|
||||
|
||||
# Changes Made
|
||||
|
||||
_Detailed explanation of changes (if needed)_
|
||||
|
||||
- ...
|
||||
|
||||
# Related Issues
|
||||
|
||||
_Link any issues this PR addresses_
|
||||
|
||||
- Closes #ISSUE_NUMBER
|
||||
- Related to #ISSUE_NUMBER
|
||||
|
||||
# Screenshots / Demos
|
||||
|
||||
_(Optional: add before/after screenshots, GIFs, or console output)_
|
||||
|
||||
# Checklist
|
||||
|
||||
- [ ] Code follows project style guidelines
|
||||
- [ ] Supports mobile and desktop UI/app (if applicable)
|
||||
- [ ] Added the change to `CHANGELOG.json`
|
||||
- [ ] `npm run test`, `npm run typecheck` and `npm run validate` pass
|
||||
- [ ] I have read `CONTRIBUTING.md`
|
||||
- [ ] This is not a translation request. See [docs](https://docs.termix.site/translations)
|
||||
@@ -0,0 +1,9 @@
|
||||
node_modules
|
||||
dist
|
||||
coverage
|
||||
*.log
|
||||
.env
|
||||
*.tmxplug
|
||||
*.tmxplug.sig
|
||||
termix-plugin-signing.key
|
||||
.termix-tables-*
|
||||
@@ -0,0 +1 @@
|
||||
npx --no -- commitlint --edit "$1"
|
||||
@@ -0,0 +1 @@
|
||||
npx lint-staged
|
||||
@@ -0,0 +1,4 @@
|
||||
dist
|
||||
coverage
|
||||
node_modules
|
||||
package-lock.json
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 80,
|
||||
"arrowParens": "always",
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/Termix-SSH/Termix/main/packages/plugin-sdk/schema/changelog.schema.json",
|
||||
"releases": [
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"changes": [
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Browse, upload, download, rename, move and delete files, with sudo support"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Edit files in a built-in code editor"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Preview images, PDFs, audio and video"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "A trash you can restore deleted files from"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "Copy files between two hosts, with the fastest route picked for you and an integrity check"
|
||||
},
|
||||
{
|
||||
"type": "added",
|
||||
"text": "A side by side local and remote view in the desktop app"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Loaded 100 of 500 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user