Skip to content

Commit 3675efa

Browse files
committed
Refactor modulus new to template-based syntax
BREAKING: remove legacy new options; add --list and default module-avalonia; update tests/docs/specs
1 parent 82359c3 commit 3675efa

File tree

24 files changed

+371
-197
lines changed

24 files changed

+371
-197
lines changed

README.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ dotnet new install Agibuild.Modulus.Templates
7272

7373
```bash
7474
# Create a new module
75-
modulus new MyModule -t avalonia
75+
modulus new -n MyModule
7676

7777
# Or use dotnet new
7878
dotnet new modulus-avalonia -n MyModule
@@ -108,7 +108,7 @@ Modulus provides a comprehensive command-line tool for module development and ma
108108

109109
| Command | Description |
110110
|---------|-------------|
111-
| `modulus new <name>` | Create a new module project |
111+
| `modulus new` | Create a new module project |
112112
| `modulus build` | Build the module in current directory |
113113
| `modulus pack` | Build and package as .modpkg |
114114
| `modulus install <source>` | Install a module |
@@ -118,13 +118,11 @@ Modulus provides a comprehensive command-line tool for module development and ma
118118
### Create Module
119119

120120
```bash
121-
modulus new MyModule [options]
121+
modulus new [<template>] -n MyModule [options]
122122

123123
Options:
124-
-t, --target <avalonia|blazor> Target host platform
125-
-d, --display-name <name> Display name in menus
126-
-p, --publisher <name> Publisher name
127-
-i, --icon <icon> Menu icon
124+
-n, --name <name> Module name (PascalCase)
125+
-o, --output <dir> Output directory
128126
--force Overwrite existing
129127
```
130128

@@ -165,7 +163,7 @@ modulus list --verbose
165163
### 1. Create Projects
166164

167165
```bash
168-
modulus new MyExtension -t avalonia
166+
modulus new -n MyExtension
169167
```
170168

171169
This creates:

README.zh-CN.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ dotnet new install Agibuild.Modulus.Templates
7272

7373
```bash
7474
# 创建新模块
75-
modulus new MyModule -t avalonia
75+
modulus new -n MyModule
7676

7777
# 或使用 dotnet new
7878
dotnet new modulus-avalonia -n MyModule
@@ -108,7 +108,7 @@ Modulus 提供全面的命令行工具用于模块开发和管理。
108108

109109
| 命令 | 描述 |
110110
|------|------|
111-
| `modulus new <name>` | 创建新模块项目 |
111+
| `modulus new` | 创建新模块项目 |
112112
| `modulus build` | 在当前目录编译模块 |
113113
| `modulus pack` | 编译并打包为 .modpkg |
114114
| `modulus install <source>` | 安装模块 |
@@ -118,13 +118,11 @@ Modulus 提供全面的命令行工具用于模块开发和管理。
118118
### 创建模块
119119

120120
```bash
121-
modulus new MyModule [options]
121+
modulus new [<template>] -n MyModule [options]
122122

123123
选项:
124-
-t, --target <avalonia|blazor> 目标主机平台
125-
-d, --display-name <name> 菜单中显示的名称
126-
-p, --publisher <name> 发布者名称
127-
-i, --icon <icon> 菜单图标
124+
-n, --name <name> 模块名称 (PascalCase)
125+
-o, --output <dir> 输出目录
128126
--force 覆盖已有文件
129127
```
130128

@@ -165,7 +163,7 @@ modulus list --verbose
165163
### 1. 创建项目
166164

167165
```bash
168-
modulus new MyExtension -t avalonia
166+
modulus new -n MyExtension
169167
```
170168

171169
这将创建:

build/BuildTasks.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ private static bool IsSharedAssembly(string fileName)
851851
LogNormal("");
852852
LogNormal("To use these packages in module templates:");
853853
LogNormal(" 1. Run 'nuke add-local-source' (if not done)");
854-
LogNormal(" 2. Run 'modulus new MyModule --target avalonia'");
854+
LogNormal(" 2. Run 'modulus new -n MyModule'");
855855
LogNormal(" 3. dotnet restore will find packages from local source");
856856
});
857857

docs/cli-reference.md

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,48 +35,43 @@ Create a new Modulus module project with all necessary files and structure.
3535
### Syntax
3636

3737
```bash
38-
modulus new <name> [options]
38+
modulus new [<template>] -n <name> [options]
3939
```
4040

4141
### Arguments
4242

4343
| Argument | Required | Description |
4444
|----------|----------|-------------|
45-
| `<name>` | Yes | The module name (used for project and namespace) |
45+
| `<template>` | No | Template name: `module-avalonia` or `module-blazor` (default: `module-avalonia`) |
4646

4747
### Options
4848

