@zairakai/js-dev-tools 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.
Files changed (69) hide show
  1. package/.editorconfig +86 -0
  2. package/.gitlab/ci/pipeline-js-app.yml +75 -0
  3. package/.gitlab/ci/pipeline-js-package.yml +360 -0
  4. package/LICENSE +21 -0
  5. package/README.md +206 -0
  6. package/config/.markdownlint.json +7 -0
  7. package/config/.markdownlintignore +5 -0
  8. package/config/.prettierignore +11 -0
  9. package/config/.stylelintignore +7 -0
  10. package/config/eslint.config.js +198 -0
  11. package/config/knip.config.js +40 -0
  12. package/config/prettier.config.js +121 -0
  13. package/config/stylelint.config.js +56 -0
  14. package/config/tsconfig.base.json +20 -0
  15. package/config/vitest.config.js +25 -0
  16. package/index.js +24 -0
  17. package/package.json +148 -0
  18. package/scripts/build.sh +58 -0
  19. package/scripts/ci-quality.sh +51 -0
  20. package/scripts/config.sh +254 -0
  21. package/scripts/doctor.sh +74 -0
  22. package/scripts/eslint-fix.sh +38 -0
  23. package/scripts/eslint.sh +49 -0
  24. package/scripts/install-bats.sh +227 -0
  25. package/scripts/install-hooks.sh +167 -0
  26. package/scripts/install-markdownlint.sh +31 -0
  27. package/scripts/install-shellcheck.sh +232 -0
  28. package/scripts/knip.sh +40 -0
  29. package/scripts/markdownlint-fix.sh +8 -0
  30. package/scripts/markdownlint.sh +84 -0
  31. package/scripts/outdated.sh +70 -0
  32. package/scripts/prettier-fix.sh +52 -0
  33. package/scripts/prettier.sh +53 -0
  34. package/scripts/setup-project.sh +816 -0
  35. package/scripts/stylelint-fix.sh +64 -0
  36. package/scripts/stylelint.sh +66 -0
  37. package/scripts/test.sh +40 -0
  38. package/scripts/typecheck.sh +41 -0
  39. package/scripts/validate-shellcheck.sh +70 -0
  40. package/stubs/githooks/commit-msg +34 -0
  41. package/stubs/githooks/pre-commit +58 -0
  42. package/stubs/githooks/pre-push +57 -0
  43. package/stubs/githooks/prepare-commit-msg +39 -0
  44. package/stubs/gitlab-ci/gitlab-ci.yml.stub +18 -0
  45. package/stubs/gitlab-ci/gitlab-pipeline-js-app.yml.stub +16 -0
  46. package/stubs/governance/CODE_OF_CONDUCT.md.stub +8 -0
  47. package/stubs/governance/CONTRIBUTING.md.stub +39 -0
  48. package/stubs/governance/SECURITY.md.stub +41 -0
  49. package/stubs/quality/eslint.config.js.stub +18 -0
  50. package/stubs/quality/knip.config.js.stub +14 -0
  51. package/stubs/style/prettier.config.js.stub +16 -0
  52. package/stubs/style/stylelint.config.js.stub +17 -0
  53. package/stubs/testing/vitest.config.js.stub +18 -0
  54. package/stubs/typescript/tsconfig.json.stub +10 -0
  55. package/tools/make/bats.mk +49 -0
  56. package/tools/make/code-style.mk +20 -0
  57. package/tools/make/core.mk +56 -0
  58. package/tools/make/help.mk +32 -0
  59. package/tools/make/knip.mk +7 -0
  60. package/tools/make/markdownlint.mk +17 -0
  61. package/tools/make/quality.mk +19 -0
  62. package/tools/make/shellcheck.mk +14 -0
  63. package/tools/make/stylelint.mk +11 -0
  64. package/tools/make/test.mk +19 -0
  65. package/tools/make/typescript.mk +10 -0
  66. package/tools/make/utils.mk +44 -0
  67. package/tools/make/variables.mk +42 -0
  68. package/tools/scripts/git-cleanup.sh +53 -0
  69. package/tools/scripts/git-update.sh +37 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Project Vitest configuration.
