mspec-cli 5.0.0__tar.gz → 5.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mspec_cli-5.0.0/src/mspec_cli.egg-info → mspec_cli-5.0.2}/PKG-INFO +1 -1
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/pyproject.toml +2 -2
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/__init__.py +1 -1
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/commands/doctor.py +8 -4
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/core/template.py +54 -16
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/templates/config.yaml +12 -12
- {mspec_cli-5.0.0 → mspec_cli-5.0.2/src/mspec_cli.egg-info}/PKG-INFO +1 -1
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec_cli.egg-info/SOURCES.txt +8 -8
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/LICENSE +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/MANIFEST.in +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/README.md +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/setup.cfg +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/__main__.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/cli.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/commands/__init__.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/commands/init.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/commands/update.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/core/__init__.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/core/config.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/core/openspec_manager.py +0 -0
- {mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/evolution}/adr.md +0 -0
- {mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/evolution}/glossary.md +0 -0
- {mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/evolution}/risk-map.md +0 -0
- {mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/issues}/design-issues.md +0 -0
- {mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/issues}/requirement-issues.md +0 -0
- {mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/issues}/retrospective-notes.md +0 -0
- {mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/taxonomy}/design-issue-taxonomy.md +0 -0
- {mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/taxonomy}/requirement-issue-taxonomy.md +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/utils/__init__.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec/utils/console.py +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec_cli.egg-info/dependency_links.txt +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec_cli.egg-info/entry_points.txt +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec_cli.egg-info/requires.txt +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/src/mspec_cli.egg-info/top_level.txt +0 -0
- {mspec_cli-5.0.0 → mspec_cli-5.0.2}/tests/test_init.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mspec-cli"
|
|
7
|
-
version = "5.0.
|
|
7
|
+
version = "5.0.2"
|
|
8
8
|
description = "mspec-cli(Member Spec)- 会员组规范驱动开发工作流 CLI 工具"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -57,7 +57,7 @@ Issues = "https://github.com/mspec-dev/mspec/issues"
|
|
|
57
57
|
where = ["src"]
|
|
58
58
|
|
|
59
59
|
[tool.setuptools.package-data]
|
|
60
|
-
mspec = ["templates/*"]
|
|
60
|
+
mspec = ["templates/*", "templates/**/*"]
|
|
61
61
|
|
|
62
62
|
[tool.black]
|
|
63
63
|
line-length = 100
|
|
@@ -131,10 +131,14 @@ def _check_template_files() -> dict:
|
|
|
131
131
|
return {"ok": False, "message": "未找到 templates/ 目录"}
|
|
132
132
|
|
|
133
133
|
required_files = [
|
|
134
|
-
"requirement-issue-taxonomy.md",
|
|
135
|
-
"design-issue-taxonomy.md",
|
|
136
|
-
"requirement-issues.md",
|
|
137
|
-
"design-issues.md",
|
|
134
|
+
"taxonomy/requirement-issue-taxonomy.md",
|
|
135
|
+
"taxonomy/design-issue-taxonomy.md",
|
|
136
|
+
"issues/requirement-issues.md",
|
|
137
|
+
"issues/design-issues.md",
|
|
138
|
+
"issues/retrospective-notes.md",
|
|
139
|
+
"evolution/adr.md",
|
|
140
|
+
"evolution/glossary.md",
|
|
141
|
+
"evolution/risk-map.md",
|
|
138
142
|
]
|
|
139
143
|
|
|
140
144
|
missing = []
|
|
@@ -23,7 +23,7 @@ class TemplateManager:
|
|
|
23
23
|
"""获取内置模板文件
|
|
24
24
|
|
|
25
25
|
Returns:
|
|
26
|
-
|
|
26
|
+
文件名到内容的字典,键为相对于 openspec/ 的路径
|
|
27
27
|
"""
|
|
28
28
|
files = {}
|
|
29
29
|
|
|
@@ -32,17 +32,37 @@ class TemplateManager:
|
|
|
32
32
|
if config_path.exists():
|
|
33
33
|
files["config.yaml"] = config_path.read_text(encoding="utf-8")
|
|
34
34
|
|
|
35
|
-
#
|
|
36
|
-
|
|
35
|
+
# templates/taxonomy/ — 问题分类学知识库(AI 参考)
|
|
36
|
+
taxonomy_files = [
|
|
37
37
|
"requirement-issue-taxonomy.md",
|
|
38
38
|
"design-issue-taxonomy.md",
|
|
39
|
+
]
|
|
40
|
+
for file_name in taxonomy_files:
|
|
41
|
+
file_path = self.builtin_path / "taxonomy" / file_name
|
|
42
|
+
if file_path.exists():
|
|
43
|
+
files[f"templates/taxonomy/{file_name}"] = file_path.read_text(encoding="utf-8")
|
|
44
|
+
|
|
45
|
+
# templates/issues/ — 问题清单模板(per-change 使用)
|
|
46
|
+
issues_files = [
|
|
39
47
|
"requirement-issues.md",
|
|
40
48
|
"design-issues.md",
|
|
49
|
+
"retrospective-notes.md",
|
|
50
|
+
]
|
|
51
|
+
for file_name in issues_files:
|
|
52
|
+
file_path = self.builtin_path / "issues" / file_name
|
|
53
|
+
if file_path.exists():
|
|
54
|
+
files[f"templates/issues/{file_name}"] = file_path.read_text(encoding="utf-8")
|
|
55
|
+
|
|
56
|
+
# templates/evolution/ — 进化体系格式模板(archive 阶段参考)
|
|
57
|
+
evolution_files = [
|
|
58
|
+
"adr.md",
|
|
59
|
+
"glossary.md",
|
|
60
|
+
"risk-map.md",
|
|
41
61
|
]
|
|
42
|
-
for file_name in
|
|
43
|
-
file_path = self.builtin_path / file_name
|
|
62
|
+
for file_name in evolution_files:
|
|
63
|
+
file_path = self.builtin_path / "evolution" / file_name
|
|
44
64
|
if file_path.exists():
|
|
45
|
-
files[f"templates/{file_name}"] = file_path.read_text(encoding="utf-8")
|
|
65
|
+
files[f"templates/evolution/{file_name}"] = file_path.read_text(encoding="utf-8")
|
|
46
66
|
|
|
47
67
|
return files
|
|
48
68
|
|
|
@@ -71,7 +91,7 @@ class TemplateManager:
|
|
|
71
91
|
|
|
72
92
|
raw_base = repo_url.replace("github.com", "raw.githubusercontent.com") + "/main/"
|
|
73
93
|
|
|
74
|
-
# config.yaml
|
|
94
|
+
# config.yaml 写入根目录
|
|
75
95
|
config_url = f"{raw_base}config.yaml"
|
|
76
96
|
try:
|
|
77
97
|
response = requests.get(config_url, timeout=30)
|
|
@@ -80,18 +100,36 @@ class TemplateManager:
|
|
|
80
100
|
except requests.RequestException:
|
|
81
101
|
pass
|
|
82
102
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
103
|
+
# templates/taxonomy/
|
|
104
|
+
taxonomy_files = ["requirement-issue-taxonomy.md", "design-issue-taxonomy.md"]
|
|
105
|
+
for file_name in taxonomy_files:
|
|
106
|
+
url = f"{raw_base}taxonomy/{file_name}"
|
|
107
|
+
try:
|
|
108
|
+
response = requests.get(url, timeout=30)
|
|
109
|
+
if response.status_code == 200:
|
|
110
|
+
files[f"templates/taxonomy/{file_name}"] = response.text
|
|
111
|
+
except requests.RequestException:
|
|
112
|
+
continue
|
|
113
|
+
|
|
114
|
+
# templates/issues/
|
|
115
|
+
issues_files = ["requirement-issues.md", "design-issues.md", "retrospective-notes.md"]
|
|
116
|
+
for file_name in issues_files:
|
|
117
|
+
url = f"{raw_base}issues/{file_name}"
|
|
118
|
+
try:
|
|
119
|
+
response = requests.get(url, timeout=30)
|
|
120
|
+
if response.status_code == 200:
|
|
121
|
+
files[f"templates/issues/{file_name}"] = response.text
|
|
122
|
+
except requests.RequestException:
|
|
123
|
+
continue
|
|
124
|
+
|
|
125
|
+
# templates/evolution/
|
|
126
|
+
evolution_files = ["adr.md", "glossary.md", "risk-map.md"]
|
|
127
|
+
for file_name in evolution_files:
|
|
128
|
+
url = f"{raw_base}evolution/{file_name}"
|
|
91
129
|
try:
|
|
92
130
|
response = requests.get(url, timeout=30)
|
|
93
131
|
if response.status_code == 200:
|
|
94
|
-
files[f"templates/{file_name}"] = response.text
|
|
132
|
+
files[f"templates/evolution/{file_name}"] = response.text
|
|
95
133
|
except requests.RequestException:
|
|
96
134
|
continue
|
|
97
135
|
|
|
@@ -8,7 +8,7 @@ schema: spec-driven
|
|
|
8
8
|
# 所有增强逻辑通过 context 和 rules 注入,不改变 OpenSpec schema
|
|
9
9
|
# =============================================================================
|
|
10
10
|
|
|
11
|
-
version: "5.0.
|
|
11
|
+
version: "5.0.2"
|
|
12
12
|
language: zh
|
|
13
13
|
|
|
14
14
|
# =============================================================================
|
|
@@ -31,7 +31,7 @@ context: |
|
|
|
31
31
|
|
|
32
32
|
**如果不通过,执行以下流程**:
|
|
33
33
|
```
|
|
34
|
-
步骤 1: 读取 openspec/templates/requirement-issue-taxonomy.md
|
|
34
|
+
步骤 1: 读取 openspec/templates/taxonomy/requirement-issue-taxonomy.md
|
|
35
35
|
步骤 2: 分析需求,识别功能点(Capabilities)
|
|
36
36
|
步骤 3: 按 6 个维度检查每个功能点的问题
|
|
37
37
|
步骤 4: 创建 spec/requirement-issues.md,填充发现问题
|
|
@@ -53,7 +53,7 @@ context: |
|
|
|
53
53
|
|
|
54
54
|
**如果不通过,执行类似的需求澄清流程**:
|
|
55
55
|
```
|
|
56
|
-
步骤 1: 读取 openspec/templates/design-issue-taxonomy.md
|
|
56
|
+
步骤 1: 读取 openspec/templates/taxonomy/design-issue-taxonomy.md
|
|
57
57
|
步骤 2: 按 7 个维度分析 design.md 的不确定性
|
|
58
58
|
步骤 3: 创建 spec/design-issues.md
|
|
59
59
|
步骤 4: 【强制用户确认——无论是否发现问题都必须执行】
|
|
@@ -85,10 +85,10 @@ context: |
|
|
|
85
85
|
|
|
86
86
|
## 📚 问题分类学知识库(用于问题发现)
|
|
87
87
|
|
|
88
|
-
1. **需求问题分类学**: `openspec/templates/requirement-issue-taxonomy.md`
|
|
88
|
+
1. **需求问题分类学**: `openspec/templates/taxonomy/requirement-issue-taxonomy.md`
|
|
89
89
|
- 6 个维度:功能完整性、数据相关、用户体验、边界异常、集成依赖、优先级
|
|
90
90
|
|
|
91
|
-
2. **设计问题分类学**: `openspec/templates/design-issue-taxonomy.md`
|
|
91
|
+
2. **设计问题分类学**: `openspec/templates/taxonomy/design-issue-taxonomy.md`
|
|
92
92
|
- 7 个维度:架构决策、技术选型、接口设计、数据状态、安全合规、性能可靠性、部署运维
|
|
93
93
|
|
|
94
94
|
## 🔄 澄清流程状态机
|
|
@@ -111,8 +111,8 @@ context: |
|
|
|
111
111
|
|
|
112
112
|
## 📋 问题清单模板位置
|
|
113
113
|
|
|
114
|
-
- 功能点问题清单: `openspec/templates/requirement-issues.md`
|
|
115
|
-
- 设计问题清单: `openspec/templates/design-issues.md`
|
|
114
|
+
- 功能点问题清单: `openspec/templates/issues/requirement-issues.md`
|
|
115
|
+
- 设计问题清单: `openspec/templates/issues/design-issues.md`
|
|
116
116
|
|
|
117
117
|
## ⚠️ 问题严重程度定义
|
|
118
118
|
|
|
@@ -365,18 +365,18 @@ rules:
|
|
|
365
365
|
**理由**: {为什么}
|
|
366
366
|
**备选**: {考虑过哪些}
|
|
367
367
|
**状态**: active
|
|
368
|
-
- 如文件不存在,先创建(参考 openspec/templates/adr.md 格式)
|
|
368
|
+
- 如文件不存在,先创建(参考 openspec/templates/evolution/adr.md 格式)
|
|
369
369
|
|
|
370
370
|
A2. 领域词汇表:
|
|
371
371
|
- 读取复盘报告"五、领域词汇"章节
|
|
372
372
|
- 如有新术语,追加到 openspec/glossary.md
|
|
373
|
-
- 如文件不存在,先创建(参考 openspec/templates/glossary.md 格式)
|
|
373
|
+
- 如文件不存在,先创建(参考 openspec/templates/evolution/glossary.md 格式)
|
|
374
374
|
|
|
375
375
|
A3. 风险图谱:
|
|
376
376
|
- 读取复盘报告"六、风险事件"章节
|
|
377
377
|
- 如有新风险事件,追加到 openspec/risk-map.md 的对应分区
|
|
378
378
|
("代码热点"或"问题模式")
|
|
379
|
-
- 如文件不存在,先创建(参考 openspec/templates/risk-map.md 格式)
|
|
379
|
+
- 如文件不存在,先创建(参考 openspec/templates/evolution/risk-map.md 格式)
|
|
380
380
|
|
|
381
381
|
C1. 规格演化日志(如本次有 delta spec sync):
|
|
382
382
|
- 将 delta spec 的变更(改了什么 + 为什么)追加到 openspec/specs/CHANGELOG.md
|
|
@@ -439,8 +439,8 @@ rules:
|
|
|
439
439
|
|
|
440
440
|
f. 根据用户选择:
|
|
441
441
|
- A(全部应用):
|
|
442
|
-
· 更新 openspec/templates/requirement-issue-taxonomy.md(B1)
|
|
443
|
-
· 更新 openspec/templates/design-issue-taxonomy.md(B1)
|
|
442
|
+
· 更新 openspec/templates/taxonomy/requirement-issue-taxonomy.md(B1)
|
|
443
|
+
· 更新 openspec/templates/taxonomy/design-issue-taxonomy.md(B1)
|
|
444
444
|
· 更新/创建 openspec/task-patterns/ 下对应文件(B2)
|
|
445
445
|
· 如有偏好建议:更新 openspec/config.yaml 的 user_preferences(B3)
|
|
446
446
|
· 将已分析复盘文件状态改为 incorporated
|
|
@@ -13,15 +13,15 @@ src/mspec/core/__init__.py
|
|
|
13
13
|
src/mspec/core/config.py
|
|
14
14
|
src/mspec/core/openspec_manager.py
|
|
15
15
|
src/mspec/core/template.py
|
|
16
|
-
src/mspec/templates/adr.md
|
|
17
16
|
src/mspec/templates/config.yaml
|
|
18
|
-
src/mspec/templates/
|
|
19
|
-
src/mspec/templates/
|
|
20
|
-
src/mspec/templates/
|
|
21
|
-
src/mspec/templates/
|
|
22
|
-
src/mspec/templates/requirement-issues.md
|
|
23
|
-
src/mspec/templates/retrospective-notes.md
|
|
24
|
-
src/mspec/templates/
|
|
17
|
+
src/mspec/templates/evolution/adr.md
|
|
18
|
+
src/mspec/templates/evolution/glossary.md
|
|
19
|
+
src/mspec/templates/evolution/risk-map.md
|
|
20
|
+
src/mspec/templates/issues/design-issues.md
|
|
21
|
+
src/mspec/templates/issues/requirement-issues.md
|
|
22
|
+
src/mspec/templates/issues/retrospective-notes.md
|
|
23
|
+
src/mspec/templates/taxonomy/design-issue-taxonomy.md
|
|
24
|
+
src/mspec/templates/taxonomy/requirement-issue-taxonomy.md
|
|
25
25
|
src/mspec/utils/__init__.py
|
|
26
26
|
src/mspec/utils/console.py
|
|
27
27
|
src/mspec_cli.egg-info/PKG-INFO
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/evolution}/adr.md
RENAMED
|
File without changes
|
{mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/evolution}/glossary.md
RENAMED
|
File without changes
|
{mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/evolution}/risk-map.md
RENAMED
|
File without changes
|
{mspec_cli-5.0.0/src/mspec/templates → mspec_cli-5.0.2/src/mspec/templates/issues}/design-issues.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|