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 ADDED
@@ -0,0 +1,3 @@
1
+ .projects/
2
+ projects/
3
+ node_modules/
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
@@ -0,0 +1,9 @@
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
+
7
+ cd "$WORKSPACE"
8
+ echo "🏠 Về workspace: $WORKSPACE"
9
+ exec "${SHELL:-bash}"
@@ -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
@@ -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"
@@ -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
+ }