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
- - `info <name>` 子项目详情
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillyspec",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
5
5
  "type": "module",
6
6
  "bin": {
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 字段为实际值。
@@ -26,7 +26,7 @@ cat .sillyspec/config.yaml 2>/dev/null
26
26
  - 无参数 / `status` → 显示状态
27
27
  - `add` → 添加子项目
28
28
  - `remove` → 移除子项目
29
- - `info <name>` 子项目详情
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
  ```