xwang 0.0.2 → 0.0.3

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.
@@ -16,14 +16,40 @@ if [ ! -f "$XWANG_STATE" ]; then
16
16
  return 1
17
17
  fi
18
18
 
19
+ # Locate a file by expanding globs under a list of directories.
20
+ # Avoids `find` so it works on Windows where only CMD/PowerShell find.exe exists.
21
+ locate_by_glob() {
22
+ local glob="$1"
23
+ shift
24
+ local dir candidate
25
+ for dir in "$@"; do
26
+ [ -d "$dir" ] || continue
27
+ for candidate in "$dir"/$glob; do
28
+ if [ -f "$candidate" ]; then
29
+ printf '%s' "$candidate"
30
+ return 0
31
+ fi
32
+ done
33
+ done
34
+ return 1
35
+ }
36
+
37
+ # Search locations, in order of preference.
38
+ SEARCH_DIRS=(
39
+ "$XWANG_SCRIPT_DIR"
40
+ "$XWANG_SCRIPT_DIR/.."
41
+ "$HOME"
42
+ "$HOME/.config"
43
+ )
44
+
19
45
  # Locate xwang-open-check.sh dynamically without hardcoding a .claude path.
20
- # Prefer the sibling relative location, then fall back to a platform-agnostic search.
46
+ # Prefer the sibling relative location, then fall back to a glob search.
21
47
  if [ -z "${XWANG_OPEN_CHECK:-}" ]; then
22
- XWANG_OPEN_CHECK_SIBLING="${XWANG_SCRIPT_DIR}/../xwang-open/scripts/xwang-open-check.sh"
48
+ XWANG_OPEN_CHECK_SIBLING="${XWANG_SCRIPT_DIR}/../../xwang-open/scripts/xwang-open-check.sh"
23
49
  if [ -f "$XWANG_OPEN_CHECK_SIBLING" ]; then
24
- XWANG_OPEN_CHECK="$XWANG_OPEN_CHECK_SIBLING"
50
+ XWANG_OPEN_CHECK="$(cd "$(dirname "$XWANG_OPEN_CHECK_SIBLING")" && pwd)/$(basename "$XWANG_OPEN_CHECK_SIBLING")"
25
51
  else
26
- XWANG_OPEN_CHECK="$(find "$XWANG_SCRIPT_DIR" "$XWANG_SCRIPT_DIR/.." "$HOME" -path '*/xwang-open/scripts/xwang-open-check.sh' -type f -print -quit 2>/dev/null || true)"
52
+ XWANG_OPEN_CHECK="$(locate_by_glob '*/xwang-open/scripts/xwang-open-check.sh' "${SEARCH_DIRS[@]}" 2>/dev/null || true)"
27
53
  fi
28
54
  fi
29
55
  export XWANG_OPEN_CHECK
@@ -32,9 +58,9 @@ export XWANG_OPEN_CHECK
32
58
  if [ -z "${XWANG_GUARD:-}" ]; then
33
59
  XWANG_GUARD_SIBLING="${XWANG_SCRIPT_DIR}/xwang-guard.sh"
34
60
  if [ -f "$XWANG_GUARD_SIBLING" ]; then
35
- XWANG_GUARD="$XWANG_GUARD_SIBLING"
61
+ XWANG_GUARD="$(cd "$(dirname "$XWANG_GUARD_SIBLING")" && pwd)/$(basename "$XWANG_GUARD_SIBLING")"
36
62
  else
37
- XWANG_GUARD="$(find "$XWANG_SCRIPT_DIR" "$XWANG_SCRIPT_DIR/.." "$HOME" -path '*/xwang/scripts/xwang-guard.sh' -type f -print -quit 2>/dev/null || true)"
63
+ XWANG_GUARD="$(locate_by_glob '*/xwang/scripts/xwang-guard.sh' "${SEARCH_DIRS[@]}" 2>/dev/null || true)"
38
64
  fi
39
65
  fi
40
66
  export XWANG_GUARD
@@ -10,7 +10,7 @@ description: 启动 xwang 项目阶段2:深度设计,明确需求并同步
10
10
  当用户触发 xwang 阶段2时:
11
11
 
12
12
  1. 调用 `/grill-with-docs` 围绕需求目标、范围、用户、约束、验收标准等逐层追问,同时对照现有领域模型和文档(CONTEXT.md、ADRs)挑战术语、澄清冲突,直到达成共识。
13
- 2. **PRD 拆分预检(阻塞点)**:grilling 结束后,基于已澄清信息评估是否需要拆分为多个 change。若 PRD 包含多个独立 capability、模块、用户路径或明显里程碑,必须暂停并让用户选择拆分方案;确认后才继续。
13
+ 2. **强制进行 PRD 拆分预检(阻塞点)**:`/grill-with-docs` 确认需求完成后,**必须**输出一份 `PRD 拆分预检报告`,基于已澄清信息评估是否需要拆分为多个 change。**无论是否需要拆分,都必须停下来向用户展示报告并等待明确选择**;未确认前不得生成 PRD 或创建 OpenSpec change。
14
14
  3. grilling 结束后,根据需求内容自己总结一个简洁的 kebab-case 需求名称 `<name>`,用于生成 `docs/mattpocock/<name>-prd.md`。
15
15
  4. 创建 `docs/mattpocock/` 目录(如不存在)。
