openmoneta-dev-kit 1.9.0 → 1.9.2

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/install.sh ADDED
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env bash
2
+ # install.sh - Cài OpenMoneta Dev Kit vào ~/.cursor/
3
+ # STRICT MODE: overwrite hoàn toàn các config (templates/skills/agents/hooks/scripts/hooks.json).
4
+ # An toàn: backup config cũ vào ~/.cursor/.backup-YYYYMMDD-HHMMSS/ trước khi overwrite.
5
+ #
6
+ # Usage:
7
+ # bash install.sh # Cài bình thường (interactive confirm)
8
+ # bash install.sh --yes # Cài không hỏi xác nhận (cho CI/auto)
9
+ # bash install.sh --no-backup # Skip backup (không khuyến nghị)
10
+
11
+ set -euo pipefail
12
+
13
+ AUTO_YES=0
14
+ DO_BACKUP=1
15
+ for arg in "$@"; do
16
+ case "$arg" in
17
+ --yes|-y) AUTO_YES=1 ;;
18
+ --no-backup) DO_BACKUP=0 ;;
19
+ --help|-h)
20
+ grep '^#' "$0" | sed 's/^# \?//' | head -10
21
+ exit 0
22
+ ;;
23
+ esac
24
+ done
25
+
26
+ REPO_DIR="$(cd "$(dirname "$0")" && pwd)"
27
+ CURSOR_DIR="$HOME/.cursor"
28
+ TIMESTAMP=$(date +%Y%m%d-%H%M%S)
29
+ BACKUP_DIR="$CURSOR_DIR/.backup-$TIMESTAMP"
30
+
31
+ echo "==> OpenMoneta Dev Kit Installer"
32
+ echo " Source: $REPO_DIR"
33
+ echo " Target: $CURSOR_DIR"
34
+ echo ""
35
+
36
+ if [[ ! -f "$REPO_DIR/VERSION" ]]; then
37
+ echo "[!] Không phải repo OpenMoneta Dev Kit (thiếu VERSION). Abort." >&2
38
+ exit 1
39
+ fi
40
+ NEW_VERSION=$(cat "$REPO_DIR/VERSION")
41
+
42
+ case "$(uname -s)" in
43
+ Darwin*|Linux*) ;;
44
+ *)
45
+ echo "[!] OS $(uname -s) không hỗ trợ bởi install.sh. Dùng install.ps1 cho Windows." >&2
46
+ exit 1
47
+ ;;
48
+ esac
49
+
50
+ MISSING_DEPS=()
51
+ for cmd in bash cp mkdir rm; do
52
+ command -v "$cmd" >/dev/null 2>&1 || MISSING_DEPS+=("$cmd")
53
+ done
54
+ if ! command -v jq >/dev/null 2>&1; then
55
+ echo "[WARNING] 'jq' không có trên PATH. Hooks vẫn chạy nhưng nên cài jq để có error message tốt hơn:"
56
+ echo " macOS: brew install jq"
57
+ echo " Ubuntu/Debian: sudo apt install jq"
58
+ echo ""
59
+ fi
60
+ if [[ ${#MISSING_DEPS[@]} -gt 0 ]]; then
61
+ echo "[!] Thiếu dependencies: ${MISSING_DEPS[*]}" >&2
62
+ exit 1
63
+ fi
64
+
65
+ # === Migration từ tên cũ "Cursor Team Developer" (v1.0.0) ===
66
+ LEGACY_VERSION_FILE="$CURSOR_DIR/.cursor-team-dev-version"
67
+ LEGACY_REPO_FILE="$CURSOR_DIR/.cursor-team-dev-repo"
68
+ LEGACY_INSTALL_FILE="$CURSOR_DIR/.cursor-team-dev-installed-at"
69
+ LEGACY_CHECK_FILE="$CURSOR_DIR/.cursor-team-dev-update-check"
70
+
71
+ NEW_VERSION_FILE="$CURSOR_DIR/.openmoneta-version"
72
+ NEW_REPO_FILE="$CURSOR_DIR/.openmoneta-repo"
73
+ NEW_INSTALL_FILE="$CURSOR_DIR/.openmoneta-installed-at"
74
+ NEW_CHECK_FILE="$CURSOR_DIR/.openmoneta-update-check"
75
+
76
+ if [[ -f "$LEGACY_VERSION_FILE" && ! -f "$NEW_VERSION_FILE" ]]; then
77
+ echo "==> Phát hiện cài đặt cũ 'Cursor Team Developer'. Migration sang 'OpenMoneta Dev Kit'..."
78
+ [[ -f "$LEGACY_VERSION_FILE" ]] && mv "$LEGACY_VERSION_FILE" "$NEW_VERSION_FILE" 2>/dev/null || true
79
+ [[ -f "$LEGACY_REPO_FILE" ]] && mv "$LEGACY_REPO_FILE" "$NEW_REPO_FILE" 2>/dev/null || true
80
+ [[ -f "$LEGACY_INSTALL_FILE" ]] && mv "$LEGACY_INSTALL_FILE" "$NEW_INSTALL_FILE" 2>/dev/null || true
81
+ [[ -f "$LEGACY_CHECK_FILE" ]] && rm -f "$LEGACY_CHECK_FILE"
82
+ echo " + Migration tracking files xong."
83
+ fi
84
+
85
+ EXISTING_VERSION=""
86
+ if [[ -f "$NEW_VERSION_FILE" ]]; then
87
+ EXISTING_VERSION=$(cat "$NEW_VERSION_FILE" 2>/dev/null || echo "unknown")
88
+ fi
89
+
90
+ if [[ -n "$EXISTING_VERSION" ]]; then
91
+ echo "Phát hiện cài đặt hiện tại: v$EXISTING_VERSION → sẽ ghi đè bằng v$NEW_VERSION"
92
+ else
93
+ echo "Cài đặt mới: v$NEW_VERSION"
94
+ fi
95
+
96
+ if [[ -d "$CURSOR_DIR" && $DO_BACKUP -eq 1 ]]; then
97
+ echo "Backup config cũ vào: $BACKUP_DIR"
98
+ fi
99
+
100
+ if [[ $AUTO_YES -eq 0 ]]; then
101
+ read -r -p "Tiếp tục? [y/N] " ans
102
+ if [[ "$ans" != "y" && "$ans" != "Y" ]]; then
103
+ echo "Hủy."
104
+ exit 0
105
+ fi
106
+ fi
107
+
108
+ mkdir -p "$CURSOR_DIR"
109
+ if [[ $DO_BACKUP -eq 1 ]]; then
110
+ echo ""
111
+ echo "==> Backup config hiện tại..."
112
+ mkdir -p "$BACKUP_DIR"
113
+ for item in templates skills agents hooks scripts hooks.json .openmoneta-version; do
114
+ SRC="$CURSOR_DIR/$item"
115
+ if [[ -e "$SRC" ]]; then
116
+ cp -R "$SRC" "$BACKUP_DIR/" 2>/dev/null || true
117
+ echo " + $item"
118
+ fi
119
+ done
120
+ if [[ -z "$(ls -A "$BACKUP_DIR" 2>/dev/null)" ]]; then
121
+ rmdir "$BACKUP_DIR" 2>/dev/null || true
122
+ echo " (không có gì để backup)"
123
+ fi
124
+ fi
125
+
126
+ echo ""
127
+ echo "==> Cài đặt config mới..."
128
+ for dir in templates skills agents hooks scripts; do
129
+ TARGET="$CURSOR_DIR/$dir"
130
+ if [[ -d "$TARGET" ]]; then
131
+ rm -rf "$TARGET"
132
+ fi
133
+ cp -R "$REPO_DIR/$dir" "$TARGET"
134
+ echo " + $dir/ (overwrite)"
135
+ done
136
+
137
+ cp "$REPO_DIR/hooks.json" "$CURSOR_DIR/hooks.json"
138
+ echo " + hooks.json"
139
+
140
+ echo ""
141
+ echo "==> Set executable permissions..."
142
+ chmod +x "$CURSOR_DIR/hooks/"*.sh 2>/dev/null || true
143
+ chmod +x "$CURSOR_DIR/scripts/"*.sh 2>/dev/null || true
144
+ chmod +x "$CURSOR_DIR/skills/automated-testing/scripts/"*.sh 2>/dev/null || true
145
+
146
+ echo "$NEW_VERSION" > "$NEW_VERSION_FILE"
147
+ echo "$REPO_DIR" > "$NEW_REPO_FILE"
148
+ date -Iseconds > "$NEW_INSTALL_FILE"
149
+ rm -f "$NEW_CHECK_FILE" 2>/dev/null || true
150
+
151
+ echo ""
152
+ echo "================================================"
153
+ echo "✅ Cài đặt thành công OpenMoneta Dev Kit v$NEW_VERSION"
154
+ echo "================================================"
155
+ echo ""
156
+ echo "Đã cài vào: $CURSOR_DIR/"
157
+ if [[ $DO_BACKUP -eq 1 && -d "$BACKUP_DIR" ]]; then
158
+ echo "Backup tại: $BACKUP_DIR/"
159
+ fi
160
+ echo ""
161
+ echo "Bước tiếp theo:"
162
+ echo " 1. Restart Cursor để hooks.json được load."
163
+ echo " 2. Mở chat mới - quy trình 6 bước (Adaptive Planning, B6 conditional, Lean Mode v$NEW_VERSION) sẽ tự inject."
164
+ echo " 3. Áp dụng cho project: bash ~/.cursor/scripts/init-project.sh /path/to/project"
165
+ echo ""
166
+ echo "Tài liệu chi tiết: $REPO_DIR/docs/INDEX.md"
167
+ echo ""
168
+ echo "Update sau này:"
169
+ echo " bash $REPO_DIR/update.sh"
170
+ echo ""
171
+ echo "Uninstall:"
172
+ echo " bash $REPO_DIR/uninstall.sh"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmoneta-dev-kit",
3
- "version": "1.9.0",
3
+ "version": "1.9.2",
4
4
  "description": "OpenMoneta Dev Kit — Biến Cursor IDE / OpenCode thành team developer hoàn chỉnh với quy trình 6 bước, adaptive planning, hooks enforcement, và token-aware doc routing",
5
5
  "keywords": [
6
6
  "cursor",
@@ -29,7 +29,16 @@
29
29
  "hooks/",
30
30
  "scripts/",
31
31
  "opencode/",
32
- "hooks.json"
32
+ "install.sh",
33
+ "install-opencode.sh",
34
+ "install.ps1",
35
+ "install-opencode.ps1",
36
+ "uninstall.sh",
37
+ "uninstall.ps1",
38
+ "update.sh",
39
+ "update.ps1",
40
+ "hooks.json",
41
+ "VERSION"
33
42
  ],
34
43
  "engines": {
35
44
  "node": ">=16"
@@ -94,6 +94,12 @@ backup_before_sync() {
94
94
  BACKUPS+=("$dst -> $SYNC_BACKUP_DIR/$safe_name")
95
95
  }
96
96
 
97
+ render_template() {
98
+ local src="$1"
99
+ local dst="$2"
100
+ awk -v ver="$KIT_VERSION" '{ gsub(/\{\{VERSION\}\}/, ver); print }' "$src" > "$dst"
101
+ }
102
+
97
103
  extract_block() {
98
104
  local src="$1"
99
105
  local block="$2"
@@ -201,7 +207,7 @@ sync_agents_md() {
201
207
  local dst="AGENTS.md"
202
208
 
203
209
  if [[ ! -f "$dst" ]]; then
204
- cp "$src" "$dst"
210
+ render_template "$src" "$dst"
205
211
  CREATED+=("file: $dst")
206
212
  return
207
213
  fi
@@ -209,7 +215,7 @@ sync_agents_md() {
209
215
  local rendered override
210
216
  rendered=$(mktemp)
211
217
  override=$(mktemp)
212
- cp "$src" "$rendered"
218
+ render_template "$src" "$rendered"
213
219
 
214
220
  if ! extract_block "$dst" "PROJECT OVERRIDE" "$override"; then
215
221
  {
@@ -238,14 +244,14 @@ sync_docs_index() {
238
244
  local dst="docs/INDEX.md"
239
245
 
240
246
  if [[ ! -f "$dst" ]]; then
241
- cp "$src" "$dst"
247
+ render_template "$src" "$dst"
242
248
  CREATED+=("file: $dst")
243
249
  return
244
250
  fi
245
251
 
246
252
  local rendered content
247
253
  rendered=$(mktemp)
248
- cp "$src" "$rendered"
254
+ render_template "$src" "$rendered"
249
255
 
250
256
  content=$(mktemp)
251
257
  if extract_block "$dst" "PROJECT DOC STRUCTURE" "$content" || extract_section_body "$dst" "## Cấu trúc tài liệu" "$content"; then
@@ -287,14 +293,14 @@ sync_plans_index() {
287
293
  local dst="plans/INDEX.md"
288
294
 
289
295
  if [[ ! -f "$dst" ]]; then
290
- cp "$src" "$dst"
296
+ render_template "$src" "$dst"
291
297
  CREATED+=("file: $dst")
292
298
  return
293
299
  fi
294
300
 
295
301
  local rendered content
296
302
  rendered=$(mktemp)
297
- cp "$src" "$rendered"
303
+ render_template "$src" "$rendered"
298
304
 
299
305
  content=$(mktemp)
300
306
  if extract_block "$dst" "ACTIVE PLANS" "$content" || extract_section_body "$dst" "## Active (đang triển khai)" "$content"; then
package/src/cli.js CHANGED
@@ -38,9 +38,9 @@ OpenMoneta Dev Kit v${v}
38
38
  ──────────────────────────────────────────────
39
39
  Biến Cursor IDE / OpenCode thành team developer hoàn chỉnh.
40
40
 
41
- openmoneta install Cài vào Cursor (~/.cursor/)
42
- openmoneta install --opencode Cài vào OpenCode (~/.config/opencode/)
43
- openmoneta install --yes Cài không hỏi xác nhận
41
+ openmoneta install Cài vào Cursor + OpenCode (mặc định)
42
+ openmoneta install --cursor Chỉ cài Cursor
43
+ openmoneta install --opencode Chỉ cài OpenCode
44
44
 
45
45
  openmoneta init Khởi tạo project (tạo AGENTS.md, docs/INDEX.md, plans/INDEX.md)
46
46
  openmoneta init --opencode Init cho OpenCode
@@ -1,50 +1,50 @@
1
1
  const { execSync } = require("node:child_process")
2
2
  const path = require("node:path")
3
- const { getPkgRoot, CURSOR_DIR, OPENCODE_DIR, isInstalled, REPO_DIR } = require("../lib/paths")
3
+ const { getPkgRoot } = require("../lib/paths")
4
4
  const { getLocalVersion } = require("../lib/version")
5
5
 
6
6
  async function run(args) {
7
- const isOpenCode = args.includes("--opencode")
8
7
  const autoYes = args.includes("--yes") || args.includes("-y")
9
- const target = isOpenCode ? "opencode" : "cursor"
8
+ const cursorOnly = args.includes("--cursor")
9
+ const opencodeOnly = args.includes("--opencode")
10
+ const both = !cursorOnly && !opencodeOnly
10
11
 
11
12
  const v = getLocalVersion() || "unknown"
12
- const targetDir = isOpenCode ? OPENCODE_DIR : CURSOR_DIR
13
- const targetLabel = isOpenCode ? "OpenCode" : "Cursor"
13
+ const pkgRoot = getPkgRoot()
14
14
 
15
- console.log(`\n 🔧 Cài OpenMoneta Dev Kit v${v} cho ${targetLabel}`)
16
- console.log(` Target: ${targetDir}`)
15
+ if (both) {
16
+ console.log(`\n 🔧 Cài OpenMoneta Dev Kit v${v} cho Cursor + OpenCode`)
17
+ } else if (cursorOnly) {
18
+ console.log(`\n 🔧 Cài OpenMoneta Dev Kit v${v} cho Cursor`)
19
+ } else {
20
+ console.log(`\n 🔧 Cài OpenMoneta Dev Kit v${v} cho OpenCode`)
21
+ }
17
22
 
18
- if (isInstalled(target) && !autoYes) {
19
- const readline = require("node:readline")
20
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout })
21
- const answer = await new Promise((resolve) => {
22
- rl.question(`\n ${targetLabel} đã được cài. Ghi đè? [y/N] `, resolve)
23
- })
24
- rl.close()
25
- if (answer.toLowerCase() !== "y") {
26
- console.log(" Hủy.")
27
- return
23
+ // Cursor install
24
+ if (both || cursorOnly) {
25
+ try {
26
+ const cmd = `bash "${path.join(pkgRoot, "install.sh")}" --yes`
27
+ console.log(`\n Cursor...`)
28
+ execSync(cmd, { stdio: "inherit", cwd: pkgRoot })
29
+ console.log(` ✅ Cursor done.`)
30
+ } catch (err) {
31
+ console.error(` ❌ Cursor failed: ${err.message}`)
28
32
  }
29
33
  }
30
34
 
31
- const pkgRoot = getPkgRoot()
32
-
33
- if (isOpenCode) {
34
- console.log(`\n Not yet implemented: use bash install-opencode.sh for now.`)
35
- console.log(` bash ${path.join(pkgRoot, "install-opencode.sh")}${autoYes ? " --yes" : ""}`)
36
- return
35
+ // OpenCode install
36
+ if (both || opencodeOnly) {
37
+ try {
38
+ const cmd = `bash "${path.join(pkgRoot, "install-opencode.sh")}" --yes`
39
+ console.log(`\n ▶ OpenCode...`)
40
+ execSync(cmd, { stdio: "inherit", cwd: pkgRoot })
41
+ console.log(` ✅ OpenCode done.`)
42
+ } catch (err) {
43
+ console.error(` ❌ OpenCode failed: ${err.message}`)
44
+ }
37
45
  }
38
46
 
39
- // Call install.sh from package root
40
- try {
41
- const cmd = `bash "${path.join(pkgRoot, "install.sh")}"${autoYes ? " --yes" : ""}`
42
- console.log(`\n Running: ${cmd}`)
43
- execSync(cmd, { stdio: "inherit", cwd: pkgRoot })
44
- } catch (err) {
45
- console.error(`\n ❌ Cài đặt thất bại: ${err.message}`)
46
- process.exit(1)
47
- }
47
+ console.log(`\n 🎉 Hoàn tất. Restart Cursor/OpenCode để áp dụng.`)
48
48
  }
49
49
 
50
50
  module.exports = { run }
@@ -1,4 +1,4 @@
1
- # AGENTS.md — Quy trình chuẩn (OpenMoneta Dev Kit v1.7.0+)
1
+ # AGENTS.md — Quy trình chuẩn (OpenMoneta Dev Kit v{{VERSION}})
2
2
 
3
3
  > File này được tạo từ `~/.cursor/templates/AGENTS.md.tpl`. Chạy `bash ~/.cursor/scripts/init-project.sh .` để re-sync (idempotent, giữ phần `<!-- BEGIN PROJECT OVERRIDE -->`).
4
4
 
@@ -1,3 +1,4 @@
1
+ <!-- KIT_VERSION: v{{VERSION}} -->
1
2
  # Docs Index
2
3
 
3
4
  > **Đây là điểm vào duy nhất cho AI khi mở dự án.** Hook `enforce-docs-first` (~/.cursor/hooks/) sẽ chặn `Read/Glob/Grep` trên `apps/`, `packages/`, `src/`, ... cho đến khi AI đã Read file này. Tiết kiệm 70-90% token bằng cách dùng bảng "Token Routing" để đến thẳng module liên quan.
@@ -1,3 +1,4 @@
1
+ <!-- KIT_VERSION: v{{VERSION}} -->
1
2
  # Plans Index
2
3
 
3
4
  > AI cập nhật bảng này mỗi khi tạo/hoàn thành plan. Từ v1.7.0, task nhỏ có thể không cần plan; task lớn/rủi ro tạo plan `Draft`, user review, rồi mới `In Progress`. Plan Done được auto-archive sang `plans/archive/` để giảm noise khi AI scan plans/ folder.
package/uninstall.ps1 ADDED
@@ -0,0 +1,86 @@
1
+ # uninstall.ps1 - Gỡ OpenMoneta Dev Kit khỏi ~/.cursor/ (Windows).
2
+
3
+ [CmdletBinding()]
4
+ param(
5
+ [switch]$Yes,
6
+ [switch]$Purge
7
+ )
8
+
9
+ $ErrorActionPreference = 'Stop'
10
+
11
+ $CursorDir = Join-Path $env:USERPROFILE '.cursor'
12
+
13
+ Write-Host "==> OpenMoneta Dev Kit Uninstaller (Windows)"
14
+ Write-Host " Target: $CursorDir"
15
+ Write-Host ""
16
+
17
+ $Restore = -not $Purge
18
+ $LatestBackup = $null
19
+
20
+ if ($Restore) {
21
+ $Backups = Get-ChildItem -Path $CursorDir -Directory -Filter '.backup-*' -ErrorAction SilentlyContinue | Sort-Object Name -Descending
22
+ if ($Backups) {
23
+ $LatestBackup = $Backups[0].FullName
24
+ Write-Host "Backup mới nhất: $LatestBackup"
25
+ Write-Host "Sẽ restore config cũ từ backup này."
26
+ } else {
27
+ Write-Host "[WARNING] Không tìm thấy backup. Sẽ chỉ XÓA config (không restore)." -ForegroundColor Yellow
28
+ $Restore = $false
29
+ }
30
+ } else {
31
+ Write-Host "Sẽ XÓA hoàn toàn các file OpenMoneta Dev Kit."
32
+ }
33
+
34
+ Write-Host ""
35
+ Write-Host "Sẽ xóa:"
36
+ $Items = @(
37
+ 'templates', 'skills', 'agents', 'hooks', 'scripts', 'hooks.json',
38
+ '.openmoneta-version', '.openmoneta-repo', '.openmoneta-installed-at', '.openmoneta-update-check',
39
+ '.cursor-team-dev-version', '.cursor-team-dev-repo', '.cursor-team-dev-installed-at', '.cursor-team-dev-update-check'
40
+ )
41
+ foreach ($item in $Items) {
42
+ $p = Join-Path $CursorDir $item
43
+ if (Test-Path $p) {
44
+ Write-Host " - $p"
45
+ }
46
+ }
47
+
48
+ if (-not $Yes) {
49
+ Write-Host ""
50
+ $ans = Read-Host "Tiếp tục? [y/N]"
51
+ if ($ans -notin @('y', 'Y', 'yes', 'YES')) {
52
+ Write-Host "Hủy."
53
+ exit 0
54
+ }
55
+ }
56
+
57
+ Write-Host ""
58
+ Write-Host "==> Xóa config..."
59
+ foreach ($item in $Items) {
60
+ $p = Join-Path $CursorDir $item
61
+ if (Test-Path $p) {
62
+ Remove-Item $p -Recurse -Force
63
+ Write-Host " - $item"
64
+ }
65
+ }
66
+
67
+ if ($Restore -and $LatestBackup -and (Test-Path $LatestBackup)) {
68
+ Write-Host ""
69
+ Write-Host "==> Restore từ backup..."
70
+ foreach ($item in @('templates', 'skills', 'agents', 'hooks', 'scripts', 'hooks.json', '.openmoneta-version', '.cursor-team-dev-version')) {
71
+ $src = Join-Path $LatestBackup $item
72
+ if (Test-Path $src) {
73
+ Copy-Item -Path $src -Destination $CursorDir -Recurse -Force
74
+ Write-Host " + $item"
75
+ }
76
+ }
77
+ Write-Host ""
78
+ Write-Host "Restored từ $LatestBackup" -ForegroundColor Green
79
+ Write-Host "Backup folder vẫn còn ở $LatestBackup, xóa thủ công nếu muốn."
80
+ } else {
81
+ Write-Host ""
82
+ Write-Host "Đã uninstall." -ForegroundColor Green
83
+ }
84
+
85
+ Write-Host ""
86
+ Write-Host "Restart Cursor để áp dụng."
package/uninstall.sh ADDED
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env bash
2
+ # uninstall.sh - Gỡ OpenMoneta Dev Kit khỏi ~/.cursor/.
3
+ # Có 2 mode: restore từ backup gần nhất, hoặc xóa hoàn toàn.
4
+
5
+ set -euo pipefail
6
+
7
+ CURSOR_DIR="$HOME/.cursor"
8
+ AUTO_YES=0
9
+ RESTORE=1
10
+
11
+ for arg in "$@"; do
12
+ case "$arg" in
13
+ --yes|-y) AUTO_YES=1 ;;
14
+ --purge) RESTORE=0 ;;
15
+ --help|-h)
16
+ cat <<EOF
17
+ Usage:
18
+ bash uninstall.sh # Restore từ backup mới nhất (default)
19
+ bash uninstall.sh --purge # Xóa hoàn toàn, không restore
20
+ bash uninstall.sh --yes # Skip confirm
21
+ EOF
22
+ exit 0
23
+ ;;
24
+ esac
25
+ done
26
+
27
+ echo "==> OpenMoneta Dev Kit Uninstaller"
28
+ echo " Target: $CURSOR_DIR"
29
+ echo ""
30
+
31
+ LATEST_BACKUP=""
32
+ if [[ $RESTORE -eq 1 ]]; then
33
+ LATEST_BACKUP=$(ls -1d "$CURSOR_DIR"/.backup-* 2>/dev/null | sort -r | head -1 || true)
34
+ if [[ -z "$LATEST_BACKUP" ]]; then
35
+ echo "[WARNING] Không tìm thấy backup. Sẽ chỉ XÓA config (không restore)."
36
+ RESTORE=0
37
+ else
38
+ echo "Backup mới nhất: $LATEST_BACKUP"
39
+ echo "Sẽ restore config cũ từ backup này."
40
+ fi
41
+ else
42
+ echo "Sẽ XÓA hoàn toàn các file OpenMoneta Dev Kit."
43
+ fi
44
+
45
+ echo ""
46
+ echo "Sẽ xóa:"
47
+ ITEMS=(templates skills agents hooks scripts hooks.json
48
+ .openmoneta-version .openmoneta-repo .openmoneta-installed-at .openmoneta-update-check
49
+ .cursor-team-dev-version .cursor-team-dev-repo .cursor-team-dev-installed-at .cursor-team-dev-update-check)
50
+ for item in "${ITEMS[@]}"; do
51
+ if [[ -e "$CURSOR_DIR/$item" ]]; then
52
+ echo " - $CURSOR_DIR/$item"
53
+ fi
54
+ done
55
+
56
+ if [[ $AUTO_YES -eq 0 ]]; then
57
+ echo ""
58
+ read -r -p "Tiếp tục? [y/N] " ans
59
+ if [[ "$ans" != "y" && "$ans" != "Y" ]]; then
60
+ echo "Hủy."
61
+ exit 0
62
+ fi
63
+ fi
64
+
65
+ echo ""
66
+ echo "==> Xóa config..."
67
+ for item in "${ITEMS[@]}"; do
68
+ if [[ -e "$CURSOR_DIR/$item" ]]; then
69
+ rm -rf "$CURSOR_DIR/$item"
70
+ echo " - $item"
71
+ fi
72
+ done
73
+
74
+ if [[ $RESTORE -eq 1 && -d "$LATEST_BACKUP" ]]; then
75
+ echo ""
76
+ echo "==> Restore từ backup..."
77
+ for item in templates skills agents hooks scripts hooks.json .openmoneta-version .cursor-team-dev-version; do
78
+ SRC="$LATEST_BACKUP/$item"
79
+ if [[ -e "$SRC" ]]; then
80
+ cp -R "$SRC" "$CURSOR_DIR/"
81
+ echo " + $item"
82
+ fi
83
+ done
84
+ echo ""
85
+ echo "✅ Restored từ $LATEST_BACKUP"
86
+ echo "Backup folder vẫn còn ở $LATEST_BACKUP, xóa thủ công nếu muốn."
87
+ else
88
+ echo ""
89
+ echo "✅ Đã uninstall."
90
+ fi
91
+
92
+ echo ""
93
+ echo "Restart Cursor để áp dụng."