gsd-trae 1.0.2 → 1.1.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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [1.1.0] - 2026-03-16
11
+
12
+ ### Added
13
+ - 新增 `uninstall.sh` 卸载脚本,支持完整清理 GSD 安装
14
+ - CLI 支持 `uninstall` / `--uninstall` / `-u` 命令
15
+ - 安装时自动创建 `~/.gsdc` 符号链接,统一命令访问路径,减少 token 消耗
16
+ - 安装时自动备份已存在的 `project_rules.md`(带时间戳)
17
+ - 添加端到端测试(vitest),覆盖安装/卸载完整流程
18
+ - 新增 `gsd-agents.md` 和 `gsd-references.md` 文档
19
+
20
+ ### Changed
21
+ - `project_rules.md` 改为渐进式披露结构,核心指令优先展示
22
+ - 改进 `install.sh` 目录处理,使用子 shell 避免副作用
23
+ - 修复 CLI 工作目录问题,确保在正确目录执行脚本
24
+ - `uninstall.sh` 包含在 npm 包中
25
+
26
+ ### Fixed
27
+ - 修复 `cli.js` 未正确传递 `cwd` 导致安装到错误目录的问题
28
+
8
29
  ## [1.0.2] - 2026-02-26
9
30
 
10
31
  ### Changed
package/README.md CHANGED
@@ -34,34 +34,19 @@ GSD 通过流程约束解决了**上下文衰减(Context Rot)**问题——
34
34
  在项目根目录运行:
35
35
 
36
36
  ```bash
37
- npx gsd-trae
37
+ npx -y gsd-trae@latest
38
38
  ```
39
39
 
40
- ### 方式二:使用 curl
41
-
42
- 在项目根目录运行:
43
-
44
- ```bash
45
- bash <(curl -s https://raw.githubusercontent.com/Lionad-Morotar/get-shit-done-trae/main/install.sh)
46
- ```
47
-
48
- ### 方式三:手动安装
49
-
50
- 1. 克隆本仓库到固定位置:
40
+ ### 卸载
51
41
 
52
42
  ```bash
53
- git clone https://github.com/Lionad-Morotar/get-shit-done-trae.git ~/.config/gsd-trae
43
+ npx -y gsd-trae@latest uninstall
54
44
  ```
55
45
 
56
- 2. 运行安装脚本:
57
-
58
- ```bash
59
- bash ~/.config/gsd-trae/install.sh
60
- ```
61
46
 
62
47
  ### 开始工作
63
48
 
64
- 安装完成后,在 Trae 的 AI 对话中输入:
49
+ 安装完成后,在 Trae 的 AI 对话中输入 GSD 指令即可开始。以下是一个示例:
65
50
 
66
51
  ```
67
52
  /gsd:new-project
@@ -69,19 +54,15 @@ bash ~/.config/gsd-trae/install.sh
69
54
 
70
55
  ![](./assets/screenshot.png)
71
56
 
72
- ## 核心命令
57
+ ## 工作流程
73
58
 
74
- | 命令 | 用途 |
75
- | ---------------------- | ----------------------------------------- |
76
- | `/gsd:new-project` | 初始化新项目:提问 → 研究 → 需求 → 路线图 |
77
- | `/gsd:discuss-phase N` | 收集第 N 阶段的上下文 |
78
- | `/gsd:plan-phase N` | 为第 N 阶段创建详细计划 |
79
- | `/gsd:execute-phase N` | 执行第 N 阶段的所有计划 |
80
- | `/gsd:verify-work` | 验证交付物是否符合要求 |
81
- | `/gsd:progress` | 检查项目进度 |
82
- | `/gsd:map-codebase` | 分析现有代码库 |
59
+ ### 从已有代码开始(Brownfield)
83
60
 
84
- ## 工作流程
61
+ ```
62
+ /gsd:map-codebase # 先分析现有代码
63
+
64
+ /gsd:new-project # 基于现有上下文规划新功能
65
+ ```
85
66
 
86
67
  ### 新项目(Greenfield)
87
68
 
@@ -97,27 +78,22 @@ bash ~/.config/gsd-trae/install.sh
97
78
  进入 Phase 2...
98
79
  ```
99
80
 