3
+ * Extends the @zairakai/js-dev-tools base config — customize as needed.
4
+ *
5
+ * Example of adding project-specific settings (e.g. Vue plugin, jsdom):
6
+ * import vue from '@vitejs/plugin-vue'
7
+ * export default mergeConfig(baseConfig, defineConfig({
8
+ * plugins: [vue()],
9
+ * test: {
10
+ * environment: 'jsdom',
11
+ * },
12
+ * }))
13
+ */
14
+
15
+ import { defineConfig, mergeConfig } from 'vitest/config'
16
+ import baseConfig from '@zairakai/js-dev-tools/config/vitest.config.js'
17
+
18
+ export default mergeConfig(baseConfig, defineConfig({}))
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "extends": "@zairakai/js-dev-tools/config/tsconfig.base.json",
4
+ "compilerOptions": {
5
+ "outDir": "dist",
6
+ "rootDir": "src"
7
+ },
8
+ "include": ["src/**/*"],
9
+ "exclude": ["node_modules", "dist", "build", "**/*.test.ts", "**/*.spec.ts"]
10
+ }
@@ -0,0 +1,49 @@
1
+ # BATS Testing Targets
2
+ # Shell script testing with Bash Automated Testing System
3
+
4
+ ## —— 🧪 Shell Script Testing ——
5
+ .PHONY: bats
6
+ bats:: ## Run shell script tests (BATS)
7
+ @if ! command -v bats &>/dev/null; then \
8
+ echo "❌ BATS not installed - run: make install-bats"; \
9
+ exit 1; \
10
+ fi; \
11
+ FILES=$$(find tests/bats -name "*.bats" 2>/dev/null); \
12
+ if [ -z "$$FILES" ]; then \
13
+ echo "ℹ️ No BATS tests found — skipping"; \
14
+ else \
15
+ bats $$FILES; \
16
+ fi
17
+
18
+ .PHONY: bats-unit
19
+ bats-unit:: ## Run BATS unit tests
20
+ @if ! command -v bats &>/dev/null; then \
21
+ echo "❌ BATS not installed - run: make install-bats"; \
22
+ exit 1; \
23
+ fi; \
24
+ if [ ! -d tests/bats/unit ] || [ -z "$$(find tests/bats/unit -name "*.bats" 2>/dev/null)" ]; then \
25
+ echo "ℹ️ No BATS unit tests found — skipping"; \
26
+ else \
27
+ bats tests/bats/unit/*.bats; \
28
+ fi
29
+
30
+ .PHONY: bats-integration
31
+ bats-integration:: ## Run BATS integration tests
32
+ @if ! command -v bats &>/dev/null; then \
33
+ echo "❌ BATS not installed - run: make install-bats"; \
34
+ exit 1; \
35
+ fi; \
36
+ if [ ! -d tests/bats/integration ] || [ -z "$$(find tests/bats/integration -name "*.bats" 2>/dev/null)" ]; then \
37
+ echo "ℹ️ No BATS integration tests found — skipping"; \
38
+ else \
39
+ bats tests/bats/integration/*.bats; \
40
+ fi
41
+ .PHONY: test-all
42
+ test-all:: test bats ## Run all tests (Vitest + BATS)
43
+ @echo ""
44
+ @echo "✅ All tests passed"
45
+
46
+ ##
47
+ .PHONY: install-bats
48
+ install-bats:: ## Install BATS framework
49
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/install-bats.sh
@@ -0,0 +1,20 @@
1
+ # ESLint + Prettier Code Style Targets
2
+
3
+ ## —— 🎨 Code Style ——
4
+
5
+ .PHONY: eslint
6
+ eslint: ## Check code style
7
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/eslint.sh
8
+
9
+ .PHONY: eslint-fix
10
+ eslint-fix: ## Fix code style automatically
11
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/eslint-fix.sh
12
+
13
+ ##
14
+ .PHONY: prettier
15
+ prettier: ## Check formatting
16
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/prettier.sh
17
+
18
+ .PHONY: prettier-fix
19
+ prettier-fix: ## Fix formatting automatically
20
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/prettier-fix.sh
@@ -0,0 +1,56 @@
1
+ # Core Makefile — Zairakai NPM Dev Tools
2
+ # Aggregates all modular targets for JavaScript/TypeScript/Vue projects.
3
+ #
4
+ # Usage in a consumer project (Makefile):
5
+ # DEV_TOOLS_NPM := node_modules/@zairakai/js-dev-tools
6
+ # include $(DEV_TOOLS_NPM)/tools/make/core.mk
7
+ #
8
+ # Or generate via:
9
+ # bash node_modules/@zairakai/js-dev-tools/scripts/setup-project.sh --with-makefile
10
+
11
+ # Default goal (only if not already set by the project Makefile)
12
+ ifeq ($(origin .DEFAULT_GOAL), undefined)
13
+ .DEFAULT_GOAL := help
14
+ endif
15
+
16
+ SHELL := /bin/bash
17
+
18
+ # Resolve make files directory from the current MAKEFILE_LIST entry
19
+ NPM_DIRECTORY_TOOLS_MAKE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
20
+
21
+ # Include variables first (paths, colors, project info)
22
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)variables.mk
23
+
24
+ # Include specialized make files in logical development workflow order:
25
+ # 1. Help system (discover available commands)
26
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)help.mk
27
+
28
+ # 2. Documentation linting (Markdown)
29
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)markdownlint.mk
30
+
31
+ # 3. ShellCheck validation
32
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)shellcheck.mk
33
+
34
+ # 4. Code style — ESLint + Prettier
35
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)code-style.mk
36
+
37
+ # 5. CSS/SCSS — Stylelint (optional)
38
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)stylelint.mk
39
+
40
+ # 6. Dead code detection (Knip)
41
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)knip.mk
42
+
43
+ # 7. TypeScript type checking and build
44
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)typescript.mk
45
+
46
+ # 8. Quality aggregation (combines all checks)
47
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)quality.mk
48
+
49
+ # 9. Testing (Vitest)
50
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)test.mk
51
+
52
+ # 10. BATS shell script testing
53
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)bats.mk
54
+
55
+ # 11. Utilities (git, npm)
56
+ include $(NPM_DIRECTORY_TOOLS_MAKE_DIR)utils.mk
@@ -0,0 +1,32 @@
1
+ # Help target
2
+
3
+ ## —— 📚 Help ——
4
+
5
+ .PHONY: help
6
+ help:: ## Show available commands
7
+ @echo ""
8
+ @printf "$(NPM_DIRECTORY_TOOLS_COLOR_HEADER_FG)$(NPM_DIRECTORY_TOOLS_COLOR_HEADER_BG)%*s$(NPM_DIRECTORY_TOOLS_COLOR_RESET)\n" $(NPM_DIRECTORY_TOOLS_HELP_WIDTH) ""
9
+ @printf "$(NPM_DIRECTORY_TOOLS_COLOR_HEADER_FG)$(NPM_DIRECTORY_TOOLS_COLOR_HEADER_BG) %-*s$(NPM_DIRECTORY_TOOLS_COLOR_RESET)\n" $$(($(NPM_DIRECTORY_TOOLS_HELP_WIDTH)-3)) "$(NPM_DIRECTORY_TOOLS_PROJECT_NAME) - Available Commands"
10
+ @printf "$(NPM_DIRECTORY_TOOLS_COLOR_HEADER_FG)$(NPM_DIRECTORY_TOOLS_COLOR_HEADER_BG)%*s$(NPM_DIRECTORY_TOOLS_COLOR_RESET)\n" $(NPM_DIRECTORY_TOOLS_HELP_WIDTH) ""
11
+ @echo ""
12
+ @grep -hE '(^[[:alnum:]_.-]+:.*?##.*$$)|(^##)' $(MAKEFILE_LIST) \
13
+ | awk 'BEGIN {FS=":.*?## "; color_section="$(NPM_DIRECTORY_TOOLS_COLOR_SECTION)"; color_target="$(NPM_DIRECTORY_TOOLS_COLOR_TARGET)"; color_reset="$(NPM_DIRECTORY_TOOLS_COLOR_RESET)"} \
14
+ /^##/ { \
15
+ gsub(/^##[[:space:]]*/, "", $$0); \
16
+ if ($$0 != "") { \
17
+ if (!seen_sections[$$0]++) { \
18
+ if (NR > 1) { printf "\n" } \
19
+ printf "%s%s%s\n", color_section, $$0, color_reset \
20
+ } \
21
+ } else { \
22
+ printf "\n" \
23
+ } \
24
+ next \
25
+ } \
26
+ !seen_targets[$$1]++ { printf " %s%-28s%s %s\n", color_target, $$1, color_reset, $$2 }'
27
+ @echo ""
28
+ @printf "$(NPM_DIRECTORY_TOOLS_COLOR_FOOTER_FG)$(NPM_DIRECTORY_TOOLS_COLOR_FOOTER_BG)%*s$(NPM_DIRECTORY_TOOLS_COLOR_RESET)\n" $(NPM_DIRECTORY_TOOLS_HELP_WIDTH) ""
29
+ @printf "$(NPM_DIRECTORY_TOOLS_COLOR_FOOTER_FG)$(NPM_DIRECTORY_TOOLS_COLOR_FOOTER_BG) Twitch: %-*s$(NPM_DIRECTORY_TOOLS_COLOR_RESET)\n" $$(($(NPM_DIRECTORY_TOOLS_HELP_WIDTH)-11)) "$(NPM_DIRECTORY_TOOLS_TWITCH_URL)"
30
+ @printf "$(NPM_DIRECTORY_TOOLS_COLOR_FOOTER_FG)$(NPM_DIRECTORY_TOOLS_COLOR_FOOTER_BG) GitLab: %-*s$(NPM_DIRECTORY_TOOLS_COLOR_RESET)\n" $$(($(NPM_DIRECTORY_TOOLS_HELP_WIDTH)-11)) "$(NPM_DIRECTORY_TOOLS_GITLAB_URL)"
31
+ @printf "$(NPM_DIRECTORY_TOOLS_COLOR_FOOTER_FG)$(NPM_DIRECTORY_TOOLS_COLOR_FOOTER_BG)%*s$(NPM_DIRECTORY_TOOLS_COLOR_RESET)\n" $(NPM_DIRECTORY_TOOLS_HELP_WIDTH) ""
32
+ @echo ""
@@ -0,0 +1,7 @@
1
+ # Knip Dead Code Analysis Targets
2
+ # Delegates to scripts/knip.sh
3
+
4
+ ## —— ✂️ Knip ——
5
+ .PHONY: knip
6
+ knip: ## Run dead code analysis (Knip)
7
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/knip.sh
@@ -0,0 +1,17 @@
1
+ # Markdownlint Targets
2
+ # Delegates to scripts/markdownlint.sh
3
+
4
+ ## —— 📝 Markdownlint (Documentation Linting) ——
5
+
6
+ .PHONY: markdownlint
7
+ markdownlint: ## Validate Markdown documentation style and formatting
8
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/markdownlint.sh
9
+
10
+ .PHONY: markdownlint-fix
11
+ markdownlint-fix: ## Fix Markdown documentation issues automatically
12
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/markdownlint-fix.sh
13
+
14
+ ##
15
+ .PHONY: install-markdownlint
16
+ install-markdownlint: ## Install Markdownlint
17
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/install-markdownlint.sh
@@ -0,0 +1,19 @@
1
+ # Quality Gate Targets
2
+ ## —— ✅ Quality Gates ——
3
+
4
+ .PHONY: quality
5
+ quality:: markdownlint shellcheck eslint prettier stylelint knip ## Run all quality checks
6
+ @echo "✅ All quality checks passed"
7
+
8
+ .PHONY: quality-fix
9
+ quality-fix:: eslint-fix prettier-fix stylelint-fix markdownlint-fix ## Auto-fix all fixable issues
10
+ @echo "✅ All auto-fixes applied"
11
+
12
+ .PHONY: quality-fast
13
+ quality-fast:: ## Run fast quality checks only (ESLint + Prettier + Markdownlint)
14
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/ci-quality.sh
15
+
16
+ .PHONY: ci
17
+ ci:: quality typecheck test bats ## Full CI validation (quality + typecheck + tests + BATS)
18
+ @echo ""
19
+ @echo "✅ CI validation passed"
@@ -0,0 +1,14 @@
1
+ # ShellCheck Targets
2
+ # Delegates to scripts/validate-shellcheck.sh
3
+
4
+ ## —— 🐚 ShellCheck (Shell Script Validation) ——
5
+
6
+ .PHONY: shellcheck
7
+ shellcheck: ## Validate shell scripts with ShellCheck (100% compliance required)
8
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/validate-shellcheck.sh
9
+
10
+
11
+ ##
12
+ .PHONY: install-shellcheck
13
+ install-shellcheck: ## Install shellcheck
14
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/install-shellcheck.sh
@@ -0,0 +1,11 @@
1
+ # Stylelint Targets
2
+ # Delegates to scripts/stylelint.sh
3
+
4
+ ## —— 🎨 Stylelint ——
5
+ .PHONY: stylelint
6
+ stylelint: ## Check CSS/SCSS style (Stylelint)
7
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/stylelint.sh
8
+
9
+ .PHONY: stylelint-fix
10
+ stylelint-fix: ## Fix CSS/SCSS style automatically
11
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/stylelint-fix.sh
@@ -0,0 +1,19 @@
1
+ # Vitest Testing Targets
2
+ # Delegates to scripts/test.sh with appropriate environment variables
3
+ ## —— 🧪 Testing ——
4
+
5
+ .PHONY: test
6
+ test:: ## Run all tests (without coverage)
7
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/test.sh
8
+
9
+ .PHONY: test-coverage
10
+ test-coverage:: ## Run tests with coverage report
11
+ @COVERAGE=true bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/test.sh
12
+
13
+ .PHONY: test-watch
14
+ test-watch:: ## Run tests in watch mode
15
+ @$(NPM_DIRECTORY_TOOLS_PROJECT_ROOT)/node_modules/.bin/vitest
16
+
17
+ .PHONY: test-ci
18
+ test-ci:: ## Run tests in CI mode (strict + coverage)
19
+ @CI=true bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/test.sh
@@ -0,0 +1,10 @@
1
+ ## —— 🧩 Typescript ——
2
+
3
+ .PHONY: typecheck
4
+ typecheck: ## Type-check TypeScript without emitting files (tsc --noEmit)
5
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/typecheck.sh
6
+
7
+ .PHONY: build
8
+ build: ## Transpile TypeScript to JavaScript (tsup preferred, tsc fallback)
9
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/build.sh
10
+
@@ -0,0 +1,44 @@
1
+ # Utility Targets
2
+ # Miscellaneous commands for development
3
+
4
+ ## —— 🎼 Package Manager ——
5
+ .PHONY: package-install
6
+ package-install: ## Install dependencies
7
+ @echo "📦 Installing dependencies…"
8
+ @npm install
9
+
10
+ .PHONY: package-update
11
+ package-update: ## Update dependencies
12
+ @echo "⬆️ Updating dependencies…"
13
+ @npm update
14
+
15
+ .PHONY: package-normalize
16
+ package-normalize: ## Normalize package.json structure (sort-package-json)
17
+ @$(NPM_DIRECTORY_TOOLS_PROJECT_ROOT)/node_modules/.bin/sort-package-json package.json
18
+
19
+ .PHONY: package-validate
20
+ package-validate: ## Validate package.json and lockfile sync
21
+ @echo "🔍 Validating package.json and lockfile…"
22
+ @npm install --package-lock-only --dry-run
23
+ @$(NPM_DIRECTORY_TOOLS_PROJECT_ROOT)/node_modules/.bin/sort-package-json --check package.json
24
+
25
+ ## —— 🧰 Utils ——
26
+ .PHONY: doctor
27
+ doctor: ## Run environment diagnostics
28
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/doctor.sh
29
+
30
+ .PHONY: outdated
31
+ outdated: ## Check for outdated npm dependencies
32
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/outdated.sh
33
+
34
+ .PHONY: install-hooks
35
+ install-hooks: ## Install git hooks into .git/hooks
36
+ @bash $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)/install-hooks.sh
37
+
38
+ .PHONY: git-update
39
+ git-update: ## Fast-forward all local branches that track a remote
40
+ @bash $(NPM_DIRECTORY_TOOLS_PACKAGE_ROOT)/tools/scripts/git-update.sh
41
+
42
+ .PHONY: git-cleanup
43
+ git-cleanup: ## Remove local branches whose remote tracking branch no longer exists
44
+ @bash $(NPM_DIRECTORY_TOOLS_PACKAGE_ROOT)/tools/scripts/git-cleanup.sh
@@ -0,0 +1,42 @@
1
+ # Variables - Zairakai NPM Dev Tools
2
+ # Shared configuration and styling
3
+
4
+ # Critical path detection — works from any inclusion depth
5
+ NPM_DIRECTORY_TOOLS_MAKE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
6
+ NPM_DIRECTORY_TOOLS_PACKAGE_ROOT := $(abspath $(NPM_DIRECTORY_TOOLS_MAKE_DIR)../../)/
7
+ NPM_DIRECTORY_TOOLS_SCRIPTS_DIR := $(NPM_DIRECTORY_TOOLS_PACKAGE_ROOT)scripts/
8
+ NPM_DIRECTORY_TOOLS_TOOLS_SCRIPTS_DIR := $(NPM_DIRECTORY_TOOLS_PACKAGE_ROOT)tools/scripts/
9
+
10
+ # Project root (caller context). Prefer $(shell pwd) over $(CURDIR).
11
+ NPM_DIRECTORY_TOOLS_PROJECT_ROOT ?= $(shell pwd)
12
+
13
+ # Validate paths exist
14
+ ifeq ($(wildcard $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR)),)
15
+ $(error Zairakai scripts directory not found: $(NPM_DIRECTORY_TOOLS_SCRIPTS_DIR))
16
+ endif
17
+
18
+ # Project information (can be overridden in project Makefile BEFORE including core.mk)
19
+ NPM_DIRECTORY_TOOLS_PROJECT_NAME ?= Zairakai Project
20
+ NPM_DIRECTORY_TOOLS_TWITCH_URL ?= https://twitch.tv/zairakai
21
+ NPM_DIRECTORY_TOOLS_GITLAB_URL ?= https://gitlab.com/zairakai
22
+
23
+ # Help styling
24
+ NPM_DIRECTORY_TOOLS_HELP_WIDTH := 70
25
+
26
+ # ANSI Colors (only used in Make, not exported to scripts)
27
+ NPM_DIRECTORY_TOOLS_COLOR_RESET := \033[0m
28
+ NPM_DIRECTORY_TOOLS_COLOR_HEADER_BG := \033[46m
29
+ NPM_DIRECTORY_TOOLS_COLOR_HEADER_FG := \033[1;37m
30
+ NPM_DIRECTORY_TOOLS_COLOR_SECTION := \033[1;33m
31
+ NPM_DIRECTORY_TOOLS_COLOR_TARGET := \033[32m
32
+ NPM_DIRECTORY_TOOLS_COLOR_FOOTER_BG := \033[44m
33
+ NPM_DIRECTORY_TOOLS_COLOR_FOOTER_FG := \033[1;37m
34
+
35
+ # Export only what shell scripts need
36
+ export NPM_DIRECTORY_TOOLS_PROJECT_ROOT
37
+ export NPM_DIRECTORY_TOOLS_PACKAGE_ROOT
38
+ export NPM_DIRECTORY_TOOLS_SCRIPTS_DIR
39
+ export NPM_DIRECTORY_TOOLS_TOOLS_SCRIPTS_DIR
40
+ export NPM_DIRECTORY_TOOLS_PROJECT_NAME
41
+ export NPM_DIRECTORY_TOOLS_TWITCH_URL
42
+ export NPM_DIRECTORY_TOOLS_GITLAB_URL
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ echo ""
5
+ echo "==== Git Branch Cleanup ===="
6
+ echo "This script will DELETE local branches whose remote has been deleted."
7
+ echo ""
8
+
9
+ # List local branches whose remote has been deleted
10
+ gone_branches=$(git for-each-ref --format='%(refname:short) %(upstream:track)' refs/heads/ | grep '\[gone\]' | awk '{print $1}' || true)
11
+
12
+ if [ -z "$gone_branches" ]; then
13
+ echo "No branches with deleted remotes found. ✅"
14
+ exit 0
15
+ fi
16
+
17
+ current_branch=$(git symbolic-ref --short HEAD)
18
+
19
+ echo "Found branches with deleted remotes:"
20
+ echo "━━━━━━━━━━━━━━━━"
21
+ echo "$gone_branches"
22
+ echo "━━━━━━━━━━━━━━━━"
23
+ echo ""
24
+ echo "⚠️ WARNING: This will permanently delete these local branches!"
25
+ echo ""
26
+
27
+ # Count branches
28
+ count=$(echo "$gone_branches" | wc -l)
29
+ echo "Total: $count branch(es) to delete"
30
+ echo ""
31
+
32
+ # Ask for confirmation
33
+ read -rp "Continue? [y/N] " -n 1
34
+ echo ""
35
+
36
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
37
+ echo "Aborted. No branches deleted."
38
+ exit 0
39
+ fi
40
+
41
+ echo ""
42
+ echo "==== Deleting branches ===="
43
+ for branch in $gone_branches; do
44
+ if [ "$branch" != "$current_branch" ]; then
45
+ echo "Deleting: $branch"
46
+ git branch -D "$branch"
47
+ else
48
+ echo "⚠️ Skipping $branch (currently checked out)"
49
+ fi
50
+ done
51
+
52
+ echo ""
53
+ echo "==== Cleanup completed ===="
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Fetch and prune remote refs
5
+ git fetch --all --prune
6
+
7
+ # Abort if working tree is dirty
8
+ if ! git diff-index --quiet HEAD --; then
9
+ echo "Working tree dirty. Commit/stash changes before running this script."
10
+ exit 1
11
+ fi
12
+
13
+ current_branch=$(git symbolic-ref --short HEAD)
14
+
15
+ echo ""
16
+ echo "==== Updating local branches ===="
17
+ for branch in $(git for-each-ref --format='%(refname:short)' refs/heads/); do
18
+ upstream=$(git rev-parse --abbrev-ref "$branch@{upstream}" 2>/dev/null || true)
19
+ if [ -n "$upstream" ]; then
20
+ echo "---- Updating $branch from $upstream ----"
21
+ git checkout "$branch"
22
+ # Fast-forward only; will fail if a merge is required
23
+ if git merge --ff-only "$upstream"; then
24
+ echo "Updated $branch ✅"
25
+ else
26
+ echo "Cannot fast-forward $branch (diverged). Skipping."
27
+ fi
28
+ fi
29
+ done
30
+
31
+ # Return to original branch
32
+ git checkout "$current_branch"
33
+
34
+ echo ""
35
+ echo "==== Update completed ===="
36
+ echo ""
37
+ echo "💡 Tip: Use 'make git-cleanup' to remove local branches with deleted remotes"