16
16
  5. **需求澄清完成确认(阻塞点)**:向用户输出一份结构化的需求摘要(目标、范围、用户、核心行为、边界情况、非功能性需求、依赖与限制),等待用户明确确认或提出修改;未确认前不得生成 PRD 或创建 OpenSpec change。
@@ -50,24 +50,50 @@ fi
50
50
  - [ ] 确认用户要启动 xwang 阶段2(关键词:xwang-design、xwang 阶段2、开始 xwang)。
51
51
  - [ ] 调用 `/grill-with-docs`,从用户视角深挖:目标用户、核心问题、预期行为、边界情况、非功能性需求、依赖与限制;并对照现有 CONTEXT.md/ADRs 挑战术语、澄清冲突,必要时实时更新文档。
52
52
  - [ ] grilling 过程中持续追问,直到形成清晰的需求理解。
53
+ - [ ] `/grill-with-docs` 完成需求确认后,**不得立即生成 PRD**,必须先进入 Step 1a 的强制拆分预检。
53
54
 
54
- ### Step 1a:PRD 拆分预检(阻塞点)
55
+ ### Step 1a:PRD 拆分预检(强制阻塞点)
55
56
 
56
- grilling 结束后、生成 PRD 前,基于已澄清信息评估是否需要拆分为多个 change。
57
+ grilling 确认完成后、生成 PRD 前,**必须**执行 PRD 拆分预检并输出报告。
57
58
 
58
- - [ ] 输出候选拆分清单。每项包含:建议 change 名称、目标与范围边界、明确非目标、依赖关系/推荐顺序、核心验收场景。
59
- - [ ] 满足任一条件时推荐拆分:
59
+ - [ ] **输出《PRD 拆分预检报告》**,格式如下:
60
+
61
+ ```
62
+ ### PRD 拆分预检报告
63
+
64
+ 评估结论:<建议拆分 / 无需拆分>
65
+
66
+ 触发拆分的信号(如存在):
67
+ - <信号1:例如 涉及多个独立 capability>
68
+ - <信号2:例如 预计超过 3 个大任务>
69
+ - ...
70
+
71
+ 候选拆分清单(仅在建议拆分时输出):
72
+ 1. <change-name-1>
73
+ - 目标与范围:<一句话描述>
74
+ - 明确非目标:<本 change 不做的事>
75
+ - 依赖关系/推荐顺序:<依赖谁、谁先谁后>
76
+ - 核心验收场景:<1-2 个验收场景>
77
+ 2. <change-name-2>
78
+ ...
79
+
80
+ 用户选择:
81
+ - [ ] 创建多个 OpenSpec changes(按候选拆分逐个创建)
82
+ - [ ] 保持为一个 change(并在 PRD 中记录不拆分原因)
83
+ - [ ] 调整拆分方案(用户说明方向后重新输出报告并再次确认)
84
+ ```
85
+
86
+ - [ ] 满足任一条件时结论必须为「建议拆分」:
60
87
  - PRD 包含多个可独立设计、构建、验证、归档的 capability
61
88
  - 涉及多个模块或用户路径,且其中一部分可独立交付
62
89
  - 存在明显分阶段里程碑
63
90
  - 预计会产生多个 delta spec 或超过 3 个大任务
64
91
  - 任一部分失败或延期不应阻塞其他部分进入后续阶段
65
- - [ ] **必须使用当前平台可用的用户输入/确认机制暂停并等待用户选择**:
66
- - **创建多个 OpenSpec changes**:按候选拆分逐个创建独立 change
67
- - **保持为一个 change**:继续单 change 流程,并在 PRD 中记录不拆分原因
68
- - **调整拆分方案后继续**:用户说明调整方向后,重新输出候选拆分清单并再次确认
92
+ - [ ] **无论结论如何,都必须使用当前平台可用的用户输入/确认机制暂停并等待用户选择**。
69
93
  - [ ] 用户选择「创建多个 changes」后,当前 `/xwang-design` 调用只完成拆分确认;随后按用户确认的顺序分别进入每个拆分项的 `/xwang-design`,每个拆分项默认跳过本预检。
70
- - [ ] 未得到用户明确选择前,不得生成 PRD 或创建 OpenSpec change。
94
+ - [ ] 用户选择「保持为一个 change」后,必须在最终 PRD 中显式记录“不拆分原因”,然后继续后续步骤。
95
+ - [ ] 用户选择「调整拆分方案」后,根据用户反馈重新输出预检报告并再次等待确认。
96
+ - [ ] **未得到用户明确选择前,不得生成 PRD,不得创建 OpenSpec change。**
71
97
 
72
98
  ### Step 1b:需求澄清完成确认(阻塞点)
73
99
 
@@ -81,6 +107,7 @@ grilling 结束后、生成 PRD 前,基于已澄清信息评估是否需要拆
81
107
 
82
108
  - [ ] 用户确认后,调用 `/to-prd` 生成**中文** PRD(遵循 to-prd 的 PRD 模板),无需额外用户确认。
83
109
  - [ ] 将 PRD 写入 `docs/mattpocock/<name>-prd.md`;如果 grilling 过程中名称有调整,使用最终生成的名称。
110
+ - [ ] **如果 Step 1a 结论为「保持为一个 change」,在 PRD 中显式写入“不拆分原因”章节。**
84
111
 
85
112
  ### Step 3:创建 OpenSpec change
86
113
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xwang",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "xwang CLI",
5
5
  "keywords": [
6
6
  "xwang",