Skip to content

Commit 642223e

Browse files
authored
Feature: 创建项目时允许选择官方插件 (#175)
* ✨ allow installing official plugins after project creation * 🌐 update translations * 🚸 show description of official plugins
1 parent 2a800f8 commit 642223e

File tree

2 files changed

+100
-71
lines changed

2 files changed

+100
-71
lines changed

nb_cli/cli/commands/project.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
from nb_cli.compat import model_dump
2727
from nb_cli.config import ConfigManager
2828
from nb_cli.consts import DEFAULT_DRIVER
29+
from nb_cli.cli.utils import advanced_search
2930
from nb_cli.exceptions import ModuleLoadFailed
31+
from nb_cli.handlers.plugin import list_plugins
3032
from nb_cli.cli import CLI_DEFAULT_STYLE, ClickAliasedCommand, run_async
3133
from nb_cli.handlers import (
3234
Reloader,
@@ -392,6 +394,39 @@ async def create(
392394
fg="red",
393395
)
394396
ctx.exit(1)
397+
398+
plugins = await list_plugins()
399+
try:
400+
pending_plugins = [
401+
c.data
402+
for c in await CheckboxPrompt(
403+
_("Which official plugins would you like to use?"),
404+
[
405+
Choice(f"{p.name} ({p.desc})", p)
406+
for p in advanced_search("#official", plugins)
407+
],
408+
).prompt_async(style=CLI_DEFAULT_STYLE)
409+
]
410+
if pending_plugins:
411+
proc = await call_pip_install(
412+
[p.as_dependency() for p in pending_plugins],
413+
pip_args,
414+
python_path=config_manager.python_path,
415+
)
416+
await proc.wait()
417+
if proc.returncode == 0:
418+
config_manager.add_dependency(*pending_plugins)
419+
config_manager.add_plugin(*pending_plugins)
420+
else:
421+
click.secho(
422+
_(
423+
"Failed to install plugins! "
424+
"You should install the plugins manually."
425+
),
426+
fg="red",
427+
)
428+
except CancelledError:
429+
return
395430
else:
396431
click.secho(
397432
_(
@@ -402,14 +437,6 @@ async def create(
402437
)
403438

404439
click.secho(_("Done!"), fg="green")
405-
click.secho(
406-
_(
407-
"Add following packages to your project "
408-
"using dependency manager like poetry or pdm:"
409-
),
410-
fg="green",
411-
)
412-
click.secho(f" {' '.join(set(context.packages))}", fg="green")
413440
click.secho(_("Run the following command to start your bot:"), fg="green")
414441
click.secho(f" cd {project_dir}", fg="green")
415442
click.secho(" nb run --reload", fg="green")

nb_cli/locale/zh_CN/LC_MESSAGES/nb-cli.po

Lines changed: 65 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: nb-cli 1.0.0\n"
99
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10-
"POT-Creation-Date: 2025-12-04 11:11+0000\n"
10+
"POT-Creation-Date: 2025-12-10 06:17+0000\n"
1111
"PO-Revision-Date: 2023-01-11 08:56+0000\n"
1212
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313
"Language: zh_Hans_CN\n"
@@ -62,12 +62,12 @@ msgstr "你想要进行什么操作?"
6262
msgid "Run script {script_name!r}"
6363
msgstr "运行脚本 {script_name!r}"
6464

65-
#: nb_cli/cli/utils.py:96
65+
#: nb_cli/cli/utils.py:100
6666
#, python-brace-format
6767
msgid "Package {name} not found."
6868
msgstr "包 {name} 未找到."
6969

70-
#: nb_cli/cli/utils.py:98
70+
#: nb_cli/cli/utils.py:102
7171
msgid "*** You may check with `--include-unpublished` option if supported."
7272
msgstr "*** 可以对支持的命令使用 `--include-unpublished` 选项来确认."
7373

@@ -562,232 +562,234 @@ msgstr "插件名称:"
562562
msgid "Use nested plugin?"
563563
msgstr "使用嵌套插件?"
564564

565-
#: nb_cli/cli/commands/plugin.py:363 nb_cli/cli/commands/project.py:242
565+
#: nb_cli/cli/commands/plugin.py:363 nb_cli/cli/commands/project.py:245
566566
msgid "Where to store the plugin?"
567567
msgstr "请输入插件存储位置:"
568568

569-
#: nb_cli/cli/commands/project.py:51
569+
#: nb_cli/cli/commands/project.py:54
570570
msgid "bootstrap (for beginner or user)"
571571
msgstr "bootstrap (初学者或用户)"
572572

573-
#: nb_cli/cli/commands/project.py:52
573+
#: nb_cli/cli/commands/project.py:55
574574
msgid "simple (for plugin developer)"
575575
msgstr "simple (插件开发者)"
576576

577-
#: nb_cli/cli/commands/project.py:100
577+
#: nb_cli/cli/commands/project.py:103
578578
msgid "Loading adapters..."
579579
msgstr "正在加载适配器..."
580580

581-
#: nb_cli/cli/commands/project.py:102
581+
#: nb_cli/cli/commands/project.py:105
582582
msgid "Loading drivers..."
583583
msgstr "正在加载驱动器..."
584584

585-
#: nb_cli/cli/commands/project.py:107
585+
#: nb_cli/cli/commands/project.py:110
586586
msgid "Project Name:"
587587
msgstr "项目名称:"
588588

589-
#: nb_cli/cli/commands/project.py:109 nb_cli/cli/commands/project.py:117
589+
#: nb_cli/cli/commands/project.py:112 nb_cli/cli/commands/project.py:120
590590
msgid "Invalid project name!"
591591
msgstr "无效的项目名称!"
592592

593-
#: nb_cli/cli/commands/project.py:124
593+
#: nb_cli/cli/commands/project.py:127
594594
msgid "Current folder is not empty. Overwrite existing files?"
595595
msgstr "当前文件夹非空,是否要覆盖现有文件?"
596596

597-
#: nb_cli/cli/commands/project.py:127
597+
#: nb_cli/cli/commands/project.py:130
598598
msgid "Stopped creating bot."
599599
msgstr "停止创建机器人."
600600

601-
#: nb_cli/cli/commands/project.py:136
601+
#: nb_cli/cli/commands/project.py:139
602602
msgid "Which adapter(s) would you like to use?"
603603
msgstr "要使用哪些适配器?"
604604

605-
#: nb_cli/cli/commands/project.py:146
605+
#: nb_cli/cli/commands/project.py:149
606606
msgid "You haven't chosen any adapter! Please confirm."
607607
msgstr "你没有选择任何适配器! 请确认."
608608

609-
#: nb_cli/cli/commands/project.py:160
609+
#: nb_cli/cli/commands/project.py:163
610610
msgid "Which driver(s) would you like to use?"
611611
msgstr "要使用哪些驱动器?"
612612

613-
#: nb_cli/cli/commands/project.py:168
613+
#: nb_cli/cli/commands/project.py:171
614614
msgid "Chosen drivers is not valid!"
615615
msgstr "选择的驱动器不合法!"
616616

617-
#: nb_cli/cli/commands/project.py:182
617+
#: nb_cli/cli/commands/project.py:185
618618
msgid "User global (default, suitable for single instance in single user)"
619619
msgstr "用户全局 (默认, 适用于单用户下单实例)"
620620

621-
#: nb_cli/cli/commands/project.py:183
621+
#: nb_cli/cli/commands/project.py:186
622622
msgid "Current project (suitable for multiple/portable instances)"
623623
msgstr "当前项目 (适用于多实例/便携实例)"
624624

625-
#: nb_cli/cli/commands/project.py:185
625+
#: nb_cli/cli/commands/project.py:188
626626
msgid ""
627627
"User global (isolate by project name, suitable for multiple instances in "
628628
"single user)"
629629
msgstr "用户全局 (按项目名称隔离, 适用于单用户下多实例)"
630630

631-
#: nb_cli/cli/commands/project.py:188
631+
#: nb_cli/cli/commands/project.py:191
632632
msgid "Custom storage location (for advanced users)"
633633
msgstr "自定义存储位置 (高级用户)"
634634

635-
#: nb_cli/cli/commands/project.py:193
635+
#: nb_cli/cli/commands/project.py:196
636636
msgid "Which strategy of local storage would you like to use?"
637637
msgstr "要使用什么本地存储策略?"
638638

639-
#: nb_cli/cli/commands/project.py:216
639+
#: nb_cli/cli/commands/project.py:219
640640
msgid "Cache directory to use:"
641641
msgstr "要使用的缓存目录:"
642642

643-
#: nb_cli/cli/commands/project.py:221
643+
#: nb_cli/cli/commands/project.py:224
644644
msgid "Data directory to use:"
645645
msgstr "要使用的数据目录:"
646646

647-
#: nb_cli/cli/commands/project.py:226
647+
#: nb_cli/cli/commands/project.py:229
648648
msgid "Config directory to use:"
649649
msgstr "要使用的配置目录:"
650650

651-
#: nb_cli/cli/commands/project.py:238
651+
#: nb_cli/cli/commands/project.py:241
652652
#, python-brace-format
653653
msgid "1) In a \"{dir_name}\" folder"
654654
msgstr "1) 在 \"{dir_name}\" 文件夹中"
655655

656-
#: nb_cli/cli/commands/project.py:239
656+
#: nb_cli/cli/commands/project.py:242
657657
msgid "2) In a \"src\" folder"
658658
msgstr "2) 在 \"src\" 文件夹中"
659659

660-
#: nb_cli/cli/commands/project.py:249
660+
#: nb_cli/cli/commands/project.py:252
661661
msgid "Which developer tool(s) would you like to use?"
662662
msgstr "要使用哪些开发工具?"
663663

664-
#: nb_cli/cli/commands/project.py:251 nb_cli/cli/commands/project.py:252
664+
#: nb_cli/cli/commands/project.py:254 nb_cli/cli/commands/project.py:255
665665
msgid " (Recommended)"
666666
msgstr " (推荐)"
667667

668-
#: nb_cli/cli/commands/project.py:254
668+
#: nb_cli/cli/commands/project.py:257
669669
msgid " (Advanced user)"
670670
msgstr " (高级用户)"
671671

672-
#: nb_cli/cli/commands/project.py:259
672+
#: nb_cli/cli/commands/project.py:262
673673
msgid "Cannot choose 'Pylance/Pyright' and 'BasedPyright' at the same time."
674674
msgstr "不能同时选择 'Pylance/Pyright' 和 'BasedPyright'."
675675

676-
#: nb_cli/cli/commands/project.py:276
676+
#: nb_cli/cli/commands/project.py:279
677677
msgid "Create a NoneBot project."
678678
msgstr "创建一个 NoneBot 项目."
679679

680-
#: nb_cli/cli/commands/project.py:284
680+
#: nb_cli/cli/commands/project.py:287
681681
msgid "The project template to use."
682682
msgstr "使用的项目模板."
683683

684-
#: nb_cli/cli/commands/project.py:289
684+
#: nb_cli/cli/commands/project.py:292
685685
msgid "The python interpreter virtualenv is installed into."
686686
msgstr "虚拟环境使用的 Python 解释器."
687687

688-
#: nb_cli/cli/commands/project.py:306
688+
#: nb_cli/cli/commands/project.py:309
689689
msgid "Select a template to use:"
690690
msgstr "选择一个要使用的模板:"
691691

692-
#: nb_cli/cli/commands/project.py:328
692+
#: nb_cli/cli/commands/project.py:331
693693
msgid "Install dependencies now?"
694694
msgstr "立即安装依赖?"
695695

696-
#: nb_cli/cli/commands/project.py:343
696+
#: nb_cli/cli/commands/project.py:346
697697
msgid "Create virtual environment?"
698698
msgstr "创建虚拟环境?"
699699

700-
#: nb_cli/cli/commands/project.py:350
700+
#: nb_cli/cli/commands/project.py:353
701701
#, python-brace-format
702702
msgid "Creating virtual environment in {venv_dir} ..."
703703
msgstr "在 {venv_dir} 中创建虚拟环境..."
704704

705-
#: nb_cli/cli/commands/project.py:376
705+
#: nb_cli/cli/commands/project.py:379
706706
msgid "Which builtin plugin(s) would you like to use?"
707707
msgstr "要使用哪些内置插件?"
708708

709-
#: nb_cli/cli/commands/project.py:389
709+
#: nb_cli/cli/commands/project.py:392
710710
#, python-brace-format
711711
msgid "Failed to add builtin plugins {builtin_plugins} to config: {e}"
712712
msgstr "添加内置插件 {builtin_plugins} 到配置文件失败: {e}"
713713

714-
#: nb_cli/cli/commands/project.py:397
714+
#: nb_cli/cli/commands/project.py:403
715+
msgid "Which official plugins would you like to use?"
716+
msgstr "要使用哪些官方插件?"
717+
718+
#: nb_cli/cli/commands/project.py:423
719+
msgid "Failed to install plugins! You should install the plugins manually."
720+
msgstr "安装插件失败! 请手动安装插件."
721+
722+
#: nb_cli/cli/commands/project.py:433
715723
msgid ""
716724
"Failed to install dependencies! You should install the dependencies "
717725
"manually."
718726
msgstr "安装依赖失败! 请手动安装依赖."
719727

720-
#: nb_cli/cli/commands/project.py:403
728+
#: nb_cli/cli/commands/project.py:439
721729
msgid "Done!"
722730
msgstr "完成!"
723731

724-
#: nb_cli/cli/commands/project.py:406
725-
msgid ""
726-
"Add following packages to your project using dependency manager like "
727-
"poetry or pdm:"
728-
msgstr "使用 poetry 或 pdm 等依赖管理工具添加以下包:"
729-
730-
#: nb_cli/cli/commands/project.py:412
732+
#: nb_cli/cli/commands/project.py:440
731733
msgid "Run the following command to start your bot:"
732734
msgstr "运行以下命令来启动你的机器人:"
733735

734-
#: nb_cli/cli/commands/project.py:418
736+
#: nb_cli/cli/commands/project.py:446
735737
msgid "Generate entry file of your bot."
736738
msgstr "生成机器人的入口文件."
737739

738-
#: nb_cli/cli/commands/project.py:424
740+
#: nb_cli/cli/commands/project.py:452
739741
msgid "The file script saved to."
740742
msgstr "脚本文件保存路径."
741743

742-
#: nb_cli/cli/commands/project.py:433
744+
#: nb_cli/cli/commands/project.py:461
743745
msgid "Run the bot in current folder."
744746
msgstr "在当前文件夹中运行机器人."
745747

746-
#: nb_cli/cli/commands/project.py:440
748+
#: nb_cli/cli/commands/project.py:468
747749
msgid "Exist entry file of your bot."
748750
msgstr "存在的机器人入口文件."
749751

750-
#: nb_cli/cli/commands/project.py:447
752+
#: nb_cli/cli/commands/project.py:475
751753
msgid "Reload the bot when file changed."
752754
msgstr "当文件发生变化时重新加载机器人."
753755

754-
#: nb_cli/cli/commands/project.py:453
756+
#: nb_cli/cli/commands/project.py:481
755757
msgid "Paths to watch for changes."
756758
msgstr "要监视变化的路径."
757759

758-
#: nb_cli/cli/commands/project.py:459
760+
#: nb_cli/cli/commands/project.py:487
759761
msgid "Files to watch for changes."
760762
msgstr "要监视变化的文件."
761763

762-
#: nb_cli/cli/commands/project.py:465
764+
#: nb_cli/cli/commands/project.py:493
763765
msgid "Files to ignore for changes."
764766
msgstr "要忽略变化的文件."
765767

766-
#: nb_cli/cli/commands/project.py:472
768+
#: nb_cli/cli/commands/project.py:500
767769
msgid "Delay time for reloading in seconds."
768770
msgstr "重新加载的延迟时间(秒)."
769771

770-
#: nb_cli/cli/commands/project.py:505
772+
#: nb_cli/cli/commands/project.py:533
771773
msgid "Upgrade the project format of your bot."
772774
msgstr "升级机器人的项目格式."
773775

774-
#: nb_cli/cli/commands/project.py:510
776+
#: nb_cli/cli/commands/project.py:538
775777
msgid "Are you sure to upgrade the project format?"
776778
msgstr "你确定要升级项目格式吗?"
777779

778-
#: nb_cli/cli/commands/project.py:513
780+
#: nb_cli/cli/commands/project.py:541
779781
msgid "Successfully upgraded project format."
780782
msgstr "成功升级项目格式."
781783

782-
#: nb_cli/cli/commands/project.py:517
784+
#: nb_cli/cli/commands/project.py:545
783785
msgid "Downgrade the project format of your bot."
784786
msgstr "降级机器人的项目格式."
785787

786-
#: nb_cli/cli/commands/project.py:522
788+
#: nb_cli/cli/commands/project.py:550
787789
msgid "Are you sure to downgrade the project format?"
788790
msgstr "你确定要降级项目格式吗?"
789791

790-
#: nb_cli/cli/commands/project.py:525
792+
#: nb_cli/cli/commands/project.py:553
791793
msgid "Successfully downgraded project format."
792794
msgstr "成功降级项目格式."
793795

0 commit comments

Comments
 (0)