sdd-flow-kit 1.0.3 → 1.0.5
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.
- package/README.md +20 -1
- package/dist/steps/invokeFlow.js +7 -2
- package/dist/steps/startFlow.js +1 -1
- package/package.json +1 -1
- package/src/templates/artifacts/06-agent-skill.template.md +6 -1
- package/src/templates/skills/confluence-doc.py.template +24 -0
- package/src/templates/skills/doc-skill.SKILL.md.template +1 -0
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#### 安装教程
|
|
15
15
|
|
|
16
16
|
1. 进入你要开发的项目目录
|
|
17
|
-
2. 安装:`
|
|
17
|
+
2. 安装:`pnpm add -D sdd-flow-kit && pnpm rebuild sdd-flow-kit`
|
|
18
18
|
- 安装后会自动执行一次初始化(postinstall)
|
|
19
19
|
- 交互终端下会提示选择项目类型(OMS / ADI / 欢盟 / AD Tools,默认 OMS)
|
|
20
20
|
- 非交互环境自动使用默认值(agent=claude-code, project=OMS)
|
|
@@ -27,6 +27,25 @@
|
|
|
27
27
|
|
|
28
28
|
> 可通过环境变量覆盖安装时默认项目类型:`SDD_FLOW_KIT_PROJECT=ADI npm i -D sdd-flow-kit`
|
|
29
29
|
|
|
30
|
+
#### 安装失败排查(推荐复制执行)
|
|
31
|
+
|
|
32
|
+
当安装后没有生成 `.cursor/skills/sdd-flow-kit/SKILL.md` 时,按以下顺序处理:
|
|
33
|
+
|
|
34
|
+
1. 检查包是否已安装:`pnpm list sdd-flow-kit --depth 0`
|
|
35
|
+
2. 若出现 `ERR_PNPM_UNEXPECTED_STORE`,先对齐 store(示例):
|
|
36
|
+
- `pnpm config set store-dir /Users/<your-user>/Library/pnpm/store/v10 --global`
|
|
37
|
+
3. 重新触发脚本:`pnpm rebuild sdd-flow-kit`
|
|
38
|
+
4. 若仍未生成,执行手动兜底(100%触发初始化):
|
|
39
|
+
- `node ./node_modules/sdd-flow-kit/dist/postinstall.js`
|
|
40
|
+
5. 验证产物:
|
|
41
|
+
- `ls .cursor/skills/sdd-flow-kit/SKILL.md`
|
|
42
|
+
- `ls .claude/skills/sdd-flow-kit/SKILL.md`
|
|
43
|
+
- `ls docs/*-doc-skill/SKILL.md`
|
|
44
|
+
|
|
45
|
+
团队推荐安装命令(稳妥):
|
|
46
|
+
|
|
47
|
+
`pnpm add -D sdd-flow-kit && pnpm rebuild sdd-flow-kit`
|
|
48
|
+
|
|
30
49
|
#### 使用说明
|
|
31
50
|
|
|
32
51
|
1. `install`(等价 `setup`):提示选择开发环境(cursor/claude-code/codex/openclaw,默认 claude-code)与开发分支(无则自动创建),并检测/安装 openspec+superpower 基础环境,同时写入项目级 Skill
|
package/dist/steps/invokeFlow.js
CHANGED
|
@@ -4,10 +4,15 @@ exports.parseInvokeText = parseInvokeText;
|
|
|
4
4
|
exports.toRunOptions = toRunOptions;
|
|
5
5
|
function parseInvokeText(text) {
|
|
6
6
|
const normalized = text.trim();
|
|
7
|
-
|
|
7
|
+
// 兼容以下常见表达:
|
|
8
|
+
// - 开发 OMS 1.24.4 需求
|
|
9
|
+
// - 开发 OMS-V1.24.4 版本
|
|
10
|
+
// - 开发OMS-V1.24.4版本
|
|
11
|
+
// - 开发 AD Tools V1.2.3 PRD
|
|
12
|
+
const match = normalized.match(/开发\s*(.+?)(?:[-_\s]*)V?([0-9]+(?:\.[0-9]+){1,3})\s*(?:需求|版本|PRD)?/i);
|
|
8
13
|
if (!match)
|
|
9
14
|
return null;
|
|
10
|
-
const product = match[1].toUpperCase();
|
|
15
|
+
const product = match[1].replace(/[-_\s]+$/g, "").toUpperCase();
|
|
11
16
|
const version = match[2];
|
|
12
17
|
return { product, version };
|
|
13
18
|
}
|
package/dist/steps/startFlow.js
CHANGED
|
@@ -79,7 +79,7 @@ async function startFlowScaffold(options) {
|
|
|
79
79
|
"",
|
|
80
80
|
`本次 runId: \`${runId}\``,
|
|
81
81
|
"",
|
|
82
|
-
"## Step 1:获取需求文档(
|
|
82
|
+
"## Step 1:获取需求文档(docs/<project>-doc-skill)",
|
|
83
83
|
"请打开 `01-获取需求文档指引.md`,并使用你的 AI 工具执行相应动作,把 PRD/接口文档回填到 `source/`。",
|
|
84
84
|
"",
|
|
85
85
|
"## Step 2:执行 SDD 循环并生成 01/02/03 文件",
|
package/package.json
CHANGED
|
@@ -6,7 +6,12 @@ description: 当用户说“开发 <产品> <版本> 需求/版本/PRD”或类
|
|
|
6
6
|
# SDD Flow Trigger Skill
|
|
7
7
|
|
|
8
8
|
## 触发条件(仅这些场景触发)
|
|
9
|
-
-
|
|
9
|
+
- 用户说法包含类似:
|
|
10
|
+
- `开发 XXX 1.2 需求`
|
|
11
|
+
- `开发 XXX 1.2.3 版本`
|
|
12
|
+
- `开发 XXX-V1.2.3 版本`
|
|
13
|
+
- `开发XXX-V1.2.3版本`(无空格连写)
|
|
14
|
+
- `开发 XXX PRD`
|
|
10
15
|
- 或明确要求“按 SDD 流程”推进某版本需求
|
|
11
16
|
|
|
12
17
|
## 触发后必须执行
|
|
@@ -39,6 +39,25 @@ def env(name: str, default: str | None = None) -> str:
|
|
|
39
39
|
return str(v)
|
|
40
40
|
|
|
41
41
|
|
|
42
|
+
def load_env_file(file_path: Path) -> None:
|
|
43
|
+
"""轻量加载 .env 文件(不依赖 python-dotenv)。"""
|
|
44
|
+
if not file_path.exists() or not file_path.is_file():
|
|
45
|
+
return
|
|
46
|
+
try:
|
|
47
|
+
for raw in file_path.read_text(encoding="utf-8").splitlines():
|
|
48
|
+
line = raw.strip()
|
|
49
|
+
if not line or line.startswith("#") or "=" not in line:
|
|
50
|
+
continue
|
|
51
|
+
key, value = line.split("=", 1)
|
|
52
|
+
key = key.strip()
|
|
53
|
+
value = value.strip().strip('"').strip("'")
|
|
54
|
+
if key and key not in os.environ:
|
|
55
|
+
os.environ[key] = value
|
|
56
|
+
except Exception:
|
|
57
|
+
# 失败不阻断,继续走显式环境变量
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
|
|
42
61
|
def normalize_version(raw: str) -> str:
|
|
43
62
|
"""将 1.2.3 / V1.2.3 / XXX-V1.2.3 / XXX_V1.2.3 统一为 1.2.3"""
|
|
44
63
|
v = raw.strip()
|
|
@@ -171,6 +190,11 @@ def main():
|
|
|
171
190
|
print(" 用法: python3 confluence-doc.py <版本号>")
|
|
172
191
|
sys.exit(1)
|
|
173
192
|
|
|
193
|
+
# 自动尝试从项目常见 env 文件加载配置,降低手工配置成本
|
|
194
|
+
repo_root = Path(__file__).resolve().parents[2]
|
|
195
|
+
for env_name in [".env.pre", ".env", ".env.local", ".env.development", ".env.test"]:
|
|
196
|
+
load_env_file(repo_root / env_name)
|
|
197
|
+
|
|
174
198
|
base_url = env("CONFLUENCE_BASE_URL")
|
|
175
199
|
search_url = env("CONFLUENCE_SEARCH_URL", base_url.rstrip("/") + "/dosearchsite.action?includeArchivedSpaces=false")
|
|
176
200
|
username = env("CONFLUENCE_USERNAME")
|
|
@@ -52,4 +52,5 @@ python3 confluence-doc.py {{PRODUCT_PREFIX}}_V1.2.3
|
|
|
52
52
|
- 依赖 Playwright:`pip install playwright && playwright install chromium`
|
|
53
53
|
- 脚本:`docs/{{SKILL_DIR}}/confluence-doc.py`
|
|
54
54
|
- 为安全起见,脚本不包含默认账号密码,请用环境变量注入
|
|
55
|
+
- 脚本会自动尝试读取仓库根目录的 `.env.pre` / `.env` / `.env.local`(若其中存在 `CONFLUENCE_*` 配置可直接复用)
|
|
55
56
|
|