@wistantkode/dotfiles 1.6.0 → 1.7.1
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/CHANGELOG.md +18 -0
- package/README.md +33 -27
- package/cli/cli.mjs +76 -12
- package/github.sh +46 -78
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.7.1] - 2026-04-05 - [High-Fidelity Restoration]
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **High-Fidelity UI**: Block progress bars (`█`) and CYAN/YELLOW color accents for a premium feel.
|
|
10
|
+
- **Branded Signature**: Integrated an interactive authorship and source information table.
|
|
11
|
+
- **Enhanced Orchestration**: Two-stage directory confirmation and state-aware audit feedback.
|
|
12
|
+
- **Protocol Governance**: Logic refinement for `.protocols/` folder selection with architectural recommendations.
|
|
13
|
+
|
|
14
|
+
## [1.7.0] - 2026-04-05 - [Interactive Orchestration & Anonymization]
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **Interactive CLI**: Full `node:readline` orchestration for deployment.
|
|
19
|
+
- **Directory Audit**: Preventive scan for existing files in target directory.
|
|
20
|
+
- **Protocol Placement**: Dynamic selection between `.protocols/` (recommended) and root.
|
|
21
|
+
- **Full Anonymization**: Removal of all personal identity and authorship markers.
|
|
22
|
+
|
|
5
23
|
## [1.6.0] - 2026-04-05 - [Vellum & Void Integrity]
|
|
6
24
|
|
|
7
25
|
### Added
|
package/README.md
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<img src="./assets/logo.png" alt="Dotfiles Logo" width="
|
|
2
|
+
<img src="./assets/logo.png" alt="Dotfiles Logo" width="240" />
|
|
3
3
|
|
|
4
4
|
# Precision Dotfiles Infrastructure
|
|
5
5
|
|
|
6
|
-
[ Automated Orchestration • AI-Driven Logic • Governance
|
|
6
|
+
[ Automated Orchestration • AI-Driven Logic • System Governance • CLI Distribution ]
|
|
7
7
|
|
|
8
8
|
<p>
|
|
9
|
+
<a href="https://pnpm.io">
|
|
10
|
+
<img src="https://img.shields.io/badge/pnpm-4AB6FA?style=for-the-badge&logo=pnpm&logoColor=white" alt="pnpm" />
|
|
11
|
+
</a>
|
|
12
|
+
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript">
|
|
13
|
+
<img src="https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black" alt="javascript" />
|
|
14
|
+
</a>
|
|
9
15
|
<a href="https://www.npmjs.com/package/@wistantkode/dotfiles">
|
|
10
|
-
|
|
16
|
+
<img src="https://img.shields.io/badge/npm-CB3837?style=for-the-badge&logo=npm&logoColor=white" alt="npm" />
|
|
11
17
|
</a>
|
|
12
|
-
<a href="https://
|
|
13
|
-
|
|
18
|
+
<a href="https://github.com/wistant/dotfiles/actions">
|
|
19
|
+
<img src="https://img.shields.io/badge/GitHub_Actions-2088FF?style=for-the-badge&logo=github-actions&logoColor=white" alt="github actions" />
|
|
14
20
|
</a>
|
|
15
21
|
<a href="https://github.com/wistant/dotfiles/releases">
|
|
16
|
-
|
|
22
|
+
<img src="https://img.shields.io/badge/Release-v1.7.0-blue?style=for-the-badge&logo=github" alt="GitHub release" />
|
|
17
23
|
</a>
|
|
18
24
|
</p>
|
|
19
25
|
|
|
20
|
-
[](./protocols/COMMIT.md)
|
|
21
|
-
[](./protocols/RELEASE.md)
|
|
22
|
-
[](./protocols/SECURITY.md)
|
|
23
|
-
|
|
24
26
|
</div>
|
|
25
27
|
|
|
26
28
|
---
|
|
@@ -30,16 +32,24 @@
|
|
|
30
32
|
This repository is not just a collection of configs; it is a **Living Governance System**. Every interaction between the Architect and the AI is filtered through a rigorous protocol stack.
|
|
31
33
|
|
|
32
34
|
```mermaid
|
|
33
|
-
graph
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
graph LR
|
|
36
|
+
subgraph "Engineering & Governance"
|
|
37
|
+
SE[Software Engineer] --> PR[Protocols & Registry]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
subgraph "Automation Core"
|
|
41
|
+
PR --> CLI[CLI Orchestrator]
|
|
42
|
+
PR --> SYNC[Sync Engine]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
subgraph "Deployment Lifecycle"
|
|
46
|
+
CLI --> OS[System Deployment]
|
|
47
|
+
SYNC --> GIT[Git Integrity]
|
|
48
|
+
GIT --> NPM[NPM Distribution]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
style SE fill:#fff,stroke:#333,stroke-width:2px
|
|
52
|
+
style NPM fill:#000,stroke:#fff,stroke-width:2px,color:#fff
|
|
43
53
|
```
|
|
44
54
|
|
|
45
55
|
### Core Automation Tools
|
|
@@ -81,11 +91,11 @@ pnpm dlx @wistantkode/dotfiles
|
|
|
81
91
|
|
|
82
92
|
## Contributors
|
|
83
93
|
|
|
84
|
-
The project is currently orchestrated by its lead
|
|
94
|
+
The project is currently orchestrated by its lead software engineer. New contributions are welcome to expand the baseline.
|
|
85
95
|
|
|
86
96
|
<p align="left">
|
|
87
97
|
<a href="https://github.com/wistant">
|
|
88
|
-
<img src="https://github.com/wistant.png?size=100" width="
|
|
98
|
+
<img src="https://github.com/wistant.png?size=100" width="50" height="50" alt="wistant" title="Wistant"/>
|
|
89
99
|
</a>
|
|
90
100
|
</p>
|
|
91
101
|
|
|
@@ -93,7 +103,7 @@ The project is currently orchestrated by its lead architect. New contributions a
|
|
|
93
103
|
|
|
94
104
|
## Community
|
|
95
105
|
|
|
96
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to join the **
|
|
106
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to join the **contributors** and submit PRs.
|
|
97
107
|
AI/vibe-coded PRs welcome! 🤖
|
|
98
108
|
|
|
99
109
|
---
|
|
@@ -103,7 +113,3 @@ AI/vibe-coded PRs welcome! 🤖
|
|
|
103
113
|
Copyright © 2026 **Wistant**. Distributed under the **Apache License 2.0**.
|
|
104
114
|
|
|
105
115
|
---
|
|
106
|
-
|
|
107
|
-
<div align="center">
|
|
108
|
-
<b>Designed for the 0.1% — Engineered by @wistant</b>
|
|
109
|
-
</div>
|
package/cli/cli.mjs
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { copyFile, mkdir, readdir, lstat } from 'node:fs/promises';
|
|
10
10
|
import { join, dirname } from 'node:path';
|
|
11
11
|
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { createInterface } from 'node:readline/promises';
|
|
12
13
|
|
|
13
14
|
// ── UI Configuration (256-color) ──────────────────────────────────────
|
|
14
15
|
const RESET = '\x1b[0m';
|
|
@@ -26,13 +27,6 @@ const BLUE = '\x1b[38;5;75m';
|
|
|
26
27
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
27
28
|
const pkgRoot = join(__dirname, '..');
|
|
28
29
|
|
|
29
|
-
// ── Asset Mapping ─────────────────────────────────────────────────────
|
|
30
|
-
const ASSETS = [
|
|
31
|
-
{ src: 'gitignore', dest: '.gitignore', label: 'Ignore patterns' },
|
|
32
|
-
{ src: 'LICENSE', dest: 'LICENSE', label: 'License' },
|
|
33
|
-
{ src: 'protocols', dest: '.protocols', label: 'Governance protocols', isDir: true }
|
|
34
|
-
];
|
|
35
|
-
|
|
36
30
|
// ── Layout Components ─────────────────────────────────────────────────
|
|
37
31
|
|
|
38
32
|
const _rep = (n, char = ' ') => char.repeat(Math.max(0, n));
|
|
@@ -67,17 +61,39 @@ const renderSignature = () => {
|
|
|
67
61
|
console.log(` ${DGRAY}┌${_rep(width, '──')}┐${RESET}`);
|
|
68
62
|
|
|
69
63
|
const label = (txt, col) => `${col}${BOLD}${txt}${RESET}`;
|
|
70
|
-
const info = (txt) => `${GRAY}${txt}${RESET}`;
|
|
71
64
|
|
|
72
65
|
console.log(` ${DGRAY}│${RESET} ${pad(`${label('REPOSITORY', BLUE)} ${BOLD}https://github.com/wistant/dotfiles${RESET}`, width + 17)} ${DGRAY}│${RESET}`);
|
|
73
66
|
console.log(` ${DGRAY}├${_rep(width, '──')}┤${RESET}`);
|
|
74
67
|
console.log(` ${DGRAY}│${RESET} ${pad(`${label('ARCHITECT ', WHITE)} ${BOLD}Wistant${RESET} ${GRAY}(DevOps Architect)${RESET}`, width + 28)} ${DGRAY}│${RESET}`);
|
|
75
68
|
console.log(` ${DGRAY}│${RESET} ${pad(`${label('GITHUB ', BLUE)} ${GRAY}https://github.com/wistant${RESET}`, width + 26)} ${DGRAY}│${RESET}`);
|
|
76
|
-
console.log(` ${DGRAY}│${RESET} ${pad(`${label('X ', CYAN)} ${GRAY}https://x.com/wistant${RESET}`, width + 26)} ${DGRAY}│${RESET}`);
|
|
77
|
-
console.log(` ${DGRAY}│${RESET} ${pad(`${label('LINKEDIN ', BLUE)} ${GRAY}https://linkedin.com/in/wistant${RESET}`, width + 26)} ${DGRAY}│${RESET}`);
|
|
78
69
|
console.log(` ${DGRAY}└${_rep(width, '──')}┘${RESET}\n`);
|
|
79
70
|
};
|
|
80
71
|
|
|
72
|
+
// ── Interactive Logic ─────────────────────────────────────────────────
|
|
73
|
+
|
|
74
|
+
const rl = createInterface({
|
|
75
|
+
input: process.stdin,
|
|
76
|
+
output: process.stdout
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const ask = async (question, defaultYes = true) => {
|
|
80
|
+
const options = defaultYes ? ' (Y/n)' : ' (y/N)';
|
|
81
|
+
const answer = await rl.question(` ${YELLOW}${BOLD}?${RESET} ${question}${GRAY}${options}${RESET} `);
|
|
82
|
+
if (!answer) return defaultYes;
|
|
83
|
+
return answer.toLowerCase().startsWith('y');
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
async function checkDirectory(dir) {
|
|
87
|
+
try {
|
|
88
|
+
const files = await readdir(dir);
|
|
89
|
+
// Ignore common development/system noise
|
|
90
|
+
const filtered = files.filter(f => !['.git', 'node_modules', '.DS_Store', 'package-lock.json', 'pnpm-lock.yaml'].includes(f));
|
|
91
|
+
return filtered.length > 0;
|
|
92
|
+
} catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
81
97
|
// ── Core Engine ───────────────────────────────────────────────────────
|
|
82
98
|
|
|
83
99
|
async function copyRecursive(src, dest, onFile) {
|
|
@@ -100,11 +116,56 @@ async function run() {
|
|
|
100
116
|
sep();
|
|
101
117
|
|
|
102
118
|
const targetDir = process.cwd();
|
|
103
|
-
console.log(`\n ${GRAY}System Target:${RESET} ${WHITE}${BOLD}${targetDir}${RESET}
|
|
119
|
+
console.log(`\n ${GRAY}System Target:${RESET} ${WHITE}${BOLD}${targetDir}${RESET}`);
|
|
104
120
|
|
|
121
|
+
const proceedTarget = await ask('Initiate deployment in this directory?', true);
|
|
122
|
+
if (!proceedTarget) {
|
|
123
|
+
console.log(`\n ${RED}Deployment cancelled by user.${RESET}\n`);
|
|
124
|
+
rl.close();
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Phase 1: Directory Audit
|
|
129
|
+
const isEmpty = !(await checkDirectory(targetDir));
|
|
130
|
+
if (isEmpty) {
|
|
131
|
+
console.log(` ${GREEN}${BOLD}✔ TARGET DIRECTORY IS CLEAN${RESET}`);
|
|
132
|
+
} else {
|
|
133
|
+
console.log(` ${YELLOW}${BOLD}⚠ TARGET DIRECTORY IS NOT EMPTY${RESET}`);
|
|
134
|
+
const proceed = await ask('Deployment may overwrite existing files. Force installation?', false);
|
|
135
|
+
if (!proceed) {
|
|
136
|
+
console.log(`\n ${RED}Deployment cancelled by user.${RESET}\n`);
|
|
137
|
+
rl.close();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Phase 2: Protocol Selection
|
|
143
|
+
let protocolDest = '.protocols';
|
|
144
|
+
console.log(`\n ${CYAN}${BOLD}i GOVERNANCE PLACEMENT${RESET}`);
|
|
145
|
+
const useDotDir = await ask('Deploy protocols to .protocols/ folder? (Recommended)', true);
|
|
146
|
+
if (!useDotDir) {
|
|
147
|
+
protocolDest = 'protocols';
|
|
148
|
+
console.log(` ${DIM}Protocols will be deployed to 'protocols/' (Visibility Mode).${RESET}`);
|
|
149
|
+
} else {
|
|
150
|
+
console.log(` ${DIM}Protocols will be deployed to '.protocols/' (Architecture Standard).${RESET}`);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const ASSETS = [
|
|
154
|
+
{ src: 'gitignore', dest: '.gitignore', label: 'Ignore patterns' },
|
|
155
|
+
{ src: 'LICENSE', dest: 'LICENSE', label: 'License' },
|
|
156
|
+
{ src: 'protocols', dest: protocolDest, label: 'Governance protocols', isDir: true }
|
|
157
|
+
];
|
|
158
|
+
|
|
105
159
|
sep();
|
|
106
|
-
console.log(`\n ${BOLD}▶
|
|
160
|
+
console.log(`\n ${BOLD}▶ Ready to initiate deployment sequence...${RESET}`);
|
|
161
|
+
const confirm = await ask('Apply changes to your system?', true);
|
|
162
|
+
if (!confirm) {
|
|
163
|
+
console.log(`\n ${RED}Deployment aborted.${RESET}\n`);
|
|
164
|
+
rl.close();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
107
167
|
|
|
168
|
+
console.log('');
|
|
108
169
|
await progress('Validating package integrity');
|
|
109
170
|
|
|
110
171
|
const deployedFiles = [];
|
|
@@ -145,9 +206,12 @@ async function run() {
|
|
|
145
206
|
console.log(` ${DIM}Thank you for choosing high-end architectural standards.${RESET}\n`);
|
|
146
207
|
sep();
|
|
147
208
|
console.log('');
|
|
209
|
+
|
|
210
|
+
rl.close();
|
|
148
211
|
}
|
|
149
212
|
|
|
150
213
|
run().catch(err => {
|
|
151
214
|
console.error(`\n ${RED}${BOLD}✗ FATAL ERROR${RESET} ${err.message}\n`);
|
|
215
|
+
if (rl) rl.close();
|
|
152
216
|
process.exit(1);
|
|
153
217
|
});
|
package/github.sh
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
# ═══════════════════════════════════════════════════════════════════════
|
|
4
4
|
# GITHUB SYNC · Integrity Gate · @wistantkode/dotfiles
|
|
5
|
-
#
|
|
5
|
+
# ════════════════════════════════════════───────────────────────════════
|
|
6
6
|
|
|
7
|
-
# ── Color palette (256-color)
|
|
7
|
+
# ── Color palette (Minimalist 256-color) ──────────────────────────────
|
|
8
8
|
RESET='\033[0m'; BOLD='\033[1m'; DIM='\033[2m'
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
WHITE='\033[38;5;255m'; GRAY='\033[38;5;244m'; DGRAY='\033[38;5;238m'
|
|
10
|
+
RED='\033[38;5;203m'; GREEN='\033[38;5;114m'; YELLOW='\033[38;5;221m'
|
|
11
|
+
BLUE='\033[38;5;75m'; CYAN='\033[38;5;117m'
|
|
12
12
|
|
|
13
13
|
# ── Table dimensions ──────────────────────────────────────────────────
|
|
14
14
|
HASH_W=8 # hash column display width
|
|
@@ -16,13 +16,21 @@ MSG_W=52 # message column display width
|
|
|
16
16
|
|
|
17
17
|
# ── Layout helpers ────────────────────────────────────────────────────
|
|
18
18
|
_rep() { printf "%${1}s" | tr ' ' "${2}"; }
|
|
19
|
-
_sep() { echo -e "${DGRAY}$(_rep
|
|
20
|
-
|
|
19
|
+
_sep() { echo -e "${DGRAY}$(_rep 66 '─')${RESET}"; }
|
|
20
|
+
|
|
21
|
+
_logo() {
|
|
22
|
+
echo -e "\n ${WHITE}██████╗ ██╗████████╗██╗ ██╗██╗ ██╗██████╗ "
|
|
23
|
+
echo -e " ${WHITE}██╔════╝ ██║╚══██╔══╝██║ ██║██║ ██║██╔══██╗"
|
|
24
|
+
echo -e " ${WHITE}██║ ███╗██║ ██║ ███████║██║ ██║██████╔╝"
|
|
25
|
+
echo -e " ${WHITE}██║ ██║██║ ██║ ██╔══██║██║ ██║██╔══██╗"
|
|
26
|
+
echo -e " ${WHITE}╚██████╔╝██║ ██║ ██║ ██║╚██████╔╝██████╔╝"
|
|
27
|
+
echo -e " ${WHITE} ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ${RESET}"
|
|
28
|
+
echo -e "\n ${GRAY}${BOLD}[ GITHUB AUTOMATION SYNC ]${RESET}\n"
|
|
29
|
+
}
|
|
21
30
|
|
|
22
31
|
_header() {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
echo -e "${DGRAY} ├$(_rep $((HASH_W+2)) '─')┼$(_rep $((MSG_W+2)) '─')┤${RESET}"
|
|
32
|
+
printf " ${BOLD}${GRAY}%-${HASH_W}s %-${MSG_W}s${RESET}\n" "HASH" "COMMIT MESSAGE"
|
|
33
|
+
_sep
|
|
26
34
|
}
|
|
27
35
|
|
|
28
36
|
_row() {
|
|
@@ -31,23 +39,17 @@ _row() {
|
|
|
31
39
|
local raw="$2"
|
|
32
40
|
[ ${#raw} -gt $((MSG_W-1)) ] && raw="${raw:0:$((MSG_W-3))}..."
|
|
33
41
|
msg=$(printf "%-${MSG_W}s" "$raw")
|
|
34
|
-
printf "
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
_footer() {
|
|
38
|
-
echo -e "${DGRAY} ╰$(_rep $((HASH_W+2)) '─')┴$(_rep $((MSG_W+2)) '─')╯${RESET}"
|
|
42
|
+
printf " ${BLUE}%s${RESET} ${WHITE}%s${RESET}\n" "$hash" "$msg"
|
|
39
43
|
}
|
|
40
44
|
|
|
41
|
-
# ── Progress bar animation ────────────────────────────────────────────
|
|
42
45
|
_progress() {
|
|
43
46
|
local label="$1"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
sleep 0.018
|
|
47
|
+
printf " ${GRAY}%-28s ${RESET}" "$label"
|
|
48
|
+
for ((i=1; i<=20; i++)); do
|
|
49
|
+
printf "${WHITE}·${RESET}"
|
|
50
|
+
sleep 0.015
|
|
49
51
|
done
|
|
50
|
-
printf "${
|
|
52
|
+
printf " ${GREEN}✔${RESET}\n"
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
# ── Core utilities ────────────────────────────────────────────────────
|
|
@@ -61,7 +63,7 @@ abort() {
|
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
ask() {
|
|
64
|
-
echo -ne "\n ${
|
|
66
|
+
echo -ne "\n ${WHITE}${BOLD}?${RESET} $1 ${GRAY}(y/N)${RESET} "
|
|
65
67
|
read -r _r
|
|
66
68
|
[[ "$_r" =~ ^([yY][eE][sS]|[yY])$ ]]
|
|
67
69
|
}
|
|
@@ -90,19 +92,16 @@ PUSH_TAGS=""
|
|
|
90
92
|
|
|
91
93
|
case "$CURRENT_BRANCH" in
|
|
92
94
|
main|master) BLABEL="${RED}${BOLD}⬡ PRODUCTION${RESET}" ;;
|
|
93
|
-
dev|develop) BLABEL="${YELLOW}◈ INTEGRATION${RESET}" ;;
|
|
94
|
-
feat/*) BLABEL="${GREEN}◈ FEATURE${RESET}" ;;
|
|
95
|
-
fix/*) BLABEL="${CYAN}◈ BUGFIX${RESET}" ;;
|
|
96
|
-
refactor/*) BLABEL="${BLUE}◈ REFACTOR${RESET}" ;;
|
|
97
95
|
*) BLABEL="${GRAY}◈ BRANCH${RESET}" ;;
|
|
98
96
|
esac
|
|
99
97
|
|
|
100
98
|
# ── Phase 1 · Working tree check ─────────────────────────────────────
|
|
101
99
|
clear
|
|
100
|
+
_logo
|
|
101
|
+
_sep
|
|
102
102
|
echo ""
|
|
103
|
-
echo -e " ${WHITE}${BOLD}◆
|
|
103
|
+
echo -e " ${WHITE}${BOLD}◆ INTEGRITY GATE${RESET} ${DGRAY}· Software Engineer${RESET}"
|
|
104
104
|
echo ""
|
|
105
|
-
_sep
|
|
106
105
|
|
|
107
106
|
if ! git diff-index --quiet HEAD -- 2>/dev/null; then
|
|
108
107
|
echo ""
|
|
@@ -113,10 +112,9 @@ if ! git diff-index --quiet HEAD -- 2>/dev/null; then
|
|
|
113
112
|
fi
|
|
114
113
|
|
|
115
114
|
# ── Phase 2 · Summary panel ───────────────────────────────────────────
|
|
116
|
-
|
|
117
|
-
printf " ${GRAY}%-
|
|
118
|
-
printf " ${GRAY}%-
|
|
119
|
-
printf " ${GRAY}%-14s${RESET} ${BOLD}%s${RESET} to publish\n" "Tags" "$TAG_COUNT"
|
|
115
|
+
printf " ${GRAY}%-12s${RESET} ${WHITE}${BOLD}%s${RESET} %b\n" "Branch" "$CURRENT_BRANCH" "$BLABEL"
|
|
116
|
+
printf " ${GRAY}%-12s${RESET} ${WHITE}%s${RESET} commit(s) ahead\n" "Ahead" "$COMMIT_COUNT"
|
|
117
|
+
printf " ${GRAY}%-12s${RESET} ${WHITE}%s${RESET} to publish\n" "Tags" "$TAG_COUNT"
|
|
120
118
|
echo ""
|
|
121
119
|
_sep
|
|
122
120
|
|
|
@@ -129,7 +127,7 @@ if [ "$COMMIT_COUNT" -gt 0 ]; then
|
|
|
129
127
|
m=$(echo "$line" | cut -d' ' -f2-)
|
|
130
128
|
_row "$h" "$m"
|
|
131
129
|
done <<< "$COMMITS_RAW"
|
|
132
|
-
|
|
130
|
+
_sep
|
|
133
131
|
fi
|
|
134
132
|
|
|
135
133
|
# Tags list
|
|
@@ -137,70 +135,40 @@ if [ "$TAG_COUNT" -gt 0 ]; then
|
|
|
137
135
|
echo ""
|
|
138
136
|
echo -e " ${GRAY}Unpublished tags:${RESET}"
|
|
139
137
|
while IFS= read -r tag; do
|
|
140
|
-
echo -e " ${GREEN}
|
|
138
|
+
echo -e " ${GREEN}✔${RESET} ${WHITE}${BOLD}$tag${RESET}"
|
|
141
139
|
done <<< "$LOCAL_ONLY_TAGS"
|
|
140
|
+
_sep
|
|
142
141
|
fi
|
|
143
142
|
|
|
143
|
+
# ── Phase 3 · Final confirmation ──────────────────────────────────────
|
|
144
144
|
echo ""
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
case "$CURRENT_BRANCH" in
|
|
150
|
-
main|master)
|
|
151
|
-
echo -e " ${RED}${BOLD}⚠ PRODUCTION BRANCH${RESET}"
|
|
152
|
-
echo -e " ${DIM}Every push to this branch triggers the public release pipeline.${RESET}"
|
|
153
|
-
ask "You are on ${BOLD}${CURRENT_BRANCH}${RESET}. Proceed to final review?" \
|
|
154
|
-
|| abort "Cancelled by operator."
|
|
155
|
-
;;
|
|
156
|
-
dev|develop)
|
|
157
|
-
echo -e " ${YELLOW}${BOLD}◈ INTEGRATION BRANCH${RESET}"
|
|
158
|
-
ask "Push to ${BOLD}${REMOTE}${RESET}?" || abort "Cancelled by operator."
|
|
159
|
-
;;
|
|
160
|
-
*)
|
|
161
|
-
ask "Push ${BOLD}${CURRENT_BRANCH}${RESET} to remote?" || abort "Cancelled by operator."
|
|
162
|
-
;;
|
|
163
|
-
esac
|
|
164
|
-
|
|
165
|
-
# ── Phase 4 · Final confirmation ──────────────────────────────────────
|
|
166
|
-
echo ""
|
|
167
|
-
_sep
|
|
145
|
+
SUMMARY="${WHITE}${BOLD}${COMMIT_COUNT}${RESET} commit(s)"
|
|
146
|
+
[ "$TAG_COUNT" -gt 0 ] && SUMMARY+=" ${DGRAY}+${RESET} ${WHITE}${BOLD}${TAG_COUNT}${RESET} tag(s)"
|
|
147
|
+
printf " ${GRAY}%-12s${RESET} %b\n" "Will push" "$SUMMARY"
|
|
148
|
+
printf " ${GRAY}%-12s${RESET} ${BLUE}%s${RESET}\n" "Target" "$REMOTE"
|
|
168
149
|
echo ""
|
|
169
|
-
SUMMARY="${BOLD}${COMMIT_COUNT}${RESET} commit(s)"
|
|
170
|
-
[ "$TAG_COUNT" -gt 0 ] && SUMMARY+=" ${DGRAY}+${RESET} ${BOLD}${TAG_COUNT}${RESET} tag(s)"
|
|
171
|
-
printf " ${GRAY}%-14s${RESET} %b\n" "Will push" "$SUMMARY"
|
|
172
|
-
printf " ${GRAY}%-14s${RESET} ${BOLD}%s${RESET}\n" "Target" "$REMOTE"
|
|
173
|
-
echo ""
|
|
174
|
-
echo -e " ${DIM}SSH key passphrase will be required by git if not cached.${RESET}"
|
|
175
150
|
|
|
176
|
-
ask "
|
|
177
|
-
|| abort "Final gate: push cancelled."
|
|
151
|
+
ask "Confirm push to remote?" || abort "Gate: push cancelled."
|
|
178
152
|
|
|
179
|
-
# ── Phase
|
|
153
|
+
# ── Phase 4 · Projection ──────────────────────────────────────────────
|
|
180
154
|
echo ""
|
|
181
155
|
_sep
|
|
182
156
|
echo ""
|
|
183
|
-
_progress "Initializing
|
|
184
|
-
_progress "Verifying
|
|
185
|
-
_progress "
|
|
186
|
-
echo ""
|
|
187
|
-
echo -e " ${DGRAY}$(_rep 64 '─')${RESET}"
|
|
188
|
-
echo -e " ${BOLD}▶ git push${RESET} ${DGRAY}(passphrase prompt appears below if required)${RESET}"
|
|
189
|
-
echo -e " ${DGRAY}$(_rep 64 '─')${RESET}"
|
|
157
|
+
_progress "Initializing sync"
|
|
158
|
+
_progress "Verifying state"
|
|
159
|
+
_progress "Final handoff"
|
|
190
160
|
echo ""
|
|
191
161
|
|
|
192
162
|
if git push --quiet $PUSH_TAGS; then
|
|
193
163
|
echo ""
|
|
194
164
|
_sep
|
|
195
165
|
echo ""
|
|
196
|
-
echo -e " ${GREEN}${BOLD}✔ SUCCESS${RESET} Infrastructure synchronized
|
|
197
|
-
[ "$TAG_COUNT" -gt 0 ] && \
|
|
198
|
-
echo -e " ${GRAY}Tags published. GitHub Actions pipeline may now be triggered.${RESET}"
|
|
166
|
+
echo -e " ${GREEN}${BOLD}✔ SUCCESS${RESET} Infrastructure synchronized."
|
|
199
167
|
echo ""
|
|
200
168
|
_sep
|
|
201
169
|
else
|
|
202
170
|
echo ""
|
|
203
|
-
abort "Git push failed. Check
|
|
171
|
+
abort "Git push failed. Check connectivity."
|
|
204
172
|
fi
|
|
205
173
|
|
|
206
174
|
echo ""
|