4949
| Option | Short | Description | Default |
5050
|--------|-------|-------------|---------|
51-
| `--target` | `-t` | Target host: `avalonia` or `blazor` | (interactive) |
52-
| `--display-name` | `-d` | Display name shown in menus | Same as name |
53-
| `--description` | | Module description | Generated |
54-
| `--publisher` | `-p` | Publisher name | (interactive) |
55-
| `--icon` | `-i` | Menu icon (IconKind value) | `Folder` |
56-
| `--order` | `-o` | Menu order | `100` |
57-
| `--output` | | Output directory | Current directory |
51+
| `--name` | `-n` | The module name (used for project and namespace) | (required) |
52+
| `--output` | `-o` | Output directory | Current directory |
5853
| `--force` | `-f` | Overwrite existing directory | `false` |
54+
| `--list` | | List available templates and exit | `false` |
5955

60-
### Available Icons
56+
### Templates
6157

62-
Common icon values: `Folder`, `Home`, `Settings`, `Terminal`, `Code`, `Database`, `Cloud`, `User`, `Star`, `Heart`, `Search`, `Edit`, `Delete`, `Add`, `Check`, `Close`, `Info`, `Warning`, `Error`
63-
64-
See the full list in `Modulus.UI.Abstractions.IconKind` enum.
58+
- `module-avalonia`: Modulus module (Avalonia)
59+
- `module-blazor`: Modulus module (Blazor)
6560

6661
### Examples
6762

6863
```bash
69-
# Interactive mode (prompts for all options)
70-
modulus new MyModule
64+
# List templates
65+
modulus new --list
7166

72-
# Create Avalonia module with all options
73-
modulus new MyModule -t avalonia -d "My Module" -p "Acme Corp" -i Home
67+
# Create an Avalonia module (default template)
68+
modulus new -n MyModule
7469

75-
# Create Blazor module in specific directory
76-
modulus new MyModule -t blazor --output ./src/Modules/
70+
# Create a Blazor module in a specific directory
71+
modulus new module-blazor -n MyModule -o ./src/Modules/
7772

7873
# Overwrite existing project
79-
modulus new MyModule -t avalonia --force
74+
modulus new -n MyModule --force
8075
```
8176

8277
### Generated Structure

docs/getting-started.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ dotnet run --project src/Hosts/Modulus.Host.Avalonia
6060
Using the CLI:
6161

6262
```bash
63-
modulus new MyFirstModule -t avalonia
63+
modulus new -n MyFirstModule
6464
cd MyFirstModule
6565
```
6666

docs/getting-started.zh-CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ dotnet run --project src/Hosts/Modulus.Host.Avalonia
6060
使用 CLI:
6161

6262
```bash
63-
modulus new MyFirstModule -t avalonia
63+
modulus new -n MyFirstModule
6464
cd MyFirstModule
6565
```
6666

