sillyspec 3.3.0 → 3.4.0
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.
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
## 交互规范
|
|
2
|
+
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
3
|
+
|
|
4
|
+
## 核心约束(必须遵守)
|
|
5
|
+
- ❌ 修改子项目的代码
|
|
6
|
+
- ❌ 删除已有文件(clone 前必须确认)
|
|
7
|
+
- ❌ 跳过冲突检查直接覆盖
|
|
8
|
+
|
|
9
|
+
## 流程
|
|
10
|
+
|
|
11
|
+
### Step 1: 读取配置
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
cat .sillyspec/config.yaml 2>/dev/null
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
无 config.yaml → 提示先执行 `/sillyspec:workspace` 初始化工作区。
|
|
18
|
+
|
|
19
|
+
### Step 2: 逐个子项目检查
|
|
20
|
+
|
|
21
|
+
对 config.yaml 中每个子项目,按顺序执行:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 检查目录是否存在
|
|
25
|
+
ls -d <path> 2>/dev/null && echo "EXISTS" || echo "MISSING"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### 情况 A:目录不存在
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 检查是否有 repo 配置
|
|
32
|
+
grep "repo:" .sillyspec/config.yaml | grep -A 1 "<name>"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- **有 repo** → AskUserQuestion:"子项目 `<name>` 不存在,是否从 `<repo>` clone 到 `<path>`?"
|
|
36
|
+
- 用户确认 → `git clone <repo> <path>` → ✅ 成功
|
|
37
|
+
- clone 失败 → ❌ 报错,提示用户手动 clone
|
|
38
|
+
- **无 repo** → ⚠️ 提示用户:"子项目 `<name>` 不存在且无 repo 配置,请手动放置到 `<path>`"
|
|
39
|
+
|
|
40
|
+
#### 情况 B:目录已存在
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 检查是否是 git 仓库
|
|
44
|
+
git -C <path> rev-parse --is-inside-work-tree 2>/dev/null
|
|
45
|
+
|
|
46
|
+
# 如果是,检查 remote 是否匹配
|
|
47
|
+
git -C <path> remote get-url origin 2>/dev/null
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- **不是 git 仓库** → AskUserQuestion:"目录 `<path>` 存在但不是 git 仓库,可能和其他项目冲突。"
|
|
51
|
+
- 跳过此子项目
|
|
52
|
+
- 让用户指定正确路径
|
|
53
|
+
- **是 git 仓库,remote 匹配 repo** → ✅ 跳过,状态正常
|
|
54
|
+
- **是 git 仓库,remote 不匹配 repo** → ⚠️ AskUserQuestion:
|
|
55
|
+
- "目录 `<path>` 是 git 仓库但 remote 不匹配(期望 `<repo>`,实际 `<actual>`)。可能是不同项目。"
|
|
56
|
+
- 跳过 / 用户确认覆盖
|
|
57
|
+
|
|
58
|
+
#### 情况 C:路径冲突
|
|
59
|
+
|
|
60
|
+
检查两个子项目的 path 是否指向同一目录或互相包含:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 将相对路径转为绝对路径后比较
|
|
64
|
+
realpath <path1>
|
|
65
|
+
realpath <path2>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
冲突 → ❌ 报错:"子项目 A 和 B 的路径冲突,请修改 config.yaml"
|
|
69
|
+
|
|
70
|
+
### Step 3: 汇总报告
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
📊 工作区同步结果
|
|
74
|
+
|
|
75
|
+
┌───────────────────┬──────────┬────────────────────────────────────┐
|
|
76
|
+
│ 子项目 │ 状态 │ 说明 │
|
|
77
|
+
├───────────────────┼──────────┼────────────────────────────────────┤
|
|
78
|
+
│ back-service │ ✅ 正常 │ 目录存在,git remote 匹配 │
|
|
79
|
+
│ sub-grid-security │ 🔄 已克隆 │ 从 https://... clone 成功 │
|
|
80
|
+
│ frontend │ ⚠️ 缺失 │ 无 repo 配置,请手动放置 │
|
|
81
|
+
└───────────────────┴──────────┴────────────────────────────────────┘
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
全部正常 → 提示 `/sillyspec:brainstorm '你的需求'` 继续。
|
|
85
|
+
有异常 → 提示用户处理后再 sync。
|
|
86
|
+
|
|
87
|
+
### Step 4: 更新 config.yaml
|
|
88
|
+
|
|
89
|
+
如果 clone 过程中实际 remote 和 config.yaml 中的 repo 不一致,更新 repo 字段为实际值。
|
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: 工作区管理 — 初始化、管理多项目工作区,查看子项目状态
|
|
3
|
-
argument-hint: "[可选:add/remove/status/info]"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## 交互规范
|
|
7
|
-
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
8
|
-
|
|
9
|
-
## 核心约束(必须遵守)
|
|
10
|
-
- ❌ 修改子项目目录下的任何文件
|
|
11
|
-
- ❌ 写非法 YAML
|
|
12
|
-
- ❌ 使用绝对路径(必须是相对路径)
|
|
13
|
-
|
|
14
|
-
## 用户指令
|
|
15
|
-
$ARGUMENTS
|
|
16
|
-
|
|
17
1
|
## 交互规范
|
|
18
2
|
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
19
3
|
|
|
@@ -42,7 +26,7 @@ cat .sillyspec/config.yaml 2>/dev/null
|
|
|
42
26
|
- 无参数 / `status` → 显示状态
|
|
43
27
|
- `add` → 添加子项目
|
|
44
28
|
- `remove` → 移除子项目
|
|
45
|
-
- `
|
|
29
|
+
- `sync` → 同步子项目(clone 缺失的,检查冲突)
|
|
46
30
|
|
|
47
31
|
### Step 3: 执行操作
|
|
48
32
|
|
|
@@ -68,6 +52,7 @@ projects:
|
|
|
68
52
|
<name>:
|
|
69
53
|
path: <relative-path>
|
|
70
54
|
role: <description>
|
|
55
|
+
repo: <git-remote-url> # 可选,git remote get-url origin
|
|
71
56
|
shared:
|
|
72
57
|
- <filename.md>
|
|
73
58
|
```
|
package/package.json
CHANGED
package/src/init.js
CHANGED
|
@@ -281,7 +281,7 @@ async function doInstall(projectDir, tools, isWorkspace, subprojects = []) {
|
|
|
281
281
|
let projectsYaml = '';
|
|
282
282
|
if (subprojects.length > 0) {
|
|
283
283
|
projectsYaml = subprojects.map(p =>
|
|
284
|
-
` ${p.name}:\n path: ${p.path}\n role: ${p.role || p.name}`
|
|
284
|
+
` ${p.name}:\n path: ${p.path}\n role: ${p.role || p.name}${p.repo ? `\n repo: ${p.repo}` : ''}`
|
|
285
285
|
).join('\n');
|
|
286
286
|
}
|
|
287
287
|
|
|
@@ -462,10 +462,19 @@ export async function cmdInit(projectDir, options = {}) {
|
|
|
462
462
|
default: '',
|
|
463
463
|
});
|
|
464
464
|
|
|
465
|
+
// 检测 git 远程地址
|
|
466
|
+
let repo = '';
|
|
467
|
+
try {
|
|
468
|
+
const { execSync } = require('child_process');
|
|
469
|
+
const absPath = resolve(projectDir, subPath.trim() || `./${name.trim()}`);
|
|
470
|
+
repo = execSync('git remote get-url origin', { cwd: absPath, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
471
|
+
} catch {}
|
|
472
|
+
|
|
465
473
|
subprojects.push({
|
|
466
474
|
name: name.trim(),
|
|
467
475
|
path: subPath.trim() || `./${name.trim()}`,
|
|
468
476
|
role: role.trim(),
|
|
477
|
+
repo,
|
|
469
478
|
});
|
|
470
479
|
|
|
471
480
|
// 从建议中移除已添加的
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
## 交互规范
|
|
2
|
+
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
3
|
+
|
|
4
|
+
## 核心约束(必须遵守)
|
|
5
|
+
- ❌ 修改子项目的代码
|
|
6
|
+
- ❌ 删除已有文件(clone 前必须确认)
|
|
7
|
+
- ❌ 跳过冲突检查直接覆盖
|
|
8
|
+
|
|
9
|
+
## 流程
|
|
10
|
+
|
|
11
|
+
### Step 1: 读取配置
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
cat .sillyspec/config.yaml 2>/dev/null
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
无 config.yaml → 提示先执行 `/sillyspec:workspace` 初始化工作区。
|
|
18
|
+
|
|
19
|
+
### Step 2: 逐个子项目检查
|
|
20
|
+
|
|
21
|
+
对 config.yaml 中每个子项目,按顺序执行:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 检查目录是否存在
|
|
25
|
+
ls -d <path> 2>/dev/null && echo "EXISTS" || echo "MISSING"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### 情况 A:目录不存在
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 检查是否有 repo 配置
|
|
32
|
+
grep "repo:" .sillyspec/config.yaml | grep -A 1 "<name>"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- **有 repo** → AskUserQuestion:"子项目 `<name>` 不存在,是否从 `<repo>` clone 到 `<path>`?"
|
|
36
|
+
- 用户确认 → `git clone <repo> <path>` → ✅ 成功
|
|
37
|
+
- clone 失败 → ❌ 报错,提示用户手动 clone
|
|
38
|
+
- **无 repo** → ⚠️ 提示用户:"子项目 `<name>` 不存在且无 repo 配置,请手动放置到 `<path>`"
|
|
39
|
+
|
|
40
|
+
#### 情况 B:目录已存在
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 检查是否是 git 仓库
|
|
44
|
+
git -C <path> rev-parse --is-inside-work-tree 2>/dev/null
|
|
45
|
+
|
|
46
|
+
# 如果是,检查 remote 是否匹配
|
|
47
|
+
git -C <path> remote get-url origin 2>/dev/null
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- **不是 git 仓库** → AskUserQuestion:"目录 `<path>` 存在但不是 git 仓库,可能和其他项目冲突。"
|
|
51
|
+
- 跳过此子项目
|
|
52
|
+
- 让用户指定正确路径
|
|
53
|
+
- **是 git 仓库,remote 匹配 repo** → ✅ 跳过,状态正常
|
|
54
|
+
- **是 git 仓库,remote 不匹配 repo** → ⚠️ AskUserQuestion:
|
|
55
|
+
- "目录 `<path>` 是 git 仓库但 remote 不匹配(期望 `<repo>`,实际 `<actual>`)。可能是不同项目。"
|
|
56
|
+
- 跳过 / 用户确认覆盖
|
|
57
|
+
|
|
58
|
+
#### 情况 C:路径冲突
|
|
59
|
+
|
|
60
|
+
检查两个子项目的 path 是否指向同一目录或互相包含:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 将相对路径转为绝对路径后比较
|
|
64
|
+
realpath <path1>
|
|
65
|
+
realpath <path2>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
冲突 → ❌ 报错:"子项目 A 和 B 的路径冲突,请修改 config.yaml"
|
|
69
|
+
|
|
70
|
+
### Step 3: 汇总报告
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
📊 工作区同步结果
|
|
74
|
+
|
|
75
|
+
┌───────────────────┬──────────┬────────────────────────────────────┐
|
|
76
|
+
│ 子项目 │ 状态 │ 说明 │
|
|
77
|
+
├───────────────────┼──────────┼────────────────────────────────────┤
|
|
78
|
+
│ back-service │ ✅ 正常 │ 目录存在,git remote 匹配 │
|
|
79
|
+
│ sub-grid-security │ 🔄 已克隆 │ 从 https://... clone 成功 │
|
|
80
|
+
│ frontend │ ⚠️ 缺失 │ 无 repo 配置,请手动放置 │
|
|
81
|
+
└───────────────────┴──────────┴────────────────────────────────────┘
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
全部正常 → 提示 `/sillyspec:brainstorm '你的需求'` 继续。
|
|
85
|
+
有异常 → 提示用户处理后再 sync。
|
|
86
|
+
|
|
87
|
+
### Step 4: 更新 config.yaml
|
|
88
|
+
|
|
89
|
+
如果 clone 过程中实际 remote 和 config.yaml 中的 repo 不一致,更新 repo 字段为实际值。
|
package/templates/workspace.md
CHANGED
|
@@ -26,7 +26,7 @@ cat .sillyspec/config.yaml 2>/dev/null
|
|
|
26
26
|
- 无参数 / `status` → 显示状态
|
|
27
27
|
- `add` → 添加子项目
|
|
28
28
|
- `remove` → 移除子项目
|
|
29
|
-
- `
|
|
29
|
+
- `sync` → 同步子项目(clone 缺失的,检查冲突)
|
|
30
30
|
|
|
31
31
|
### Step 3: 执行操作
|
|
32
32
|
|
|
@@ -52,6 +52,7 @@ projects:
|
|
|
52
52
|
<name>:
|
|
53
53
|
path: <relative-path>
|
|
54
54
|
role: <description>
|
|
55
|
+
repo: <git-remote-url> # 可选,git remote get-url origin
|
|
55
56
|
shared:
|
|
56
57
|
- <filename.md>
|
|
57
58
|
```
|