xwang 0.0.1

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.
Files changed (55) hide show
  1. package/assets/skills/xwang/SKILL.md +112 -0
  2. package/assets/skills/xwang/scripts/xwang-env.sh +48 -0
  3. package/assets/skills/xwang/scripts/xwang-guard.sh +530 -0
  4. package/assets/skills/xwang/scripts/xwang-state.sh +374 -0
  5. package/assets/skills/xwang-archive/SKILL.md +86 -0
  6. package/assets/skills/xwang-build/REFERENCE.md +94 -0
  7. package/assets/skills/xwang-build/SKILL.md +113 -0
  8. package/assets/skills/xwang-design/SKILL.md +104 -0
  9. package/assets/skills/xwang-hotfix/SKILL.md +102 -0
  10. package/assets/skills/xwang-open/SKILL.md +108 -0
  11. package/assets/skills/xwang-open/scripts/xwang-open-check.sh +197 -0
  12. package/assets/skills/xwang-tweak/SKILL.md +99 -0
  13. package/assets/skills/xwang-verify/SKILL.md +112 -0
  14. package/bin/xwang.js +3 -0
  15. package/dist/cli/index.d.ts +2 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +30 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/commands/init.d.ts +9 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +238 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/core/detect.d.ts +6 -0
  24. package/dist/core/detect.d.ts.map +1 -0
  25. package/dist/core/detect.js +74 -0
  26. package/dist/core/detect.js.map +1 -0
  27. package/dist/core/mattpocock.d.ts +6 -0
  28. package/dist/core/mattpocock.d.ts.map +1 -0
  29. package/dist/core/mattpocock.js +82 -0
  30. package/dist/core/mattpocock.js.map +1 -0
  31. package/dist/core/openspec.d.ts +3 -0
  32. package/dist/core/openspec.d.ts.map +1 -0
  33. package/dist/core/openspec.js +178 -0
  34. package/dist/core/openspec.js.map +1 -0
  35. package/dist/core/package-manager.d.ts +8 -0
  36. package/dist/core/package-manager.d.ts.map +1 -0
  37. package/dist/core/package-manager.js +62 -0
  38. package/dist/core/package-manager.js.map +1 -0
  39. package/dist/core/platforms.d.ts +22 -0
  40. package/dist/core/platforms.d.ts.map +1 -0
  41. package/dist/core/platforms.js +23 -0
  42. package/dist/core/platforms.js.map +1 -0
  43. package/dist/core/superpowers.d.ts +5 -0
  44. package/dist/core/superpowers.d.ts.map +1 -0
  45. package/dist/core/superpowers.js +75 -0
  46. package/dist/core/superpowers.js.map +1 -0
  47. package/dist/core/types.d.ts +2 -0
  48. package/dist/core/types.d.ts.map +1 -0
  49. package/dist/core/types.js +2 -0
  50. package/dist/core/types.js.map +1 -0
  51. package/dist/utils/file-system.d.ts +5 -0
  52. package/dist/utils/file-system.d.ts.map +1 -0
  53. package/dist/utils/file-system.js +41 -0
  54. package/dist/utils/file-system.js.map +1 -0
  55. package/package.json +50 -0
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: xwang-design
3
+ description: 启动 xwang 项目阶段2:深度设计,明确需求并同步产生PRD,通过 OpenSpec 创建 change 结构(proposal + design + tasks)
4
+ ---
5
+
6
+ # xwang-design
7
+
8
+ ## Quick start
9
+
10
+ 当用户触发 xwang 阶段2时:
11
+
12
+ 1. 调用 `/grill-with-docs` 围绕需求目标、范围、用户、约束、验收标准等逐层追问,同时对照现有领域模型和文档(CONTEXT.md、ADRs)挑战术语、澄清冲突,直到达成共识。
13
+ 2. **PRD 拆分预检(阻塞点)**:grilling 结束后,基于已澄清信息评估是否需要拆分为多个 change。若 PRD 包含多个独立 capability、模块、用户路径或明显里程碑,必须暂停并让用户选择拆分方案;确认后才继续。
14
+ 3. grilling 结束后,根据需求内容自己总结一个简洁的 kebab-case 需求名称 `<name>`,用于生成 `docs/mattpocock/<name>-prd.md`。
15
+ 4. 创建 `docs/mattpocock/` 目录(如不存在)。
16
+ 5. **需求澄清完成确认(阻塞点)**:向用户输出一份结构化的需求摘要(目标、范围、用户、核心行为、边界情况、非功能性需求、依赖与限制),等待用户明确确认或提出修改;未确认前不得生成 PRD 或创建 OpenSpec change。
17
+ 6. 用户确认后,调用 `/to-prd` 基于对话上下文合成**中文** PRD。
18
+ 7. 将生成的 PRD 内容写入 `docs/mattpocock/<name>-prd.md`。
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
+ 9. **初始化 xwang 状态**:调用 `"$XWANG_STATE" init <name> full`,在 `openspec/changes/<name>/.xwang.yaml` 创建状态文件(起始 phase 为 `design`)。
21
+ 10. **记录 design 文件**:调用 `"$XWANG_STATE" set <name> design_doc docs/mattpocock/<name>-prd.md`,将 PRD 路径写入状态。
22
+ 11. **阶段出口守护(design → build)**:调用 `"$XWANG_GUARD" <name> design --apply` 校验 design 阶段退出条件,通过后会自动将 `.xwang.yaml` 的 `phase` 推进到 `build`。
23
+ 12. **自动进入 build 阶段(full 模式)**:向用户简要汇报 PRD 保存路径、change 名称、状态文件路径后,直接调用 `/xwang-build` 继续阶段3,无需等待用户确认。
24
+
25
+ 汇报示例:
26
+
27
+ ```
28
+ xwang-design 已完成。
29
+ - PRD: docs/mattpocock/<name>-prd.md
30
+ - Change: <name>
31
+ - 状态文件: openspec/changes/<name>/.xwang.yaml
32
+ - 下一步:正在自动进入 xwang-build 阶段...
33
+ ```
34
+
35
+ ## Workflows
36
+
37
+ 开始前先定位 xwang 脚本:
38
+
39
+ ```bash
40
+ XWANG_ENV="${XWANG_ENV:-$(find . "$HOME"/.*/skills "$HOME/.config" -path '*/xwang/scripts/xwang-env.sh' -type f -print -quit 2>/dev/null)}"
41
+ if [ -z "$XWANG_ENV" ]; then
42
+ echo "ERROR: xwang-env.sh not found. Ensure the xwang skill is installed." >&2
43
+ return 1
44
+ fi
45
+ . "$XWANG_ENV"
46
+ ```
47
+
48
+ ### Step 1:需求澄清
49
+
50
+ - [ ] 确认用户要启动 xwang 阶段2(关键词:xwang-design、xwang 阶段2、开始 xwang)。
51
+ - [ ] 调用 `/grill-with-docs`,从用户视角深挖:目标用户、核心问题、预期行为、边界情况、非功能性需求、依赖与限制;并对照现有 CONTEXT.md/ADRs 挑战术语、澄清冲突,必要时实时更新文档。
52
+ - [ ] grilling 过程中持续追问,直到形成清晰的需求理解。
53
+
54
+ ### Step 1a:PRD 拆分预检(阻塞点)
55
+
56
+ grilling 结束后、生成 PRD 前,基于已澄清信息评估是否需要拆分为多个 change。
57
+
58
+ - [ ] 输出候选拆分清单。每项包含:建议 change 名称、目标与范围边界、明确非目标、依赖关系/推荐顺序、核心验收场景。
59
+ - [ ] 满足任一条件时推荐拆分:
60
+ - PRD 包含多个可独立设计、构建、验证、归档的 capability
61
+ - 涉及多个模块或用户路径,且其中一部分可独立交付
62
+ - 存在明显分阶段里程碑
63
+ - 预计会产生多个 delta spec 或超过 3 个大任务
64
+ - 任一部分失败或延期不应阻塞其他部分进入后续阶段
65
+ - [ ] **必须使用当前平台可用的用户输入/确认机制暂停并等待用户选择**:
66
+ - **创建多个 OpenSpec changes**:按候选拆分逐个创建独立 change
67
+ - **保持为一个 change**:继续单 change 流程,并在 PRD 中记录不拆分原因
68
+ - **调整拆分方案后继续**:用户说明调整方向后,重新输出候选拆分清单并再次确认
69
+ - [ ] 用户选择「创建多个 changes」后,当前 `/xwang-design` 调用只完成拆分确认;随后按用户确认的顺序分别进入每个拆分项的 `/xwang-design`,每个拆分项默认跳过本预检。
70
+ - [ ] 未得到用户明确选择前,不得生成 PRD 或创建 OpenSpec change。
71
+
72
+ ### Step 1b:需求澄清完成确认(阻塞点)
73
+
74
+ - [ ] grilling 结束后,根据需求核心内容自己生成一个简洁的 kebab-case 名称(如 `Auth Flow` → `auth-flow`)作为 `<name>`,直接使用无需确认。
75
+ - [ ] 使用 `mkdir -p docs/mattpocock` 确保目录存在。
76
+ - [ ] 向用户输出结构化的**需求确认摘要**(建议包含:目标、范围、目标用户、核心行为、边界情况、非功能性需求、依赖与限制)。
77
+ - [ ] **必须使用当前平台可用的用户输入/确认机制暂停并等待用户确认需求澄清完成**。若用户提出修改,根据反馈调整摘要并再次确认,直到达成共识。
78
+ - [ ] **未确认前不得调用 `/to-prd`,不得生成 PRD,不得创建 OpenSpec change**。
79
+
80
+ ### Step 2:生成 PRD
81
+
82
+ - [ ] 用户确认后,调用 `/to-prd` 生成**中文** PRD(遵循 to-prd 的 PRD 模板),无需额外用户确认。
83
+ - [ ] 将 PRD 写入 `docs/mattpocock/<name>-prd.md`;如果 grilling 过程中名称有调整,使用最终生成的名称。
84
+
85
+ ### Step 3:创建 OpenSpec change
86
+
87
+ - [ ] 直接调用 `/openspec-new-change` 创建 change:change 名称为 `<name>`,文档/描述使用 PRD 的中文内容,过程中不再询问用户确认;若其流程中出现确认提示(如“是否继续创建 proposal.md?”),直接代为确认并继续。
88
+ - [ ] **`/openspec-new-change` 生成的所有文档/artifact 必须使用中文表述,包括但不限于 `proposal.md`、`design.md`、`tasks.md` 以及 `specs/*/spec.md`**。
89
+
90
+ ### Step 4:初始化状态并推进
91
+
92
+ - [ ] **初始化 xwang 状态**:调用 `"$XWANG_STATE" init <name> full`。
93
+ - [ ] **记录 design 文件**:调用 `"$XWANG_STATE" set <name> design_doc docs/mattpocock/<name>-prd.md`。
94
+ - [ ] **阶段出口守护(design → build)**:调用 `"$XWANG_GUARD" <name> design --apply` 校验退出条件并自动推进 `phase` 到 `build`。
95
+
96
+ ### Step 5:自动进入 build
97
+
98
+ - [ ] 向用户简要汇报 PRD 保存路径、change 名称、状态文件路径。
99
+ - [ ] **自动进入 build 阶段(full 模式)**:直接调用 `/xwang-build` 继续阶段3,无需等待用户确认。
100
+
101
+ ## Advanced features
102
+
103
+ - **更新已有 PRD**:如果 `docs/mattpocock/<name>-prd.md` 已存在,先读取现有内容,结合新的 grilling 结果更新后再写入。
104
+ - **未配置 issue tracker**:`to-prd` 可能依赖 `/setup-matt-pocock-skills` 提供的词汇;如未配置,仍按 to-prd 模板在本地生成 PRD,无需发布到 issue tracker。
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: xwang-hotfix
3
+ description: xwang 快速修复路径:跳过 design 阶段,直接 open → build → verify → archive。适用于 bug 修复、不新增 capability、改动范围小的场景。当用户触发 xwang-hotfix、快速修复、hotfix 或 bugfix 时使用。
4
+ ---
5
+
6
+ # xwang-hotfix
7
+
8
+ 快速 bug fix 工作流:open → build → verify → archive。跳过 design 阶段,适用于行为修复、不涉及新 capability 设计的场景。
9
+
10
+ **适用条件**(必须全部满足):
11
+ 1. 修复已有功能的 bug,不新增 capability
12
+ 2. 不涉及接口变更或架构调整
13
+ 3. 改动范围可预估(通常 ≤ 2 个文件)
14
+
15
+ **不适用**:如修复过程发现需要架构调整,应升级为完整 `/xwang` 流程。
16
+
17
+ ## 流程
18
+
19
+ 开始前先定位 xwang 脚本:
20
+
21
+ ```bash
22
+ XWANG_ENV="${XWANG_ENV:-$(find . "$HOME"/.*/skills "$HOME/.config" -path '*/xwang/scripts/xwang-env.sh' -type f -print -quit 2>/dev/null)}"
23
+ if [ -z "$XWANG_ENV" ]; then
24
+ echo "ERROR: xwang-env.sh not found. Ensure the xwang skill is installed." >&2
25
+ return 1
26
+ fi
27
+ . "$XWANG_ENV"
28
+ ```
29
+
30
+ ### Step 1:快速开启
31
+
32
+ - [ ] 确认用户要触发 hotfix(关键词:xwang-hotfix、hotfix、bugfix、快速修复)。
33
+ - [ ] 用户未提供 change 名称时,根据修复主题生成一个简洁的 kebab-case 名称 `<name>`。
34
+ - [ ] 直接调用 `/openspec-new-change` 创建精简 change:
35
+ - `proposal.md`:问题描述 + 根因分析 + 修复目标
36
+ - `design.md`:修复方案(1 个即可,无需多方案对比)
37
+ - `tasks.md`:修复任务清单
38
+ - 通常**无需 delta spec**(除非修复改变了已有 spec 的验收场景)
39
+ - [ ] **`/openspec-new-change` 生成的所有文档/artifact 必须使用中文表述**。
40
+ - [ ] 调用 `"$XWANG_STATE" init <name> quick` 初始化状态(`workflow: quick`,`phase: build`,跳过 design)。
41
+
42
+ ### Step 2:直接构建
43
+
44
+ - [ ] 读取 `openspec/changes/<name>/tasks.md`。
45
+ - [ ] 默认使用 `build_mode: direct`、`tdd_mode: direct`、`isolation: branch`,无需用户决策。
46
+ - [ ] 记录选择:
47
+ - `"$XWANG_STATE" set <name> build_mode direct`
48
+ - `"$XWANG_STATE" set <name> tdd_mode direct`
49
+ - `"$XWANG_STATE" set <name> isolation branch`
50
+ - [ ] 按 `feature/YYYYMMDD/<name>` 创建分支。
51
+ - [ ] 对每个未完成任务:
52
+ - 修改代码
53
+ - 运行格式化命令(如项目有)
54
+ - 运行相关测试确认通过
55
+ - 将 `tasks.md` 中对应 `- [ ]` 改为 `- [x]`
56
+ - 提交代码,`commit message`:`fix: <简述修复>`
57
+ - [ ] 全部任务完成后,显式运行项目测试和构建命令。
58
+ - [ ] 出现崩溃、异常、测试失败或构建失败时,立即加载 Superpowers `systematic-debugging` 技能;根因调查完成前不得实施源码修复。
59
+
60
+ ### Step 3:根因消除检查
61
+
62
+ - [ ] 读取 `proposal.md` 中的 bug 描述和根因。
63
+ - [ ] 确认问题代码已消除。
64
+ - [ ] 如根因未消除,回到 Step 2 继续修复。
65
+ - [ ] 如根因指向深层架构问题或需要接口变更,**暂停并等待用户确认**是否升级为完整 `/xwang` 流程。
66
+
67
+ ### Step 4:验证
68
+
69
+ - [ ] 默认选择保持分支不变(稍后处理),无需用户确认:调用 `"$XWANG_STATE" set <name> branch_status handled`。
70
+ - [ ] **阶段出口守护(build → verify)**:调用 `"$XWANG_GUARD" <name> build --apply` 校验 build 阶段退出条件,通过后会自动将 `phase` 推进到 `verify`。
71
+ - [ ] 调用 `/xwang-verify` 继续验证。
72
+
73
+ ### Step 5:归档
74
+
75
+ - [ ] `/xwang-verify` 将 phase 推进到 `archive` 后,用户可调用 `/xwang-archive` 完成归档。
76
+
77
+ ## 升级条件
78
+
79
+ 满足以下任一条件时,停止 hotfix,升级为完整 `/xwang`:
80
+
81
+ | 条件 | 说明 |
82
+ |------|------|
83
+ | 改动涉及 3+ 文件 | 超出单点修复范围 |
84
+ | 架构变更 | 新模块、新接口、新依赖 |
85
+ | 数据库 schema 变更 | 结构性调整 |
86
+ | 引入新的 public API | 修复产生了新的对外接口 |
87
+ | 修复范围超出单一函数/模块 | 需要多处协调修改 |
88
+
89
+ 满足升级条件时**必须使用当前平台可用的用户输入/确认机制暂停并等待用户确认**。用户确认升级后:
90
+
91
+ ```bash
92
+ "$XWANG_STATE" set <name> workflow full
93
+ "$XWANG_STATE" set <name> phase design
94
+ ```
95
+
96
+ 然后调用 `/xwang-design` 补充设计并走完整流程。
97
+
98
+ ## 退出条件
99
+
100
+ - Bug 已修复,测试通过
101
+ - change 已推进到 `phase: archive`
102
+ - 用户通过 `/xwang-archive` 完成归档
@@ -0,0 +1,108 @@
1
+ ---
2
+ name: xwang-open
3
+ description: 在启动新工作前检测用户意图并报告 xwang 项目是否存在未完成任务。支持识别 hotfix/tweak 等预设路径。当用户说 "xwang-open"、启动 xwang、打开 xwang,或在开始前想检查 xwang 任务状态时使用。
4
+ ---
5
+
6
+ # xwang-open
7
+
8
+ ## 快速开始
9
+
10
+ 当用户想要打开/启动 xwang 或检查项目状态时:
11
+
12
+ 1. **意图检测(Preset 判定)**:先判断用户输入是否命中 hotfix / tweak 等预设路径。
13
+ - 用户明确描述为 bug fix / 热修复 + 满足 hotfix 条件 → 直接调用 `/xwang-hotfix`
14
+ - 用户明确描述为文案/配置/文档/prompt 小调整 + 满足 tweak 条件 → 直接调用 `/xwang-tweak`
15
+ - 未命中 preset → 继续步骤 2
16
+ 2. **定位 xwang 脚本并运行未完成任务检测**:先 source `xwang-env.sh` 定位脚本路径,再调用 `"$XWANG_OPEN_CHECK"` 扫描活跃 change、Git dirty worktree、TODO/FIXME 注释等。
17
+
18
+ ```bash
19
+ XWANG_ENV="${XWANG_ENV:-$(find . "$HOME"/../*/skills "$HOME/.config" -path '*/xwang/scripts/xwang-env.sh' -type f -print -quit 2>/dev/null)}"
20
+ if [ -z "$XWANG_ENV" ]; then
21
+ echo "ERROR: xwang-env.sh not found. Ensure the xwang skill is installed." >&2
22
+ return 1
23
+ fi
24
+ . "$XWANG_ENV"
25
+ "$XWANG_OPEN_CHECK" --text
26
+ ```
27
+ 3. 汇总检测结果。
28
+ 4. 询问用户是继续已有任务、切换到其他任务,还是创建新任务。
29
+
30
+ ## 检测清单
31
+
32
+ 通过 `"$XWANG_OPEN_CHECK"` 自动检查以下来源(脚本路径通过 `xwang-env.sh` 动态定位,避免硬编码 `.claude`):
33
+
34
+ - [ ] 尚未归档的 OpenSpec / xwang change 产物(读取 `.xwang.yaml` 的 `phase`、`archived` 等字段)
35
+ - [ ] Git 工作区改动(未提交文件 / stash / staged)
36
+ - [ ] 最近改动文件中的 TODO / FIXME / XXX 注释
37
+
38
+ 暂不自动检查、需人工补充的来源:
39
+
40
+ - [ ] Claude 任务列表中的活跃任务
41
+ - [ ] 项目任务或计划文件(例如 `TASKS.md`、`PLAN.md`)
42
+ - [ ] 与项目关联的 GitHub issues / PRs(如有权限访问)
43
+
44
+ ## 报告格式
45
+
46
+ 返回简洁的状态块:
47
+
48
+ ```
49
+ xwang-open 状态: <ready | blocked | has-unfinished-work>
50
+
51
+ 发现的未完成任务信号:
52
+ - <来源>: <简要描述>
53
+
54
+ 建议下一步:
55
+ - <continue-existing-task | start-fresh | wait-for-input>
56
+
57
+ 说明:
58
+ - ready / 无未完成任务时,主入口 /xwang 将直接进入 xwang-design,无需再次确认。
59
+ - 若输入命中 hotfix / tweak preset,将直接分发到对应快速路径。
60
+ ```
61
+
62
+ ## Workflows
63
+
64
+ ### Step 0:意图检测与 Preset 判定
65
+
66
+ **Preset 检测优先级最高**。先根据用户输入判断是否需要走快速路径:
67
+
68
+ - **hotfix 判定**(需同时满足):
69
+ - 用户明确描述为 bug fix / 热修复 / 修复某个问题
70
+ - 修复已有功能,不新增 capability
71
+ - 不涉及接口变更或架构调整
72
+ - 改动范围可预估(通常 ≤ 2 个文件)
73
+ - **命中后行为**:直接调用 `/xwang-hotfix`,不再执行普通 open 流程
74
+
75
+ - **tweak 判定**(需同时满足):
76
+ - 用户明确描述为文案/配置/文档/prompt 小调整 / 小优化
77
+ - 不新增 capability
78
+ - 不改变架构
79
+ - 不涉及接口变化
80
+ - 通常不超过 3 个任务
81
+ - **命中后行为**:直接调用 `/xwang-tweak`,不再执行普通 open 流程
82
+
83
+ - **未命中 preset**:继续 Step 1 的普通 open 流程
84
+
85
+ ### Step 1:未完成任务扫描
86
+
87
+ 调用 `"$XWANG_OPEN_CHECK"` 自动扫描:
88
+
89
+ - [ ] **活跃 xwang change**:遍历 `openspec/changes/*/.xwang.yaml`,跳过 `archived: true`,根据 `phase` 判断当前状态:
90
+ - `design` 且无 `design_doc` → 需要继续 `/xwang-design`
91
+ - `build` 且 `tasks.md` 有未勾选任务 → 需要继续 `/xwang-build`
92
+ - `verify` 且 `branch_status` 或 `verification_report` 未完成 → 需要继续 `/xwang-verify`
93
+ - `archive` → 需要 `/xwang-archive`
94
+ - [ ] **Git dirty worktree**:运行 `git status --short`、`git diff --stat`、`git diff --cached --stat`、`git ls-files --others --exclude-standard`
95
+ - [ ] **TODO / FIXME / XXX 注释**:扫描最近 7 天内变更过的文件
96
+ - [ ] 将脚本输出作为状态报告的核心内容。
97
+
98
+ ### Step 2:报告与下一步建议
99
+
100
+ - [ ] 汇总所有检测到的信号。
101
+ - [ ] 返回 `xwang-open 状态` 报告。
102
+ - [ ] 根据状态给出建议下一步:继续已有任务、切换到其他任务、创建新任务,或已分发到 preset skill。
103
+
104
+ ## 说明
105
+
106
+ - 本 skill 通过 `"$XWANG_OPEN_CHECK"`(由 `xwang-env.sh` 动态定位)自动检测活跃 change、Git dirty worktree 和 TODO/FIXME 注释。
107
+ - 检测结果仅报告状态,不会自动修改文件或创建 change。
108
+ - Claude 任务列表、项目任务文件、GitHub issues/PRs 等来源目前仍需人工检查或后续扩展脚本支持。
@@ -0,0 +1,197 @@
1
+ #!/bin/bash
2
+ # xwang-open-check — detect unfinished work in an xwang project
3
+ # Usage: xwang-open-check.sh [options]
4
+ # --json Output machine-readable JSON
5
+ # --text Output human-readable text (default)
6
+
7
+ set -euo pipefail
8
+
9
+ # --- Colors ---
10
+ red() { echo -e "\033[31m$1\033[0m" >&2; }
11
+ yellow() { echo -e "\033[33m$1\033[0m" >&2; }
12
+ green() { echo -e "\033[32m$1\033[0m" >&2; }
13
+
14
+ # --- Options ---
15
+ OUTPUT="text"
16
+ while [ $# -gt 0 ]; do
17
+ case "$1" in
18
+ --json) OUTPUT="json" ;;
19
+ --text) OUTPUT="text" ;;
20
+ *) red "Unknown option: $1" >&2; exit 1 ;;
21
+ esac
22
+ shift
23
+ done
24
+
25
+ # --- Helpers ---
26
+ file_nonempty() { [ -f "$1" ] && [ -s "$1" ]; }
27
+
28
+ yaml_field() {
29
+ field="$1"
30
+ yaml_file="$2"
31
+ if [ -f "$yaml_file" ]; then
32
+ grep "^${field}:" "$yaml_file" 2>/dev/null | sed "s/^${field}: *//" | head -1 || true
33
+ fi
34
+ }
35
+
36
+ count_unchecked_tasks() {
37
+ file="$1"
38
+ if [ -f "$file" ]; then
39
+ grep -c '^[[:space:]]*- \[ \]' "$file" 2>/dev/null || echo "0"
40
+ else
41
+ echo "0"
42
+ fi
43
+ }
44
+
45
+ # --- Detect active changes ---
46
+ CHANGES_DIR="openspec/changes"
47
+ JSON_ENTRIES=()
48
+ TEXT_LINES=()
49
+ SIGNAL_COUNT=0
50
+
51
+ # 1. Active xwang changes
52
+ if [ -d "$CHANGES_DIR" ]; then
53
+ while IFS= read -r change_dir; do
54
+ [ -z "$change_dir" ] && continue
55
+ change_name=$(basename "$change_dir")
56
+ xwang_file="$change_dir/.xwang.yaml"
57
+ tasks_file="$change_dir/tasks.md"
58
+
59
+ if [ ! -f "$xwang_file" ]; then
60
+ continue
61
+ fi
62
+
63
+ phase=$(yaml_field "phase" "$xwang_file")
64
+ workflow=$(yaml_field "workflow" "$xwang_file")
65
+ archived=$(yaml_field "archived" "$xwang_file")
66
+ design_doc=$(yaml_field "design_doc" "$xwang_file")
67
+ plan=$(yaml_field "plan" "$xwang_file")
68
+ verification_report=$(yaml_field "verification_report" "$xwang_file")
69
+ branch_status=$(yaml_field "branch_status" "$xwang_file")
70
+
71
+ # Skip fully archived changes
72
+ if [ "$archived" = "true" ]; then
73
+ continue
74
+ fi
75
+
76
+ status="active"
77
+ details="phase=${phase:-unknown}, workflow=${workflow:-unknown}"
78
+ action=""
79
+
80
+ case "$phase" in
81
+ design)
82
+ if [ -z "$design_doc" ] || [ "$design_doc" = "null" ]; then
83
+ details="${details}, design_doc pending"
84
+ action="continue /xwang-design"
85
+ else
86
+ status="ready-to-build"
87
+ details="${details}, design_doc=${design_doc}"
88
+ action="proceed to /xwang-build"
89
+ fi
90
+ ;;
91
+ build)
92
+ unchecked=$(count_unchecked_tasks "$tasks_file")
93
+ if [ "$unchecked" -gt 0 ]; then
94
+ details="${details}, ${unchecked} unchecked tasks"
95
+ action="continue /xwang-build"
96
+ else
97
+ status="ready-to-verify"
98
+ details="${details}, all tasks done"
99
+ action="proceed to /xwang-verify"
100
+ fi
101
+ ;;
102
+ verify)
103
+ if [ "$branch_status" != "handled" ]; then
104
+ details="${details}, branch_status=${branch_status:-pending}"
105
+ action="continue /xwang-verify"
106
+ elif [ -z "$verification_report" ] || [ "$verification_report" = "null" ]; then
107
+ details="${details}, verification_report pending"
108
+ action="continue /xwang-verify"
109
+ else
110
+ status="ready-to-archive"
111
+ details="${details}, verification_report=${verification_report}"
112
+ action="proceed to /xwang-archive"
113
+ fi
114
+ ;;
115
+ archive)
116
+ status="ready-to-archive"
117
+ action="proceed to /xwang-archive"
118
+ ;;
119
+ *)
120
+ action="inspect manually"
121
+ ;;
122
+ esac
123
+
124
+ JSON_ENTRIES+=("{\"source\":\"xwang-change\",\"name\":\"$change_name\",\"status\":\"$status\",\"phase\":\"${phase:-unknown}\",\"details\":\"$details\",\"action\":\"$action\"}")
125
+ TEXT_LINES+=(" - [xwang-change] $change_name: $status ($details) → $action")
126
+ SIGNAL_COUNT=$((SIGNAL_COUNT + 1))
127
+ done < <(find "$CHANGES_DIR" -maxdepth 1 -mindepth 1 -type d -print)
128
+ fi
129
+
130
+ # 2. Git dirty worktree
131
+ GIT_DIRTY=0
132
+ GIT_DETAILS=""
133
+ if git rev-parse --git-dir >/dev/null 2>&1; then
134
+ untracked=$(git ls-files --others --exclude-standard 2>/dev/null | wc -l | tr -d ' ')
135
+ tracked_unstaged=$(git diff --name-only 2>/dev/null | wc -l | tr -d ' ')
136
+ tracked_staged=$(git diff --cached --name-only 2>/dev/null | wc -l | tr -d ' ')
137
+
138
+ if [ "$untracked" -gt 0 ] || [ "$tracked_unstaged" -gt 0 ] || [ "$tracked_staged" -gt 0 ]; then
139
+ GIT_DIRTY=1
140
+ GIT_DETAILS="untracked=${untracked}, unstaged=${tracked_unstaged}, staged=${tracked_staged}"
141
+ JSON_ENTRIES+=("{\"source\":\"git-dirty-worktree\",\"status\":\"dirty\",\"details\":\"$GIT_DETAILS\",\"action\":\"commit or stash changes before starting new work\"}")
142
+ TEXT_LINES+=(" - [git-dirty-worktree] $GIT_DETAILS → commit or stash before starting new work")
143
+ SIGNAL_COUNT=$((SIGNAL_COUNT + 1))
144
+ fi
145
+ fi
146
+
147
+ # 3. TODO / FIXME / XXX in recent changes
148
+ TODO_COUNT=0
149
+ if git rev-parse --git-dir >/dev/null 2>&1; then
150
+ # Check files changed in last 7 days or currently dirty
151
+ recent_files=$(git log --since="7 days ago" --name-only --pretty=format: 2>/dev/null | sort -u | grep -v '^$' || true)
152
+ if [ -n "$recent_files" ]; then
153
+ TODO_COUNT=$(echo "$recent_files" | xargs grep -Hn -E 'TODO|FIXME|XXX' 2>/dev/null | wc -l | tr -d ' ')
154
+ fi
155
+ fi
156
+
157
+ if [ "$TODO_COUNT" -gt 0 ]; then
158
+ JSON_ENTRIES+=("{\"source\":\"todo-comments\",\"status\":\"found\",\"details\":\"${TODO_COUNT} TODO/FIXME/XXX in recent files\",\"action\":\"review before starting new work\"}")
159
+ TEXT_LINES+=(" - [todo-comments] ${TODO_COUNT} TODO/FIXME/XXX in recent files → review before starting new work")
160
+ SIGNAL_COUNT=$((SIGNAL_COUNT + 1))
161
+ fi
162
+
163
+ # --- Output ---
164
+ if [ "$OUTPUT" = "json" ]; then
165
+ echo "{\"ready\":$([ "$SIGNAL_COUNT" -eq 0 ] && echo "true" || echo "false"),\"signals\":["
166
+ first=1
167
+ for entry in "${JSON_ENTRIES[@]:-}"; do
168
+ [ -z "$entry" ] && continue
169
+ if [ "$first" -eq 1 ]; then
170
+ first=0
171
+ else
172
+ echo ","
173
+ fi
174
+ echo -n " $entry"
175
+ done
176
+ echo ""
177
+ echo "]}"
178
+ else
179
+ echo "=== xwang-open status ==="
180
+ if [ "$SIGNAL_COUNT" -eq 0 ]; then
181
+ green "READY — no unfinished work detected"
182
+ echo ""
183
+ echo "建议下一步: start-fresh → /xwang-design"
184
+ else
185
+ yellow "HAS-UNFINISHED-WORK — ${SIGNAL_COUNT} signal(s) found"
186
+ echo ""
187
+ echo "发现的未完成任务信号:"
188
+ for line in "${TEXT_LINES[@]:-}"; do
189
+ [ -z "$line" ] && continue
190
+ echo "$line"
191
+ done
192
+ echo ""
193
+ echo "建议下一步: continue-existing-task"
194
+ fi
195
+ fi
196
+
197
+ exit 0
@@ -0,0 +1,99 @@
1
+ ---
2
+ name: xwang-tweak
3
+ description: xwang 轻量小改动路径:跳过 design 阶段,直接 open → lightweight build → light verify → archive。适用于文案、配置、文档或 prompt 的局部优化。当用户触发 xwang-tweak、tweak、小改动或局部优化时使用。
4
+ ---
5
+
6
+ # xwang-tweak
7
+
8
+ 轻量小改动工作流:open → lightweight build → light verify → archive。跳过 design 阶段,适用于非 bug 的小范围变更。
9
+
10
+ **适用条件**(必须全部满足):
11
+ 1. 不新增 capability
12
+ 2. 不改变架构
13
+ 3. 不涉及接口变化
14
+ 4. 通常不超过 3 个任务
15
+
16
+ **不适用**:如变更过程中发现需要 capability、架构或接口调整,应升级为完整 `/xwang` 流程。
17
+
18
+ ## 流程
19
+
20
+ 开始前先定位 xwang 脚本:
21
+
22
+ ```bash
23
+ XWANG_ENV="${XWANG_ENV:-$(find . "$HOME"/.*/skills "$HOME/.config" -path '*/xwang/scripts/xwang-env.sh' -type f -print -quit 2>/dev/null)}"
24
+ if [ -z "$XWANG_ENV" ]; then
25
+ echo "ERROR: xwang-env.sh not found. Ensure the xwang skill is installed." >&2
26
+ return 1
27
+ fi
28
+ . "$XWANG_ENV"
29
+ ```
30
+
31
+ ### Step 1:快速开启
32
+
33
+ - [ ] 确认用户要触发 tweak(关键词:xwang-tweak、tweak、小改动、局部优化)。
34
+ - [ ] 用户未提供 change 名称时,根据变更主题生成一个简洁的 kebab-case 名称 `<name>`。
35
+ - [ ] 直接调用 `/openspec-new-change` 创建精简 change:
36
+ - `proposal.md`:变更动机 + 目标 + 范围
37
+ - `design.md`:简短实现说明(无需方案对比)
38
+ - `tasks.md`:不超过 3 个任务
39
+ - **无需 delta spec**(一旦需要,升级为完整 `/xwang`)
40
+ - [ ] **`/openspec-new-change` 生成的所有文档/artifact 必须使用中文表述**。
41
+ - [ ] 调用 `"$XWANG_STATE" init <name> tweak` 初始化状态(`workflow: tweak`,`phase: build`,跳过 design)。
42
+
43
+ ### Step 2:轻量构建
44
+
45
+ - [ ] 读取 `openspec/changes/<name>/tasks.md`。
46
+ - [ ] 默认使用 `build_mode: direct`、`tdd_mode: direct`、`isolation: branch`,无需用户决策。
47
+ - [ ] 记录选择:
48
+ - `"$XWANG_STATE" set <name> build_mode direct`
49
+ - `"$XWANG_STATE" set <name> tdd_mode direct`
50
+ - `"$XWANG_STATE" set <name> isolation branch`
51
+ - [ ] 按 `feature/YYYYMMDD/<name>` 创建分支。
52
+ - [ ] 对每个未完成任务:
53
+ - 根据任务描述修改目标文件
54
+ - 运行格式化命令(如项目有)
55
+ - 运行相关测试确认通过
56
+ - 将 `tasks.md` 中对应 `- [ ]` 改为 `- [x]`
57
+ - 提交代码,`commit message`:`tweak: <简述变更>`
58
+ - [ ] 全部任务完成后,显式运行项目测试和构建命令。
59
+ - [ ] 出现崩溃、异常、测试失败或构建失败时,立即加载 Superpowers `systematic-debugging` 技能;根因调查完成前不得实施源码修复。
60
+
61
+ ### Step 3:轻量验证
62
+
63
+ - [ ] 默认选择保持分支不变(稍后处理),无需用户确认:调用 `"$XWANG_STATE" set <name> branch_status handled`。
64
+ - [ ] **阶段出口守护(build → verify)**:调用 `"$XWANG_GUARD" <name> build --apply` 校验 build 阶段退出条件,通过后会自动将 `phase` 推进到 `verify`。
65
+ - [ ] 调用 `/xwang-verify` 继续验证。
66
+ - [ ] 若 `/xwang-verify` 的规模评估进入 `full` 模式,停止 tweak,**暂停并等待用户确认**是否升级为完整 `/xwang` 流程。
67
+
68
+ ### Step 4:归档
69
+
70
+ - [ ] `/xwang-verify` 将 phase 推进到 `archive` 后,用户可调用 `/xwang-archive` 完成归档。
71
+
72
+ ## 升级条件
73
+
74
+ 满足以下任一条件时,停止 tweak,升级为完整 `/xwang`:
75
+
76
+ | 条件 | 说明 |
77
+ |------|------|
78
+ | 改动涉及 5+ 文件 | 超出小改动范围 |
79
+ | 多模块协调修改 | 需要跨组件协调 |
80
+ | 需要新增测试用例 5+ | 变更复杂度上升 |
81
+ | 配置项新增或删除 | 非值修改的配置变更 |
82
+ | 需要新增 capability | 超出局部优化 |
83
+ | 需要 delta spec | 影响了已有规格 |
84
+
85
+ 满足升级条件时**必须使用当前平台可用的用户输入/确认机制暂停并等待用户确认**。用户确认升级后:
86
+
87
+ ```bash
88
+ "$XWANG_STATE" set <name> workflow full
89
+ "$XWANG_STATE" set <name> phase design
90
+ ```
91
+
92
+ 然后调用 `/xwang-design` 补充设计并走完整流程。
93
+
94
+ ## 退出条件
95
+
96
+ - 小改动已完成,测试通过
97
+ - change 已推进到 `phase: archive`
98
+ - 未新增 capability、架构调整或接口变化
99
+ - 用户通过 `/xwang-archive` 完成归档