mb-workspace 1.0.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/.gitignore +3 -0
- package/README.md +62 -0
- package/bin/mb-workspace.js +36 -0
- package/install.ps1 +29 -0
- package/install.sh +67 -0
- package/mb-tools/_mb-common.sh +31 -0
- package/mb-tools/mb +44 -0
- package/mb-tools/mb-home +9 -0
- package/mb-tools/mb-list +23 -0
- package/mb-tools/mb-save +18 -0
- package/mb-tools/mb-start +13 -0
- package/mb-tools/mb-submit +16 -0
- package/mb-tools/mb-task +24 -0
- package/mb-tools/mb-ui +78 -0
- package/package.json +23 -0
package/.gitignore
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# MB Workspace
|
|
2
|
+
|
|
3
|
+
One-command installer for MB Workspace, optimized for designer + developer collaboration with an AI-first workflow.
|
|
4
|
+
|
|
5
|
+
## Quick install
|
|
6
|
+
|
|
7
|
+
### WSL / Linux / macOS
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx mb-workspace
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Windows PowerShell
|
|
14
|
+
|
|
15
|
+
```powershell
|
|
16
|
+
npx mb-workspace
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
After install:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
mb-ui
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Publish checklist
|
|
26
|
+
|
|
27
|
+
1. Replace every `<YOUR_USER>` and `<YOUR_REPO>` placeholder in:
|
|
28
|
+
- `install.sh`
|
|
29
|
+
- `install.ps1`
|
|
30
|
+
- `bin/mb-workspace.js`
|
|
31
|
+
2. Push this repo to GitHub as a public repository.
|
|
32
|
+
3. Login to npm:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm login
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
4. Publish:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm publish
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If the package name `mb-workspace` is already taken, change the `name` field in `package.json` and publish with a scoped name like `@yourname/mb-workspace`.
|
|
45
|
+
|
|
46
|
+
## What the installer does
|
|
47
|
+
|
|
48
|
+
- Clones or updates the MB Workspace repo into `~/.mb-workspace`
|
|
49
|
+
- Adds `mb-tools` to PATH
|
|
50
|
+
- Sets `MB_WORKSPACE_HOME`
|
|
51
|
+
- Creates `projects/` and `.projects/`
|
|
52
|
+
|
|
53
|
+
## Main commands
|
|
54
|
+
|
|
55
|
+
- `mb-ui` — open project and task menu
|
|
56
|
+
- `mb` — basic project launcher
|
|
57
|
+
- `mb-start` — show branch and working tree state
|
|
58
|
+
- `mb-task <name>` — create or switch task branch
|
|
59
|
+
- `mb-save "message"` — commit and push current work
|
|
60
|
+
- `mb-submit` — push current branch and mark it submitted
|
|
61
|
+
- `mb-list` — list task branches and submitted state
|
|
62
|
+
- `mb-home` — jump back to workspace home
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawnSync } = require('child_process');
|
|
4
|
+
|
|
5
|
+
const isWindows = process.platform === 'win32';
|
|
6
|
+
|
|
7
|
+
function run(cmd, args) {
|
|
8
|
+
const result = spawnSync(cmd, args, {
|
|
9
|
+
stdio: 'inherit',
|
|
10
|
+
shell: false,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
if (result.error) {
|
|
14
|
+
console.error('Failed to run:', cmd, result.error.message);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (typeof result.status === 'number' && result.status !== 0) {
|
|
19
|
+
process.exit(result.status);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (isWindows) {
|
|
24
|
+
run('powershell', [
|
|
25
|
+
'-NoProfile',
|
|
26
|
+
'-ExecutionPolicy',
|
|
27
|
+
'Bypass',
|
|
28
|
+
'-Command',
|
|
29
|
+
'irm https://raw.githubusercontent.com/camtm95/mb-workspace/main/install.ps1 | iex'
|
|
30
|
+
]);
|
|
31
|
+
} else {
|
|
32
|
+
run('bash', [
|
|
33
|
+
'-lc',
|
|
34
|
+
'curl -fsSL https://raw.githubusercontent.com/camtm95/mb-workspace/main/install.sh | bash'
|
|
35
|
+
]);
|
|
36
|
+
}
|
package/install.ps1
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
$RepoUrl = "https://github.com/camtm95/mb-workspace.git"
|
|
2
|
+
$InstallDir = if ($env:MB_WORKSPACE_HOME) { $env:MB_WORKSPACE_HOME } else { "$env:USERPROFILE\.mb-workspace" }
|
|
3
|
+
$BinDir = "$InstallDir\mb-tools"
|
|
4
|
+
|
|
5
|
+
Write-Host "Installing MB Workspace..."
|
|
6
|
+
|
|
7
|
+
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
|
8
|
+
Write-Host "Git is required."
|
|
9
|
+
exit 1
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (Test-Path "$InstallDir\.git") {
|
|
13
|
+
git -C $InstallDir pull --ff-only
|
|
14
|
+
} else {
|
|
15
|
+
if (Test-Path $InstallDir) { Remove-Item $InstallDir -Recurse -Force }
|
|
16
|
+
git clone $RepoUrl $InstallDir
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
New-Item -ItemType Directory -Force -Path "$InstallDir\projects" | Out-Null
|
|
20
|
+
New-Item -ItemType Directory -Force -Path "$InstallDir\.projects" | Out-Null
|
|
21
|
+
|
|
22
|
+
[Environment]::SetEnvironmentVariable("MB_WORKSPACE_HOME", $InstallDir, "User")
|
|
23
|
+
|
|
24
|
+
$currentPath = [Environment]::GetEnvironmentVariable("Path", "User")
|
|
25
|
+
if ($currentPath -notlike "*$BinDir*") {
|
|
26
|
+
[Environment]::SetEnvironmentVariable("Path", "$currentPath;$BinDir", "User")
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
Write-Host "Installed. Reopen terminal, then run: mb-ui"
|
package/install.sh
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
REPO_URL="https://github.com/camtm95/mb-workspace.git"
|
|
5
|
+
INSTALL_DIR="${MB_WORKSPACE_HOME:-$HOME/.mb-workspace}"
|
|
6
|
+
BIN_DIR="$INSTALL_DIR/mb-tools"
|
|
7
|
+
|
|
8
|
+
detect_profile() {
|
|
9
|
+
if [ -n "${ZSH_VERSION:-}" ]; then
|
|
10
|
+
echo "$HOME/.zshrc"
|
|
11
|
+
elif [ -n "${BASH_VERSION:-}" ]; then
|
|
12
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
13
|
+
echo "$HOME/.bashrc"
|
|
14
|
+
else
|
|
15
|
+
echo "$HOME/.bash_profile"
|
|
16
|
+
fi
|
|
17
|
+
else
|
|
18
|
+
echo "$HOME/.profile"
|
|
19
|
+
fi
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
PROFILE_FILE="$(detect_profile)"
|
|
23
|
+
|
|
24
|
+
echo "🚀 Installing MB Workspace..."
|
|
25
|
+
echo "📁 Install dir: $INSTALL_DIR"
|
|
26
|
+
|
|
27
|
+
command -v git >/dev/null 2>&1 || {
|
|
28
|
+
echo "❌ Git chưa được cài."
|
|
29
|
+
exit 1
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
mkdir -p "$INSTALL_DIR"
|
|
33
|
+
|
|
34
|
+
if [ -d "$INSTALL_DIR/.git" ]; then
|
|
35
|
+
echo "🔄 Existing install found, updating..."
|
|
36
|
+
git -C "$INSTALL_DIR" pull --ff-only
|
|
37
|
+
else
|
|
38
|
+
echo "📦 Cloning repository..."
|
|
39
|
+
rm -rf "$INSTALL_DIR"
|
|
40
|
+
git clone "$REPO_URL" "$INSTALL_DIR"
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
mkdir -p "$INSTALL_DIR/projects" "$INSTALL_DIR/.projects"
|
|
44
|
+
chmod +x "$BIN_DIR"/*
|
|
45
|
+
|
|
46
|
+
touch "$PROFILE_FILE"
|
|
47
|
+
|
|
48
|
+
if ! grep -q 'MB_WORKSPACE_HOME=' "$PROFILE_FILE" 2>/dev/null; then
|
|
49
|
+
{
|
|
50
|
+
echo ''
|
|
51
|
+
echo '# >>> mb-workspace >>>'
|
|
52
|
+
echo "export MB_WORKSPACE_HOME=\"$INSTALL_DIR\""
|
|
53
|
+
echo 'export PATH="$MB_WORKSPACE_HOME/mb-tools:$PATH"'
|
|
54
|
+
echo '# <<< mb-workspace <<<'
|
|
55
|
+
} >> "$PROFILE_FILE"
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
export MB_WORKSPACE_HOME="$INSTALL_DIR"
|
|
59
|
+
export PATH="$MB_WORKSPACE_HOME/mb-tools:$PATH"
|
|
60
|
+
|
|
61
|
+
echo ""
|
|
62
|
+
echo "✅ MB Workspace installed."
|
|
63
|
+
echo "👉 Run this once:"
|
|
64
|
+
echo "source \"$PROFILE_FILE\""
|
|
65
|
+
echo ""
|
|
66
|
+
echo "👉 Then run:"
|
|
67
|
+
echo "mb-ui"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
mb_script_dir() {
|
|
4
|
+
cd "$(dirname "${BASH_SOURCE[0]}")" && pwd
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
mb_workspace() {
|
|
8
|
+
local script_dir
|
|
9
|
+
script_dir="$(mb_script_dir)"
|
|
10
|
+
if [ -n "${MB_WORKSPACE_HOME:-}" ]; then
|
|
11
|
+
printf '%s\n' "$MB_WORKSPACE_HOME"
|
|
12
|
+
else
|
|
13
|
+
cd "$script_dir/.." && pwd
|
|
14
|
+
fi
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
mb_projects_dir() {
|
|
18
|
+
printf '%s/projects\n' "$(mb_workspace)"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
mb_state_dir() {
|
|
22
|
+
printf '%s/.projects\n' "$(mb_workspace)"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
mb_submitted_file() {
|
|
26
|
+
printf '%s/.mb_submitted\n' "$(mb_state_dir)"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
mb_repo_root() {
|
|
30
|
+
git rev-parse --show-toplevel 2>/dev/null
|
|
31
|
+
}
|
package/mb-tools/mb
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
WORKSPACE="${MB_WORKSPACE_HOME:-$(cd "$SCRIPT_DIR/.." && pwd)}"
|
|
6
|
+
PROJECTS_DIR="$WORKSPACE/projects"
|
|
7
|
+
|
|
8
|
+
mkdir -p "$PROJECTS_DIR"
|
|
9
|
+
|
|
10
|
+
echo "=== MB WORKSPACE ==="
|
|
11
|
+
echo "1. Mở project có sẵn"
|
|
12
|
+
echo "2. Clone project mới"
|
|
13
|
+
read -r -p "Chọn (1/2): " choice
|
|
14
|
+
|
|
15
|
+
if [ "$choice" = "1" ]; then
|
|
16
|
+
echo "Danh sách project:"
|
|
17
|
+
ls "$PROJECTS_DIR" 2>/dev/null || true
|
|
18
|
+
|
|
19
|
+
read -r -p "Nhập tên project: " project
|
|
20
|
+
|
|
21
|
+
if [ -d "$PROJECTS_DIR/$project" ]; then
|
|
22
|
+
cd "$PROJECTS_DIR/$project" || exit 1
|
|
23
|
+
echo "Đã vào project: $project"
|
|
24
|
+
exec "${SHELL:-bash}" -lc 'mb-start; exec "${SHELL:-bash}"'
|
|
25
|
+
else
|
|
26
|
+
echo "❌ Project không tồn tại"
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
elif [ "$choice" = "2" ]; then
|
|
31
|
+
read -r -p "Nhập git repo URL: " repo
|
|
32
|
+
|
|
33
|
+
name=$(basename "$repo" .git)
|
|
34
|
+
|
|
35
|
+
git clone "$repo" "$PROJECTS_DIR/$name"
|
|
36
|
+
|
|
37
|
+
cd "$PROJECTS_DIR/$name" || exit 1
|
|
38
|
+
echo "Đã clone và vào project: $name"
|
|
39
|
+
|
|
40
|
+
exec "${SHELL:-bash}" -lc 'mb-start; exec "${SHELL:-bash}"'
|
|
41
|
+
else
|
|
42
|
+
echo "❌ Lựa chọn không hợp lệ"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
package/mb-tools/mb-home
ADDED
package/mb-tools/mb-list
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
SUBMITTED_FILE="${MB_WORKSPACE_HOME:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}/.projects/.mb_submitted"
|
|
5
|
+
mkdir -p "$(dirname "$SUBMITTED_FILE")"
|
|
6
|
+
touch "$SUBMITTED_FILE"
|
|
7
|
+
|
|
8
|
+
CURRENT=$(git branch --show-current)
|
|
9
|
+
|
|
10
|
+
echo "=== TASK LIST ==="
|
|
11
|
+
|
|
12
|
+
git branch --format='%(refname:short)' | grep -vE '^(master|main)$' | while IFS= read -r branch; do
|
|
13
|
+
MARK=""
|
|
14
|
+
if grep -Fxq "$branch" "$SUBMITTED_FILE"; then
|
|
15
|
+
MARK="(submitted)"
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
if [ "$branch" = "$CURRENT" ]; then
|
|
19
|
+
echo "* $branch $MARK (đang làm)"
|
|
20
|
+
else
|
|
21
|
+
echo " $branch $MARK"
|
|
22
|
+
fi
|
|
23
|
+
done
|
package/mb-tools/mb-save
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
MSG=${1:-}
|
|
5
|
+
|
|
6
|
+
if [ -z "$MSG" ]; then
|
|
7
|
+
echo "❌ Nhập message commit"
|
|
8
|
+
exit 1
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
git add .
|
|
12
|
+
git commit -m "$MSG"
|
|
13
|
+
|
|
14
|
+
BRANCH=$(git branch --show-current)
|
|
15
|
+
|
|
16
|
+
git push origin "$BRANCH"
|
|
17
|
+
|
|
18
|
+
echo "💾 Đã lưu: $MSG"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
BRANCH=$(git branch --show-current)
|
|
5
|
+
|
|
6
|
+
echo "=== MB START ==="
|
|
7
|
+
echo "Branch hiện tại: $BRANCH"
|
|
8
|
+
|
|
9
|
+
if ! git diff --quiet || ! git diff --cached --quiet; then
|
|
10
|
+
echo "⚠️ Bạn đang có thay đổi chưa commit"
|
|
11
|
+
else
|
|
12
|
+
echo "✅ Working tree sạch"
|
|
13
|
+
fi
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
BRANCH=$(git branch --show-current)
|
|
5
|
+
WORKSPACE="${MB_WORKSPACE_HOME:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
|
|
6
|
+
SUBMITTED_FILE="$WORKSPACE/.projects/.mb_submitted"
|
|
7
|
+
|
|
8
|
+
mkdir -p "$(dirname "$SUBMITTED_FILE")"
|
|
9
|
+
touch "$SUBMITTED_FILE"
|
|
10
|
+
|
|
11
|
+
git push origin "$BRANCH"
|
|
12
|
+
|
|
13
|
+
grep -Fxq "$BRANCH" "$SUBMITTED_FILE" || echo "$BRANCH" >> "$SUBMITTED_FILE"
|
|
14
|
+
|
|
15
|
+
echo "🚀 Đã push branch: $BRANCH"
|
|
16
|
+
echo "👉 Tạo Merge Request tại GitLab/GitHub: origin/$BRANCH → master hoặc main"
|
package/mb-tools/mb-task
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
TASK=${1:-}
|
|
5
|
+
|
|
6
|
+
if [ -z "$TASK" ]; then
|
|
7
|
+
echo "❌ Thiếu tên task"
|
|
8
|
+
exit 1
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
if ! git diff --quiet || ! git diff --cached --quiet; then
|
|
12
|
+
echo "⚠️ Bạn có thay đổi chưa commit. Hãy mb-save trước."
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
git fetch
|
|
17
|
+
|
|
18
|
+
if git show-ref --verify --quiet "refs/heads/$TASK"; then
|
|
19
|
+
git checkout "$TASK"
|
|
20
|
+
else
|
|
21
|
+
git checkout -b "$TASK"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
echo "🚀 Đang làm task: $TASK"
|
package/mb-tools/mb-ui
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
WORKSPACE="${MB_WORKSPACE_HOME:-$(cd "$SCRIPT_DIR/.." && pwd)}"
|
|
6
|
+
PROJECTS_DIR="$WORKSPACE/projects"
|
|
7
|
+
SUBMITTED_FILE="$WORKSPACE/.projects/.mb_submitted"
|
|
8
|
+
|
|
9
|
+
mkdir -p "$PROJECTS_DIR" "$(dirname "$SUBMITTED_FILE")"
|
|
10
|
+
touch "$SUBMITTED_FILE"
|
|
11
|
+
|
|
12
|
+
GREEN="\033[1;32m"
|
|
13
|
+
YELLOW="\033[1;33m"
|
|
14
|
+
GRAY="\033[0;37m"
|
|
15
|
+
CYAN="\033[1;36m"
|
|
16
|
+
RESET="\033[0m"
|
|
17
|
+
|
|
18
|
+
echo -e "${CYAN}┌──────────── MB WORKSPACE ────────────┐${RESET}"
|
|
19
|
+
mapfile -t projects < <(find "$PROJECTS_DIR" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort)
|
|
20
|
+
for i in "${!projects[@]}"; do
|
|
21
|
+
echo -e "│ [${i}] ${projects[$i]}"
|
|
22
|
+
done
|
|
23
|
+
echo -e "│ [C] Clone project mới"
|
|
24
|
+
echo -e "│ [Q] Thoát"
|
|
25
|
+
echo -e "${CYAN}└──────────────────────────────────────┘${RESET}"
|
|
26
|
+
read -r -p "Chọn project hoặc clone: " choice
|
|
27
|
+
|
|
28
|
+
if [[ "$choice" == "C" || "$choice" == "c" ]]; then
|
|
29
|
+
read -r -p "Nhập URL repo: " repo
|
|
30
|
+
name=$(basename "$repo" .git)
|
|
31
|
+
git clone "$repo" "$PROJECTS_DIR/$name"
|
|
32
|
+
cd "$PROJECTS_DIR/$name" || exit 1
|
|
33
|
+
echo "Đã clone và vào project: $name"
|
|
34
|
+
elif [[ "$choice" == "Q" || "$choice" == "q" ]]; then
|
|
35
|
+
exit 0
|
|
36
|
+
elif [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -lt "${#projects[@]}" ]; then
|
|
37
|
+
project=${projects[$choice]}
|
|
38
|
+
cd "$PROJECTS_DIR/$project" || exit 1
|
|
39
|
+
echo "Đã chọn project: $project"
|
|
40
|
+
else
|
|
41
|
+
echo "❌ Lựa chọn không hợp lệ"
|
|
42
|
+
exit 1
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
echo -e "\n${CYAN}┌────────── TASK MENU ──────────┐${RESET}"
|
|
46
|
+
CURRENT=$(git branch --show-current)
|
|
47
|
+
mapfile -t branches < <(git branch --format='%(refname:short)' | grep -vE '^(master|main)$')
|
|
48
|
+
|
|
49
|
+
for i in "${!branches[@]}"; do
|
|
50
|
+
task=${branches[$i]}
|
|
51
|
+
status="Pending"
|
|
52
|
+
if [ "$task" = "$CURRENT" ]; then status="Doing"; fi
|
|
53
|
+
if grep -Fxq "$task" "$SUBMITTED_FILE"; then status="Submitted"; fi
|
|
54
|
+
|
|
55
|
+
color=$GRAY
|
|
56
|
+
if [ "$status" = "Doing" ]; then color=$GREEN; fi
|
|
57
|
+
if [ "$status" = "Pending" ]; then color=$YELLOW; fi
|
|
58
|
+
|
|
59
|
+
echo -e "│ [${i}] $task (${color}${status}${RESET})"
|
|
60
|
+
done
|
|
61
|
+
echo -e "│ [N] Tạo task mới"
|
|
62
|
+
echo -e "│ [Q] Thoát"
|
|
63
|
+
echo -e "${CYAN}└──────────────────────────────┘${RESET}"
|
|
64
|
+
|
|
65
|
+
read -r -p "Chọn task: " task_choice
|
|
66
|
+
if [[ "$task_choice" =~ ^[0-9]+$ ]] && [ "$task_choice" -lt "${#branches[@]}" ]; then
|
|
67
|
+
git checkout "${branches[$task_choice]}"
|
|
68
|
+
echo "Đang làm task: ${branches[$task_choice]}"
|
|
69
|
+
elif [[ "$task_choice" == "N" || "$task_choice" == "n" ]]; then
|
|
70
|
+
read -r -p "Nhập tên task mới: " new_task
|
|
71
|
+
git checkout -b "$new_task"
|
|
72
|
+
echo "Tạo và chuyển sang task: $new_task"
|
|
73
|
+
elif [[ "$task_choice" == "Q" || "$task_choice" == "q" ]]; then
|
|
74
|
+
exit 0
|
|
75
|
+
else
|
|
76
|
+
echo "❌ Lựa chọn không hợp lệ"
|
|
77
|
+
exit 1
|
|
78
|
+
fi
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mb-workspace",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "One-command installer for MB Workspace",
|
|
5
|
+
"bin": {
|
|
6
|
+
"mb-workspace": "bin/mb-workspace.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin",
|
|
10
|
+
"install.sh",
|
|
11
|
+
"install.ps1",
|
|
12
|
+
"mb-tools",
|
|
13
|
+
"README.md",
|
|
14
|
+
".gitignore"
|
|
15
|
+
],
|
|
16
|
+
"keywords": [
|
|
17
|
+
"workspace",
|
|
18
|
+
"designer",
|
|
19
|
+
"cli",
|
|
20
|
+
"installer"
|
|
21
|
+
],
|
|
22
|
+
"license": "MIT"
|
|
23
|
+
}
|