100
- ### 已有代码(Brownfield)
101
-
102
- ```
103
- /gsd:map-codebase # 先分析现有代码
104
-
105
- /gsd:new-project # 基于现有上下文规划新功能
106
- ```
107
-
108
- ## 参考
109
-
110
- - [GSD 原项目](https://github.com/glittercowboy/get-shit-done) - 官方仓库
111
-
112
81
  ## 工作原理
113
82
 
114
83
  安装脚本 `install.sh` 会执行以下操作:
115
84
 
116
85
  1. 将 GSD 源文件克隆到 `~/.gsd-source`
117
- 2. 在当前项目创建 `.trae/rules/project_rules.md`
118
- 3. `project_rules.md` 中的链接指向 `~/.gsd-source` 下的实际文件
86
+ 2. 创建符号链接 `~/.gsdc` → `~/.gsd-source/commands/gsd`
87
+ 3. 在当前项目创建 `.trae/rules/project_rules.md`
119
88
 
120
- 这样多个项目可以共享同一份 GSD 源文件,同时每个项目有自己的 Trae 规则配置。
89
+ 这样:
90
+ - 多个项目共享同一份 GSD 源文件
91
+ - 通过 `~/.gsdc/{command}.md` 统一访问命令文档
92
+ - 每个项目有自己的 Trae 规则配置
93
+
94
+ ## Reference
95
+
96
+ - [GSD 原项目](https://github.com/glittercowboy/get-shit-done) - 官方仓库
121
97
 
122
98
  ## 许可证
123
99
 
package/bin/cli.js CHANGED
@@ -3,11 +3,27 @@
3
3
  const { execSync } = require('child_process');
4
4
  const path = require('path');
5
5
 
6
- const installScript = path.join(__dirname, '..', 'install.sh');
6
+ const args = process.argv.slice(2);
7
+ const command = args[0];
7
8
 
8
- try {
9
- execSync(`bash "${installScript}"`, { stdio: 'inherit' });
10
- } catch (error) {
11
- console.error('安装失败:', error.message);
12
- process.exit(1);
9
+ const scriptDir = path.join(__dirname, '..');
10
+
11
+ const userCwd = process.cwd();
12
+
13
+ if (command === 'uninstall' || command === '--uninstall' || command === '-u') {
14
+ const uninstallScript = path.join(scriptDir, 'uninstall.sh');
15
+ try {
16
+ execSync(`bash "${uninstallScript}"`, { stdio: 'inherit', cwd: userCwd });
17
+ } catch (error) {
18
+ console.error('卸载失败:', error.message);
19
+ process.exit(1);
20
+ }
21
+ } else {
22
+ const installScript = path.join(scriptDir, 'install.sh');
23
+ try {
24
+ execSync(`bash "${installScript}"`, { stdio: 'inherit', cwd: userCwd });
25
+ } catch (error) {
26
+ console.error('安装失败:', error.message);
27
+ process.exit(1);
28
+ }
13
29
  }
package/install.sh CHANGED
@@ -18,52 +18,63 @@ if [ ! -d "$GSD_SOURCE/.git" ]; then
18
18
  git clone --depth 1 "$GSD_REPO" "$GSD_SOURCE" >/dev/null 2>&1
19
19
  else
20
20
  echo "📥 更新 GSD 源文件..."
21
- cd "$GSD_SOURCE" && git pull >/dev/null 2>&1
21
+ (cd "$GSD_SOURCE" && git pull >/dev/null 2>&1)
22
22
  fi
23
23
 
24
- # 2. 检查是否已存在 project_rules.md
24
+ # 2. 创建 ~/.gsdc 符号链接(指向 ~/.gsd-source/commands/gsd)
25
+ GSDC_PATH="$HOME/.gsdc"
26
+ if [ -L "$GSDC_PATH" ]; then
27
+ rm "$GSDC_PATH"
28
+ elif [ -e "$GSDC_PATH" ]; then
29
+ rm -rf "$GSDC_PATH"
30
+ fi
31
+ ln -s "$GSD_SOURCE/commands/gsd" "$GSDC_PATH"
32
+ echo "🔗 创建符号链接: ~/.gsdc → $GSD_SOURCE/commands/gsd"
33
+
34
+ # 3. 检查是否已存在 project_rules.md
25
35
  if [ -f ".trae/rules/project_rules.md" ]; then
26
- echo "❌ 错误: .trae/rules/project_rules.md 已存在"
27
- echo ""
28
- echo "如需重新安装,请先删除现有文件:"
29
- echo " rm .trae/rules/project_rules.md"
30
- echo ""
31
- echo "或手动备份后重命名:"
32
- echo " mv .trae/rules/project_rules.md .trae/rules/project_rules.md.backup"
33
- exit 1
36
+ BACKUP_FILE=".trae/rules/project_rules.md.backup.$(date +%Y%m%d%H%M%S)"
37
+ echo "⚠️ 检测到已存在 .trae/rules/project_rules.md"
38
+ echo "📝 自动备份到: $BACKUP_FILE"
39
+ cp ".trae/rules/project_rules.md" "$BACKUP_FILE"
34
40
  fi
35
41
 
36
- # 3. 创建 .trae/rules 目录
42
+ # 4. 创建 .trae/rules 目录
37
43
  if [ ! -d ".trae/rules" ]; then
38
44
  echo "📁 创建 .trae/rules 目录..."
39
45
  mkdir -p ".trae/rules"
40
46
  fi
41
47
 
42
- # 4. 复制 project_rules.md
43
- PROJECT_RULES_SOURCE=""
48
+ # 5. 复制项目规则文档
49
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
50
+ RULES_SOURCE_DIR=""
44
51
 
45
52
  # 优先从脚本所在目录查找
46
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
47
- if [ -f "$SCRIPT_DIR/.trae/rules/project_rules.md" ]; then
48
- PROJECT_RULES_SOURCE="$SCRIPT_DIR/.trae/rules/project_rules.md"
49
- elif [ -f "$SCRIPT_DIR/project_rules.md" ]; then
50
- PROJECT_RULES_SOURCE="$SCRIPT_DIR/project_rules.md"
53
+ if [ -d "$SCRIPT_DIR/.trae/rules" ]; then
54
+ RULES_SOURCE_DIR="$SCRIPT_DIR/.trae/rules"
55
+ elif [ -d "$SCRIPT_DIR/.trae" ]; then
56
+ RULES_SOURCE_DIR="$SCRIPT_DIR/.trae"
51
57
  fi
52
58
 
53
- # 如果没找到,从远程仓库下载
54
- if [ -z "$PROJECT_RULES_SOURCE" ]; then
55
- echo "📥 从远程仓库下载 project_rules.md..."
56
- curl -fsSL "$REPO_URL/raw/main/.trae/rules/project_rules.md" -o ".trae/rules/project_rules.md" 2>/dev/null || \
57
- curl -fsSL "$REPO_URL/raw/main/.trae/project_rules.md" -o ".trae/rules/project_rules.md" 2>/dev/null
58
- if [ $? -eq 0 ]; then
59
- echo " project_rules.md 下载成功"
60
- else
61
- echo " 无法下载 project_rules.md,请检查网络连接"
62
- exit 1
63
- fi
59
+ # 定义需要复制的文件
60
+ RULES_FILES=("project_rules.md" "gsd-agents.md" "gsd-references.md")
61
+
62
+ if [ -n "$RULES_SOURCE_DIR" ]; then
63
+ # 从本地目录复制
64
+ for file in "${RULES_FILES[@]}"; do
65
+ if [ -f "$RULES_SOURCE_DIR/$file" ]; then
66
+ echo "📝 复制 $file..."
67
+ cp "$RULES_SOURCE_DIR/$file" ".trae/rules/$file"
68
+ fi
69
+ done
64
70
  else
65
- echo "📝 复制 project_rules.md..."
66
- cp "$PROJECT_RULES_SOURCE" ".trae/rules/project_rules.md"
71
+ # 从远程仓库下载
72
+ echo "📥 从远程仓库下载文档..."
73
+ for file in "${RULES_FILES[@]}"; do
74
+ curl -fsSL "$REPO_URL/raw/main/.trae/rules/$file" -o ".trae/rules/$file" 2>/dev/null && \
75
+ echo " ✅ $file 下载成功" || \
76
+ echo " ⚠️ $file 下载失败"
77
+ done
67
78
  fi
68
79
 
69
80
  echo ""
@@ -71,7 +82,11 @@ echo "✅ 安装完成!"
71
82
  echo ""
72
83
  echo "📍 文件位置:"
73
84
  echo " GSD 源文件: $GSD_SOURCE"
74
- echo " 项目规则: $(pwd)/.trae/rules/project_rules.md"
85
+ echo " 命令目录: ~/.gsdc (符号链接)"
86
+ echo " 项目规则: $(pwd)/.trae/rules/"
87
+ echo " - project_rules.md"
88
+ echo " - gsd-agents.md"
89
+ echo " - gsd-references.md"
75
90
  echo ""
76
91
  echo "🚀 开始使用:"
77
92
  echo " 在 Trae 中输入 /gsd:new-project"
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "gsd-trae",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "GSD (Get Shit Done) framework adapter for Trae IDE",
5
5
  "main": "bin/cli.js",
6
6
  "bin": {
7
7
  "gsd-trae": "bin/cli.js"
8
8
  },
9
9
  "scripts": {
10
- "lint": "npx prettier --write README.md"
10
+ "lint": "npx prettier --write README.md",
11
+ "test": "vitest run tests/e2e/"
11
12
  },
12
13
  "keywords": [
13
14
  "gsd",
@@ -32,7 +33,11 @@
32
33
  "bin/",
33
34
  "assets/",
34
35
  "install.sh",
36
+ "uninstall.sh",
35
37
  "README.md",
36
38
  "CHANGELOG.md"
37
- ]
39
+ ],
40
+ "devDependencies": {
41
+ "vitest": "^4.1.0"
42
+ }
38
43
  }
package/uninstall.sh ADDED
@@ -0,0 +1,83 @@
1
+ #!/bin/bash
2
+
3
+ # GSD for Trae - 卸载脚本
4
+ # 用法: bash uninstall.sh
5
+
6
+ set -e
7
+
8
+ GSD_SOURCE="$HOME/.gsd-source"
9
+ GSDC_PATH="$HOME/.gsdc"
10
+
11
+ echo "🗑️ 卸载 GSD for Trae..."
12
+ echo ""
13
+
14
+ # 1. 删除 GSD 源文件
15
+ if [ -d "$GSD_SOURCE" ]; then
16
+ echo "📁 删除 GSD 源文件: $GSD_SOURCE"
17
+ rm -rf "$GSD_SOURCE"
18
+ echo " ✅ 已删除"
19
+ else
20
+ echo " ℹ️ GSD 源文件不存在,跳过"
21
+ fi
22
+
23
+ # 2. 删除符号链接
24
+ if [ -L "$GSDC_PATH" ]; then
25
+ echo "🔗 删除符号链接: ~/.gsdc"
26
+ rm "$GSDC_PATH"
27
+ echo " ✅ 已删除"
28
+ else
29
+ echo " ℹ️ 符号链接不存在,跳过"
30
+ fi
31
+
32
+ # 3. 删除当前项目的 GSD 规则文档
33
+ RULES_FILES=("project_rules.md" "gsd-agents.md" "gsd-references.md")
34
+ RULES_DELETED=0
35
+
36
+ for file in "${RULES_FILES[@]}"; do
37
+ if [ -f ".trae/rules/$file" ]; then
38
+ echo "📝 删除项目规则: .trae/rules/$file"
39
+ rm ".trae/rules/$file"
40
+ echo " ✅ 已删除"
41
+ RULES_DELETED=$((RULES_DELETED + 1))
42
+ fi
43
+ done
44
+
45
+ if [ $RULES_DELETED -eq 0 ]; then
46
+ echo " ℹ️ 项目规则文件不存在,跳过"
47
+ fi
48
+
49
+ # 如果目录为空,询问是否删除
50
+ if [ -d ".trae/rules" ] && [ -z "$(ls -A .trae/rules 2>/dev/null)" ]; then
51
+ echo ""
52
+ read -p "🤔 .trae/rules 目录为空,是否删除?(y/N) " -n 1 -r
53
+ echo ""
54
+ if [[ $REPLY =~ ^[Yy]$ ]]; then
55
+ rmdir ".trae/rules"
56
+ echo " ✅ 已删除 .trae/rules"
57
+
58
+ # 检查 .trae 是否为空
59
+ if [ -d ".trae" ] && [ -z "$(ls -A .trae 2>/dev/null)" ]; then
60
+ read -p "🤔 .trae 目录为空,是否删除?(y/N) " -n 1 -r
61
+ echo ""
62
+ if [[ $REPLY =~ ^[Yy]$ ]]; then
63
+ rmdir ".trae"
64
+ echo " ✅ 已删除 .trae"
65
+ fi
66
+ fi
67
+ fi
68
+ fi
69
+
70
+ # 4. 检查是否有 .planning 目录
71
+ if [ -d ".planning" ]; then
72
+ echo ""
73
+ echo "⚠️ 检测到项目规划目录: .planning/"
74
+ echo " 包含项目计划和历史记录,建议保留或手动备份后删除"
75
+ fi
76
+
77
+ echo ""
78
+ echo "✅ 卸载完成!"
79
+ echo ""
80
+ echo "如需重新安装,请运行:"
81
+ echo " npx gsd-trae"
82
+ echo ""
83
+ echo "感谢使用 GSD for Trae 👋"