xwang 0.0.8 → 0.0.9

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.
@@ -50,15 +50,19 @@ validate_change_name() {
50
50
  red "ERROR: Change name cannot be empty" >&2
51
51
  exit 1
52
52
  fi
53
- if [[ ! "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
54
- red "ERROR: Invalid change name: '$name'" >&2
55
- red "Valid characters: a-z, A-Z, 0-9, -, _" >&2
56
- exit 1
57
- fi
58
53
  if [[ "$name" =~ \.\. ]]; then
59
54
  red "ERROR: Change name cannot contain '..' (path traversal not allowed)" >&2
60
55
  exit 1
61
56
  fi
57
+ # Reject path separators, whitespace, control chars, and shell metacharacters.
58
+ # CJK characters and other Unicode letters are allowed.
59
+ if printf '%s' "$name" | perl -ne 'exit 1 if m{[/\\\s\0-\x1F\x7F;|&$`()<>{}[\]*'"'"'"!#@%^=+~]}; exit 0'; then
60
+ : # valid
61
+ else
62
+ red "ERROR: Invalid change name: '$name'" >&2
63
+ red "Avoid: / \\ spaces control chars and shell metacharacters" >&2
64
+ exit 1
65
+ fi
62
66
  }
63
67
 
64
68
  if [ "${XWANG_GUARD_SOURCE_ONLY:-0}" = "1" ]; then
@@ -62,15 +62,19 @@ validate_change_name() {
62
62
  red "ERROR: Change name cannot be empty" >&2
63
63
  exit 1
64
64
  fi
65
- if [[ ! "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
66
- red "ERROR: Invalid change name: '$name'" >&2
67
- red "Valid characters: a-z, A-Z, 0-9, -, _" >&2
68
- exit 1
69
- fi
70
65
  if [[ "$name" =~ \.\. ]]; then
71
66
  red "ERROR: Change name cannot contain '..' (path traversal not allowed)" >&2
72
67
  exit 1
73
68
  fi
69
+ # Reject path separators, whitespace, control chars, and shell metacharacters.
70
+ # CJK characters and other Unicode letters are allowed.
71
+ if printf '%s' "$name" | perl -ne 'exit 1 if m{[/\\\s\0-\x1F\x7F;|&$`()<>{}[\]*'"'"'"!#@%^=+~]}; exit 0'; then
72
+ : # valid
73
+ else
74
+ red "ERROR: Invalid change name: '$name'" >&2
75
+ red "Avoid: / \\ spaces control chars and shell metacharacters" >&2
76
+ exit 1
77
+ fi
74
78
  }
75
79
 
76
80
  validate_enum() {
@@ -11,10 +11,10 @@ description: 启动 xwang 项目阶段2:深度设计,明确需求并同步
11
11
 
12
12
  1. 调用 `/grill-with-docs` 围绕需求目标、范围、用户、约束、验收标准等逐层追问,同时对照现有领域模型和文档(CONTEXT.md、ADRs)挑战术语、澄清冲突,直到达成共识。
13
13
  2. **强制进行 PRD 拆分预检(阻塞点)**:`/grill-with-docs` 确认需求完成后,**必须**输出一份 `PRD 拆分预检报告`,基于已澄清信息评估是否需要拆分为多个 change。**无论是否需要拆分,都必须停下来向用户展示报告并等待明确选择**;未确认前不得生成 PRD 或创建 OpenSpec change。
14
- 3. grilling 结束后,根据需求内容自己总结一个简洁的 kebab-case 需求名称 `<name>`,用于生成 `docs/mattpocock/<name>-prd.md`。
14
+ 3. grilling 结束后,根据需求内容自己总结一个简洁的中文需求名称 `<name>`,用于生成 `docs/mattpocock/<name>-prd.md`。
15
15
  4. 创建 `docs/mattpocock/` 目录(如不存在)。
16
16
  5. **需求澄清完成确认(阻塞点)**:向用户输出一份结构化的需求摘要(目标、范围、用户、核心行为、边界情况、非功能性需求、依赖与限制),等待用户明确确认或提出修改;未确认前不得生成 PRD 或创建 OpenSpec change。
17
- 6. 用户确认后,调用 `/to-prd` 基于对话上下文合成**中文** PRD。
17
+ 6. 用户确认后,调用 `/to-prd` 基于对话上下文合成 PRD。
18
18
  7. 将生成的 PRD 内容写入 `docs/mattpocock/<name>-prd.md`。
19
19
  8. 直接调用 `/openspec-new-change`:以 `<name>` 作为 change 名称,将 PRD 的中文内容作为 change 文档/上下文创建 change,过程中无需用户确认;若 `/openspec-new-change` 流程中出现任何确认提示(如“是否继续创建 proposal.md?”),直接代为确认并继续,不得将确认问题抛给用户;**要求 `/openspec-new-change` 生成的所有文档/artifact 必须使用中文表述,包括但不限于 `proposal.md`、`design.md`、`tasks.md` 以及 `specs/*/spec.md`**。
20
20
  9. **初始化 xwang 状态**:调用 `"$XWANG_STATE" init <name> full`,在 `openspec/changes/<name>/.xwang.yaml` 创建状态文件(起始 phase 为 `design`)。
@@ -97,7 +97,7 @@ grilling 确认完成后、生成 PRD 前,**必须**执行 PRD 拆分预检并
97
97
 
98
98
  ### Step 1b:需求澄清完成确认(阻塞点)
99
99
 
100
- - [ ] grilling 结束后,根据需求核心内容自己生成一个简洁的 kebab-case 名称(如 `Auth Flow` → `auth-flow`)作为 `<name>`,直接使用无需确认。
100
+ - [ ] grilling 结束后,根据需求核心内容自己生成一个简洁的中文名称(如 `会议周视图 UI 增强`)作为 `<name>`,直接使用无需确认。
101
101
  - [ ] 使用 `mkdir -p docs/mattpocock` 确保目录存在。
102
102
  - [ ] 向用户输出结构化的**需求确认摘要**(建议包含:目标、范围、目标用户、核心行为、边界情况、非功能性需求、依赖与限制)。
103
103
  - [ ] **必须使用当前平台可用的用户输入/确认机制暂停并等待用户确认需求澄清完成**。若用户提出修改,根据反馈调整摘要并再次确认,直到达成共识。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xwang",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "xwang CLI",
5
5
  "keywords": [
6
6
  "xwang",