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/README.md +13 -34
- package/VERSION +1 -0
- package/install-opencode.ps1 +192 -0
- package/install-opencode.sh +168 -0
- package/install.ps1 +162 -0
- package/install.sh +172 -0
- package/package.json +11 -2
- package/scripts/init-project.sh +12 -6
- package/src/cli.js +3 -3
- package/src/commands/install.js +32 -32
- package/templates/AGENTS.md.tpl +1 -1
- package/templates/docs-INDEX.md.tpl +1 -0
- package/templates/plans-INDEX.md.tpl +1 -0
- package/uninstall.ps1 +86 -0
- package/uninstall.sh +93 -0
- package/update.ps1 +240 -0
- package/update.sh +265 -0
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.
|
|
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
|
-
"
|
|
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"
|
package/scripts/init-project.sh
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
42
|
-
openmoneta install --
|
|
43
|
-
openmoneta install --
|
|
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
|
package/src/commands/install.js
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
1
|
const { execSync } = require("node:child_process")
|
|
2
2
|
const path = require("node:path")
|
|
3
|
-
const { getPkgRoot
|
|
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
|
|
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
|
|
13
|
-
const targetLabel = isOpenCode ? "OpenCode" : "Cursor"
|
|
13
|
+
const pkgRoot = getPkgRoot()
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
console.
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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 }
|
package/templates/AGENTS.md.tpl
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# AGENTS.md — Quy trình chuẩn (OpenMoneta Dev Kit
|
|
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."
|