xwang 0.0.9 → 0.0.11
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/assets/manifest.json +1 -0
- package/assets/skills/xwang/scripts/xwang-create-change.sh +151 -0
- package/assets/skills/xwang/scripts/xwang-env.sh +15 -0
- package/assets/skills/xwang/scripts/xwang-guard.sh +22 -0
- package/assets/skills/xwang/scripts/xwang-state.sh +4 -3
- package/assets/skills/xwang-design/SKILL.md +29 -14
- package/assets/skills/xwang-hotfix/SKILL.md +11 -3
- package/assets/skills/xwang-tweak/SKILL.md +11 -3
- package/package.json +1 -1
package/assets/manifest.json
CHANGED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# xwang-create-change — create an OpenSpec change directory scaffold with a given name.
|
|
3
|
+
# Usage: xwang-create-change.sh <change-name> <workflow> [schema]
|
|
4
|
+
# Creates openspec/changes/<change-name>/ with .openspec.yaml and minimal artifact stubs.
|
|
5
|
+
# Exits 0 on success, 1 on error.
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
name="${1:-}"
|
|
10
|
+
workflow="${2:-}"
|
|
11
|
+
schema="${3:-spec-driven}"
|
|
12
|
+
|
|
13
|
+
if [ -z "$name" ] || [ -z "$workflow" ]; then
|
|
14
|
+
echo "Usage: $0 <change-name> <workflow> [schema]" >&2
|
|
15
|
+
exit 2
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Validate name using the same rules as xwang-state/xwang-guard
|
|
19
|
+
if [[ "$name" =~ \.\. ]]; then
|
|
20
|
+
echo "ERROR: Change name cannot contain '..'" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
if printf '%s' "$name" | perl -ne 'exit 1 if m{[/\\\s\0-\x1F\x7F;|&$`()<>{}[\]*'"'"'"!#@%^=+~]}; exit 0'; then
|
|
24
|
+
: # valid
|
|
25
|
+
else
|
|
26
|
+
echo "ERROR: Invalid change name: '$name'" >&2
|
|
27
|
+
echo "Avoid: / \\ spaces control chars and shell metacharacters" >&2
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Determine project root
|
|
32
|
+
find_project_root() {
|
|
33
|
+
if [ -n "${XWANG_PROJECT_ROOT:-}" ]; then
|
|
34
|
+
printf '%s' "$XWANG_PROJECT_ROOT"
|
|
35
|
+
return 0
|
|
36
|
+
fi
|
|
37
|
+
local git_root
|
|
38
|
+
git_root=$(git rev-parse --show-toplevel 2>/dev/null || true)
|
|
39
|
+
if [ -n "$git_root" ]; then
|
|
40
|
+
printf '%s' "$git_root"
|
|
41
|
+
return 0
|
|
42
|
+
fi
|
|
43
|
+
local dir="$PWD"
|
|
44
|
+
while [ "$dir" != "/" ]; do
|
|
45
|
+
if [ -d "$dir/openspec/changes" ]; then
|
|
46
|
+
printf '%s' "$dir"
|
|
47
|
+
return 0
|
|
48
|
+
fi
|
|
49
|
+
dir=$(dirname "$dir")
|
|
50
|
+
done
|
|
51
|
+
printf '%s' "$PWD"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
PROJECT_ROOT=$(find_project_root)
|
|
55
|
+
CHANGE_DIR="$PROJECT_ROOT/openspec/changes/$name"
|
|
56
|
+
|
|
57
|
+
if [ -d "$CHANGE_DIR" ]; then
|
|
58
|
+
echo "ERROR: change directory already exists: $CHANGE_DIR" >&2
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
mkdir -p "$CHANGE_DIR"
|
|
63
|
+
|
|
64
|
+
# .openspec.yaml
|
|
65
|
+
cat > "$CHANGE_DIR/.openspec.yaml" <<EOF
|
|
66
|
+
schema: $schema
|
|
67
|
+
created: $(date -u +%Y-%m-%d)
|
|
68
|
+
EOF
|
|
69
|
+
|
|
70
|
+
# Minimal stubs; the caller (xwang-design/hotfix/tweak) should overwrite with real content.
|
|
71
|
+
case "$workflow" in
|
|
72
|
+
full)
|
|
73
|
+
cat > "$CHANGE_DIR/proposal.md" <<'EOF'
|
|
74
|
+
## Why
|
|
75
|
+
|
|
76
|
+
## What Changes
|
|
77
|
+
|
|
78
|
+
## Capabilities
|
|
79
|
+
|
|
80
|
+
### New Capabilities
|
|
81
|
+
|
|
82
|
+
无。
|
|
83
|
+
|
|
84
|
+
### Modified Capabilities
|
|
85
|
+
|
|
86
|
+
## Impact
|
|
87
|
+
EOF
|
|
88
|
+
cat > "$CHANGE_DIR/design.md" <<'EOF'
|
|
89
|
+
## Context
|
|
90
|
+
|
|
91
|
+
## Goals / Non-Goals
|
|
92
|
+
|
|
93
|
+
**Goals:**
|
|
94
|
+
|
|
95
|
+
**Non-Goals:**
|
|
96
|
+
|
|
97
|
+
## Decisions
|
|
98
|
+
|
|
99
|
+
## Risks / Trade-offs
|
|
100
|
+
EOF
|
|
101
|
+
cat > "$CHANGE_DIR/tasks.md" <<'EOF'
|
|
102
|
+
## Tasks
|
|
103
|
+
|
|
104
|
+
- [ ] Task 1
|
|
105
|
+
EOF
|
|
106
|
+
;;
|
|
107
|
+
quick|hotfix)
|
|
108
|
+
cat > "$CHANGE_DIR/proposal.md" <<'EOF'
|
|
109
|
+
## Why
|
|
110
|
+
|
|
111
|
+
## What Changes
|
|
112
|
+
|
|
113
|
+
## Impact
|
|
114
|
+
EOF
|
|
115
|
+
cat > "$CHANGE_DIR/design.md" <<'EOF'
|
|
116
|
+
## Context
|
|
117
|
+
|
|
118
|
+
## Solution
|
|
119
|
+
|
|
120
|
+
## Risks / Trade-offs
|
|
121
|
+
EOF
|
|
122
|
+
cat > "$CHANGE_DIR/tasks.md" <<'EOF'
|
|
123
|
+
## Tasks
|
|
124
|
+
|
|
125
|
+
- [ ] Task 1
|
|
126
|
+
EOF
|
|
127
|
+
;;
|
|
128
|
+
tweak)
|
|
129
|
+
cat > "$CHANGE_DIR/proposal.md" <<'EOF'
|
|
130
|
+
## Why
|
|
131
|
+
|
|
132
|
+
## What Changes
|
|
133
|
+
|
|
134
|
+
## Impact
|
|
135
|
+
EOF
|
|
136
|
+
cat > "$CHANGE_DIR/design.md" <<'EOF'
|
|
137
|
+
## Solution
|
|
138
|
+
EOF
|
|
139
|
+
cat > "$CHANGE_DIR/tasks.md" <<'EOF'
|
|
140
|
+
## Tasks
|
|
141
|
+
|
|
142
|
+
- [ ] Task 1
|
|
143
|
+
EOF
|
|
144
|
+
;;
|
|
145
|
+
*)
|
|
146
|
+
echo "ERROR: unknown workflow: $workflow" >&2
|
|
147
|
+
exit 1
|
|
148
|
+
;;
|
|
149
|
+
esac
|
|
150
|
+
|
|
151
|
+
echo "$CHANGE_DIR"
|
|
@@ -76,6 +76,17 @@ if [ -z "${XWANG_DOC_LANG_CHECK:-}" ]; then
|
|
|
76
76
|
fi
|
|
77
77
|
export XWANG_DOC_LANG_CHECK
|
|
78
78
|
|
|
79
|
+
# Locate xwang-create-change.sh using the same approach.
|
|
80
|
+
if [ -z "${XWANG_CREATE_CHANGE:-}" ]; then
|
|
81
|
+
XWANG_CREATE_CHANGE_SIBLING="${XWANG_SCRIPT_DIR}/xwang-create-change.sh"
|
|
82
|
+
if [ -f "$XWANG_CREATE_CHANGE_SIBLING" ]; then
|
|
83
|
+
XWANG_CREATE_CHANGE="$(cd "$(dirname "$XWANG_CREATE_CHANGE_SIBLING")" && pwd)/$(basename "$XWANG_CREATE_CHANGE_SIBLING")"
|
|
84
|
+
else
|
|
85
|
+
XWANG_CREATE_CHANGE="$(locate_by_glob '*/xwang/scripts/xwang-create-change.sh' "${SEARCH_DIRS[@]}" 2>/dev/null || true)"
|
|
86
|
+
fi
|
|
87
|
+
fi
|
|
88
|
+
export XWANG_CREATE_CHANGE
|
|
89
|
+
|
|
79
90
|
if [ -z "$XWANG_OPEN_CHECK" ] || [ ! -f "$XWANG_OPEN_CHECK" ]; then
|
|
80
91
|
echo "WARNING: xwang-open-check.sh not found" >&2
|
|
81
92
|
fi
|
|
@@ -87,3 +98,7 @@ fi
|
|
|
87
98
|
if [ -z "$XWANG_DOC_LANG_CHECK" ] || [ ! -f "$XWANG_DOC_LANG_CHECK" ]; then
|
|
88
99
|
echo "WARNING: xwang-doc-lang-check.sh not found" >&2
|
|
89
100
|
fi
|
|
101
|
+
|
|
102
|
+
if [ -z "$XWANG_CREATE_CHANGE" ] || [ ! -f "$XWANG_CREATE_CHANGE" ]; then
|
|
103
|
+
echo "WARNING: xwang-create-change.sh not found" >&2
|
|
104
|
+
fi
|
|
@@ -343,6 +343,26 @@ branch_status_handled() {
|
|
|
343
343
|
[ "$status" = "handled" ]
|
|
344
344
|
}
|
|
345
345
|
|
|
346
|
+
grilled_completed() {
|
|
347
|
+
local val
|
|
348
|
+
val=$(yaml_field_value "grilled" 2>/dev/null || true)
|
|
349
|
+
if [ "$val" = "true" ]; then
|
|
350
|
+
return 0
|
|
351
|
+
fi
|
|
352
|
+
echo "grilled must be true before leaving design; run grill-with-docs and then:"
|
|
353
|
+
echo " \"\$XWANG_BASH\" \"\$XWANG_STATE\" set $CHANGE grilled true" >&2
|
|
354
|
+
return 1
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
domain_glossary_exists() {
|
|
358
|
+
if [ -f "$PROJECT_ROOT/CONTEXT.md" ] || [ -f "$PROJECT_ROOT/docs/glossary.md" ] || [ -f "$PROJECT_ROOT/glossary.md" ]; then
|
|
359
|
+
return 0
|
|
360
|
+
fi
|
|
361
|
+
echo "No domain glossary found (expected CONTEXT.md or docs/glossary.md)." >&2
|
|
362
|
+
echo "If this change introduces domain terms, create/update the glossary before leaving design." >&2
|
|
363
|
+
return 1
|
|
364
|
+
}
|
|
365
|
+
|
|
346
366
|
design_doc_recorded() {
|
|
347
367
|
local design_doc
|
|
348
368
|
design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
|
|
@@ -450,6 +470,8 @@ guard_design() {
|
|
|
450
470
|
check "design.md exists and non-empty" file_nonempty "$CHANGE_DIR/design.md"
|
|
451
471
|
check "tasks.md exists and non-empty" file_nonempty "$CHANGE_DIR/tasks.md"
|
|
452
472
|
check "tasks.md has at least one task" tasks_has_any
|
|
473
|
+
check "grilling completed" grilled_completed
|
|
474
|
+
check "domain glossary exists" domain_glossary_exists
|
|
453
475
|
check "OpenSpec artifacts language consistency" openspec_artifacts_language_consistent
|
|
454
476
|
|
|
455
477
|
if [ "$workflow" = "full" ]; then
|
|
@@ -256,6 +256,7 @@ build_pause: null
|
|
|
256
256
|
tdd_mode: $tdd_mode
|
|
257
257
|
subagent_dispatch: null
|
|
258
258
|
direct_override: false
|
|
259
|
+
grilled: false
|
|
259
260
|
verify_mode: null
|
|
260
261
|
verify_result: pending
|
|
261
262
|
verification_report: null
|
|
@@ -303,12 +304,12 @@ cmd_set() {
|
|
|
303
304
|
fi
|
|
304
305
|
|
|
305
306
|
case "$field" in
|
|
306
|
-
workflow|phase|design_doc|plan|base_ref|isolation|build_mode|build_pause|tdd_mode|subagent_dispatch|direct_override|verify_mode|verify_result|verification_report|branch_status|archived|created_at|updated_at|build_command|verify_command)
|
|
307
|
+
workflow|phase|design_doc|plan|base_ref|isolation|build_mode|build_pause|tdd_mode|subagent_dispatch|direct_override|verify_mode|verify_result|verification_report|branch_status|archived|created_at|updated_at|build_command|verify_command|grilled)
|
|
307
308
|
# Valid field
|
|
308
309
|
;;
|
|
309
310
|
*)
|
|
310
311
|
red "ERROR: Unknown field: '$field'" >&2
|
|
311
|
-
red "Valid fields: workflow, phase, design_doc, plan, base_ref, isolation, build_mode, build_pause, tdd_mode, subagent_dispatch, direct_override, verify_mode, verify_result, verification_report, branch_status, archived, created_at, updated_at, build_command, verify_command" >&2
|
|
312
|
+
red "Valid fields: workflow, phase, design_doc, plan, base_ref, isolation, build_mode, build_pause, tdd_mode, subagent_dispatch, direct_override, verify_mode, verify_result, verification_report, branch_status, archived, created_at, updated_at, build_command, verify_command, grilled" >&2
|
|
312
313
|
exit 1
|
|
313
314
|
;;
|
|
314
315
|
esac
|
|
@@ -335,7 +336,7 @@ cmd_set() {
|
|
|
335
336
|
subagent_dispatch)
|
|
336
337
|
validate_enum "$value" "null" "confirmed"
|
|
337
338
|
;;
|
|
338
|
-
direct_override|archived)
|
|
339
|
+
direct_override|archived|grilled)
|
|
339
340
|
validate_enum "$value" "true" "false"
|
|
340
341
|
;;
|
|
341
342
|
verify_mode)
|
|
@@ -9,18 +9,19 @@ description: 启动 xwang 项目阶段2:深度设计,明确需求并同步
|
|
|
9
9
|
|
|
10
10
|
当用户触发 xwang 阶段2时:
|
|
11
11
|
|
|
12
|
-
1.
|
|
12
|
+
1. **必须调用 `/grill-with-docs`** 围绕需求目标、范围、用户、约束、验收标准等逐层追问,同时对照现有领域模型和文档(CONTEXT.md、ADRs)挑战术语、澄清冲突,直到达成共识。**不得跳过 grilling;若用户试图跳过,必须拒绝并说明这是 design 阶段的强制入口。**
|
|
13
13
|
2. **强制进行 PRD 拆分预检(阻塞点)**:`/grill-with-docs` 确认需求完成后,**必须**输出一份 `PRD 拆分预检报告`,基于已澄清信息评估是否需要拆分为多个 change。**无论是否需要拆分,都必须停下来向用户展示报告并等待明确选择**;未确认前不得生成 PRD 或创建 OpenSpec change。
|
|
14
14
|
3. grilling 结束后,根据需求内容自己总结一个简洁的中文需求名称 `<name>`,用于生成 `docs/mattpocock/<name>-prd.md`。
|
|
15
15
|
4. 创建 `docs/mattpocock/` 目录(如不存在)。
|
|
16
|
-
5.
|
|
17
|
-
6.
|
|
18
|
-
7.
|
|
19
|
-
8.
|
|
20
|
-
9.
|
|
21
|
-
10.
|
|
22
|
-
11.
|
|
23
|
-
12.
|
|
16
|
+
5. **需求澄清完成确认(强制阻塞点)**:向用户输出一份结构化的需求摘要(目标、范围、用户、核心行为、边界情况、非功能性需求、依赖与限制、新增/更新术语),并确认专业术语已写入 `CONTEXT.md` 或 `docs/glossary.md`;等待用户明确确认或提出修改,未确认前不得生成 PRD。
|
|
17
|
+
6. grilling 完成后,运行 `"$XWANG_STATE" set <name> grilled true` 记录 grilling 已完成。
|
|
18
|
+
7. 用户确认后,调用 `/to-prd` 基于对话上下文合成 PRD。
|
|
19
|
+
8. 将生成的 PRD 内容写入 `docs/mattpocock/<name>-prd.md`。
|
|
20
|
+
9. 直接调用 `/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`**。
|
|
21
|
+
10. **初始化 xwang 状态**:调用 `"$XWANG_STATE" init <name> full`,在 `openspec/changes/<name>/.xwang.yaml` 创建状态文件(起始 phase 为 `design`)。
|
|
22
|
+
11. **记录 design 文件**:调用 `"$XWANG_STATE" set <name> design_doc docs/mattpocock/<name>-prd.md`,将 PRD 路径写入状态。
|
|
23
|
+
12. **阶段出口守护(design → build)**:调用 `"$XWANG_GUARD" <name> design --apply` 校验 design 阶段退出条件,通过后会自动将 `.xwang.yaml` 的 `phase` 推进到 `build`。
|
|
24
|
+
13. **自动进入 build 阶段(full 模式)**:向用户简要汇报 PRD 保存路径、change 名称、状态文件路径后,直接调用 `/xwang-build` 继续阶段3,无需等待用户确认。
|
|
24
25
|
|
|
25
26
|
汇报示例:
|
|
26
27
|
|
|
@@ -45,11 +46,12 @@ fi
|
|
|
45
46
|
. "$XWANG_ENV"
|
|
46
47
|
```
|
|
47
48
|
|
|
48
|
-
### Step 1
|
|
49
|
+
### Step 1:需求澄清(强制)
|
|
49
50
|
|
|
50
51
|
- [ ] 确认用户要启动 xwang 阶段2(关键词:xwang-design、xwang 阶段2、开始 xwang)。
|
|
51
|
-
- [ ]
|
|
52
|
+
- [ ] **必须调用 `/grill-with-docs`**,从用户视角深挖:目标用户、核心问题、预期行为、边界情况、非功能性需求、依赖与限制;并对照现有 CONTEXT.md/ADRs 挑战术语、澄清冲突,必要时实时更新文档。**如果 `/grill-with-docs` 没有执行或没有完成,不得进入后续步骤。**
|
|
52
53
|
- [ ] grilling 过程中持续追问,直到形成清晰的需求理解。
|
|
54
|
+
- [ ] grilling 完成后,**必须记录 grilling 已完成**:运行 `"$XWANG_STATE" set <name> grilled true`。
|
|
53
55
|
- [ ] `/grill-with-docs` 完成需求确认后,**不得立即生成 PRD**,必须先进入 Step 1a 的强制拆分预检。
|
|
54
56
|
|
|
55
57
|
### Step 1a:PRD 拆分预检(强制阻塞点)
|
|
@@ -99,7 +101,11 @@ grilling 确认完成后、生成 PRD 前,**必须**执行 PRD 拆分预检并
|
|
|
99
101
|
|
|
100
102
|
- [ ] grilling 结束后,根据需求核心内容自己生成一个简洁的中文名称(如 `会议周视图 UI 增强`)作为 `<name>`,直接使用无需确认。
|
|
101
103
|
- [ ] 使用 `mkdir -p docs/mattpocock` 确保目录存在。
|
|
102
|
-
- [ ]
|
|
104
|
+
- [ ] **领域术语守护**:梳理本次需求涉及的专业术语(尤其是新引入的、或有歧义的术语):
|
|
105
|
+
- 若项目已有 `CONTEXT.md` 或 `docs/glossary.md`,检查这些术语是否已定义;未定义的**必须**补充进去。
|
|
106
|
+
- 若项目没有术语文件,但本次需求出现了值得固化的专业术语,**必须**创建 `CONTEXT.md` 或 `docs/glossary.md` 并写入定义。
|
|
107
|
+
- 在最终的需求确认摘要中显式列出「新增/更新术语」。
|
|
108
|
+
- [ ] 向用户输出结构化的**需求确认摘要**(建议包含:目标、范围、目标用户、核心行为、边界情况、非功能性需求、依赖与限制、新增/更新术语)。
|
|
103
109
|
- [ ] **必须使用当前平台可用的用户输入/确认机制暂停并等待用户确认需求澄清完成**。若用户提出修改,根据反馈调整摘要并再次确认,直到达成共识。
|
|
104
110
|
- [ ] **未确认前不得调用 `/to-prd`,不得生成 PRD,不得创建 OpenSpec change**。
|
|
105
111
|
|
|
@@ -121,8 +127,17 @@ grilling 确认完成后、生成 PRD 前,**必须**执行 PRD 拆分预检并
|
|
|
121
127
|
|
|
122
128
|
### Step 3:创建 OpenSpec change
|
|
123
129
|
|
|
124
|
-
- [ ]
|
|
125
|
-
|
|
130
|
+
- [ ] 使用 xwang 自带脚本创建中文 change 目录和 OpenSpec 骨架(绕过 `/openspec-new-change` 的英文 kebab-case 限制,避免中文文件被删除或重命名):
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
XWANG_ENV="${XWANG_ENV:-$(find . "$HOME"/.*/skills "$HOME/.config" -path '*/xwang/scripts/xwang-env.sh' -type f -print -quit 2>/dev/null)}"
|
|
134
|
+
. "$XWANG_ENV"
|
|
135
|
+
"$XWANG_CREATE_CHANGE" <name> full
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
- [ ] 基于 PRD 内容覆盖 `openspec/changes/<name>/proposal.md`、`design.md`、`tasks.md`,确保所有 artifact 使用中文表述。
|
|
139
|
+
- [ ] 如需生成 delta spec,创建 `openspec/changes/<name>/specs/<name>/spec.md`。
|
|
140
|
+
- [ ] **中文名称保护**:任何情况下不得删除、重命名或迁移已创建的中文文件(包括 `openspec/changes/<中文名>/` 和 `docs/mattpocock/<中文名>-prd.md`)。如果创建过程中报错,停止并报告,而不是改为英文。
|
|
126
141
|
|
|
127
142
|
### Step 4:初始化状态并推进
|
|
128
143
|
|
|
@@ -30,13 +30,21 @@ fi
|
|
|
30
30
|
### Step 1:快速开启
|
|
31
31
|
|
|
32
32
|
- [ ] 确认用户要触发 hotfix(关键词:xwang-hotfix、hotfix、bugfix、快速修复)。
|
|
33
|
-
- [ ] 用户未提供 change
|
|
34
|
-
- [ ]
|
|
33
|
+
- [ ] 用户未提供 change 名称时,根据修复主题生成一个简洁的中文名称 `<name>`(如 `登录按钮失效修复`)。
|
|
34
|
+
- [ ] 使用 xwang 自带脚本创建中文 change 目录和 OpenSpec 骨架(绕过 `/openspec-new-change` 的 kebab-case 限制):
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
XWANG_ENV="${XWANG_ENV:-$(find . "$HOME"/.*/skills "$HOME/.config" -path '*/xwang/scripts/xwang-env.sh' -type f -print -quit 2>/dev/null)}"
|
|
38
|
+
. "$XWANG_ENV"
|
|
39
|
+
"$XWANG_CREATE_CHANGE" <name> hotfix
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- [ ] 基于修复内容覆盖 `openspec/changes/<name>/proposal.md`、`design.md`、`tasks.md`:
|
|
35
43
|
- `proposal.md`:问题描述 + 根因分析 + 修复目标
|
|
36
44
|
- `design.md`:修复方案(1 个即可,无需多方案对比)
|
|
37
45
|
- `tasks.md`:修复任务清单
|
|
38
46
|
- 通常**无需 delta spec**(除非修复改变了已有 spec 的验收场景)
|
|
39
|
-
- [ ]
|
|
47
|
+
- [ ] **`openspec/changes/<name>/` 下的所有文档/artifact 必须使用中文表述**。
|
|
40
48
|
- [ ] 调用 `"$XWANG_STATE" init <name> quick` 初始化状态(`workflow: quick`,`phase: build`,跳过 design)。
|
|
41
49
|
|
|
42
50
|
### Step 2:直接构建
|
|
@@ -31,13 +31,21 @@ fi
|
|
|
31
31
|
### Step 1:快速开启
|
|
32
32
|
|
|
33
33
|
- [ ] 确认用户要触发 tweak(关键词:xwang-tweak、tweak、小改动、局部优化)。
|
|
34
|
-
- [ ] 用户未提供 change
|
|
35
|
-
- [ ]
|
|
34
|
+
- [ ] 用户未提供 change 名称时,根据变更主题生成一个简洁的中文名称 `<name>`(如 `文案优化`)。
|
|
35
|
+
- [ ] 使用 xwang 自带脚本创建中文 change 目录和 OpenSpec 骨架(绕过 `/openspec-new-change` 的 kebab-case 限制):
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
XWANG_ENV="${XWANG_ENV:-$(find . "$HOME"/.*/skills "$HOME/.config" -path '*/xwang/scripts/xwang-env.sh' -type f -print -quit 2>/dev/null)}"
|
|
39
|
+
. "$XWANG_ENV"
|
|
40
|
+
"$XWANG_CREATE_CHANGE" <name> tweak
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- [ ] 基于变更内容覆盖 `openspec/changes/<name>/proposal.md`、`design.md`、`tasks.md`:
|
|
36
44
|
- `proposal.md`:变更动机 + 目标 + 范围
|
|
37
45
|
- `design.md`:简短实现说明(无需方案对比)
|
|
38
46
|
- `tasks.md`:不超过 3 个任务
|
|
39
47
|
- **无需 delta spec**(一旦需要,升级为完整 `/xwang`)
|
|
40
|
-
- [ ]
|
|
48
|
+
- [ ] **`openspec/changes/<name>/` 下的所有文档/artifact 必须使用中文表述**。
|
|
41
49
|
- [ ] 调用 `"$XWANG_STATE" init <name> tweak` 初始化状态(`workflow: tweak`,`phase: build`,跳过 design)。
|
|
42
50
|
|
|
43
51
|
### Step 2:轻量构建
|