docs/samples/home-mockup-orbital.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ <h3>AI Agent 就绪</h3>
557557
</div>
558558
<div class="cli-line">
559559
<span class="cli-prompt">$</span>
560-
<span class="cli-command">modulus new <span class="cli-highlight">MyModule</span> -t avalonia</span>
560+
<span class="cli-command">modulus new -n <span class="cli-highlight">MyModule</span></span>
561561
<span class="cli-comment"># 创建新模块</span>
562562
</div>
563563
<div class="cli-line">
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
## Context
2+
3+
本变更聚焦于 `modulus new` 的命令行体验,目标是收敛参数面并对齐 `dotnet new` 的使用模型:以 template 选择为主、以通用参数(name/output/force)为辅,避免将模板内部元数据暴露为 CLI 参数。
4+
5+
## Goals / Non-Goals
6+
7+
- Goals
8+
- 最小参数面:创建项目只需理解 template + name + output/force
9+
- 具备可发现性:支持 `modulus new --list` 列出模板
10+
- 默认行为明确:未指定 template 时默认 `module-avalonia`
11+
- 立即删除冗余参数(breaking change)
12+
- Non-Goals
13+
- 不在本变更中引入更多模板(仅 `module-avalonia`/`module-blazor`
14+
- 不在本变更中更改生成的文件内容语义(仅命令行入口与参数映射调整)
15+
16+
## Decisions
17+
18+
### Decision: New syntax
19+
20+
Primary syntax:
21+
22+
```bash
23+
modulus new [<template>] -n <name> [-o <dir>] [-f] [--list]
24+
```
25+
26+
- `<template>`: `module-avalonia` / `module-blazor`(可选;缺省时为 `module-avalonia`
27+
- `-n|--name`: 模块名(PascalCase)
28+
- `-o|--output`: 输出目录(默认当前目录)
29+
- `-f|--force`: 覆盖已有目录
30+
- `--list`: 列出模板并退出(不创建项目)
31+
32+
### Decision: Immediate removal of legacy options
33+
34+
Deleted options (no compatibility layer):
35+
- `--target/-t`
36+
- `--display-name/-d`
37+
- `--description`
38+
- `--publisher/-p`
39+
- `--icon/-i`
40+
- `--order/-o`
41+
42+
Rationale: 这些参数属于模板内部元数据,应该由生成后修改文件/代码来完成,而不是创建命令的必选理解成本。
43+
44+
## Risks / Trade-offs
45+
46+
- **BREAKING**:脚本/文档中旧语法会失败,需要同步更新测试与文档。
47+
- 模板元数据不可在创建时通过 CLI 注入,用户需改生成文件(但换来更稳定的命令面)。
48+
49+
## Migration Plan
50+
51+
- Update docs/examples and integration tests to:
52+
- `modulus new -n MyModule`(默认 `module-avalonia`
53+
- `modulus new module-blazor -n MyModule`
54+
55+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Change: Refactor `modulus new` command surface to dotnet-new style
2+
3+
## Why
4+
5+
当前 `modulus new` 将大量模板元数据(显示名称、发布者、图标、菜单顺序等)暴露为命令行参数,导致参数面过大、难以发现与难以脚本化,也与 `dotnet new` 的最佳实践不一致。
6+
7+
## What Changes
8+
9+
-`modulus new` 重构为 **dotnet-new 风格**
10+
-**template** 驱动创建:`modulus new [<template>] -n <name> ...`
11+
- 提供 `--list` 列出可用模板
12+
- 未显式指定模板时,默认使用 `module-avalonia`
13+
- **BREAKING**:移除不必要的参数(立即删除,不做兼容别名/隐藏参数)
14+
- 移除:`--target/-t``--display-name/-d``--description``--publisher/-p``--icon/-i``--order/-o`
15+
- 统一创建命令的通用参数与语义
16+
- `-n|--name`:模块名(PascalCase)
17+
- `-o|--output`:输出目录(默认当前目录)
18+
- `-f|--force`:覆盖已有目录
19+
20+
## Impact
21+
22+
- Affected specs:
23+
- `openspec/specs/module-template/spec.md`(CLI 命令语法与行为)
24+
- `openspec/specs/cli-testing/spec.md`(new 命令测试用例语法)
25+
- Affected code (expected):
26+
- `src/Modulus.Cli/Commands/NewCommand.cs`(参数定义、解析与行为)
27+
- `tests/Modulus.Cli.IntegrationTests/Infrastructure/CliRunner.cs`
28+
- `tests/Modulus.Cli.IntegrationTests/Commands/NewCommandTests.cs`
29+
- `docs/cli-reference.md``docs/getting-started*.md``README*.md`(命令示例)
30+
31+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# cli-testing Specification (Delta)
2+
3+
## MODIFIED Requirements
4+
5+
### Requirement: CLI Command Tests
6+
7+
CLI 集成测试 SHALL 覆盖所有 CLI 命令的基本功能。
8+
9+
#### Scenario: New command creates module
10+
- **WHEN** 执行 `modulus new -n TestModule --force`
11+
- **THEN** 创建包含正确结构的模块目录
12+
- **AND** 生成 `.sln``.csproj``extension.vsixmanifest` 等文件
13+
14+
#### Scenario: Build command compiles module
15+
- **WHEN** 在模块目录执行 `modulus build`
16+
- **THEN** 编译成功并生成 DLL 文件
17+
- **AND** 返回退出码 0
18+
19+
#### Scenario: Pack command creates package
20+
- **WHEN** 在模块目录执行 `modulus pack`
21+
- **THEN** 生成 `.modpkg` 文件
22+
- **AND** 包内包含 `extension.vsixmanifest` 和模块 DLL
23+
24+
#### Scenario: Install command registers module
25+
- **WHEN** 执行 `modulus install <path>.modpkg`
26+
- **THEN** 解压包到模块目录
27+
- **AND** 在数据库中注册模块
28+
- **AND** `modulus list` 显示已安装模块
29+
30+
#### Scenario: Uninstall command removes module
31+
- **WHEN** 执行 `modulus uninstall <name> --force`
32+
- **THEN** 从数据库中删除模块记录
33+
- **AND** `modulus list` 不再显示该模块
34+
35+
#### Scenario: List command shows installed modules
36+
- **WHEN** 已安装模块后执行 `modulus list`
37+
- **THEN** 显示模块名称和版本
38+
- **WHEN** 执行 `modulus list --verbose`
39+
- **THEN** 额外显示模块 ID、发布者等详细信息
40+
41+

0 commit comments

Comments
 (0)