Compare commits
22 Commits
16a7d8dad9
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 6bf38df599 | |||
| 727f3f86d4 | |||
| 979b6bc1a5 | |||
| ac298ef484 | |||
| 22e92a62dd | |||
| c8b365436a | |||
| 7004caf4d1 | |||
| f9ebc5523a | |||
| 11a70b2d21 | |||
| 8710ca4e78 | |||
| 5591d87023 | |||
| 23bc59250c | |||
| dd1ba72cd1 | |||
| 0e87cee872 | |||
| 18eda7ae6b | |||
| 4a7cdcc11f | |||
| 2443820037 | |||
| f5386bc047 | |||
| ec18a4d68f | |||
| d1ee693044 | |||
| 3fb8b9697a | |||
| 12fc686de1 |
@@ -1,17 +1,22 @@
|
||||
{
|
||||
"project": {
|
||||
"name": "Bashrc Dotfiles",
|
||||
"name": "ps1-craft",
|
||||
"purpose": "Global and per-user bash prompt + banner with seasonal palettes and time/season emoji accents.",
|
||||
"repo_root": "/home/steffen/Bashrc",
|
||||
"default_branch": "main",
|
||||
"release_state": "main is production-ready"
|
||||
"release_state": "main is production-ready",
|
||||
"repo_urls": {
|
||||
"github": "git@github.com:Hawolex/ps1-craft.git",
|
||||
"gitea": "ssh://git@git.skui.io:2222/steffen/ps1-craft.git"
|
||||
}
|
||||
},
|
||||
"branches": {
|
||||
"main": {
|
||||
"notes": [
|
||||
"Shared PS1 module in dotfiles/ps1/ps1.sh is source of truth for both Linux and macOS installers.",
|
||||
"README documents seasonal ranges and style packs.",
|
||||
"README example image uses images/bash-pallete.png."
|
||||
"README example image uses images/bash-pallete.png.",
|
||||
"GitHub mirror is active at git@github.com:Hawolex/ps1-craft.git."
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -21,7 +26,10 @@
|
||||
"macos_installer": "dotfiles/install/install-macos-user.sh",
|
||||
"global_installer_wrapper": "dotfiles/install/install-global-ps1.sh",
|
||||
"readme": "README.md",
|
||||
"library": "libary.md",
|
||||
"library": "library.md",
|
||||
"cron_note": ".cron",
|
||||
"github_workflow": ".github/workflows/shellcheck.yml",
|
||||
"gitea_workflow": ".gitea/workflows/shellcheck.yml",
|
||||
"palette_image": "images/bash-pallete.png",
|
||||
"theme_images_dir": "images/themes",
|
||||
"theme_images": {
|
||||
@@ -532,6 +540,10 @@
|
||||
"Git capsule prefers __git_ps1 and falls back to git symbolic-ref/short hash when git-prompt is unavailable or returns empty.",
|
||||
"Hawolex git capsule enables when PS1_GIT resolves to a truthy value (1/yes/true/on).",
|
||||
"Custom pack adds bold styles (radar, synthwave, noir, topo, glitch, arcticfire, acidlime).",
|
||||
"Library includes emoji usage blocks per theme (sets, fixed times, time slots, rotation)."
|
||||
"Library includes emoji usage blocks per theme (sets, fixed times, time slots, rotation).",
|
||||
"Gitea Actions enabled in app.ini with [actions] ENABLED=true.",
|
||||
"ShellCheck workflows exist for both GitHub and Gitea (.github/workflows and .gitea/workflows).",
|
||||
"Self-hosted runner uses label ubuntu-latest and runs in Docker.",
|
||||
"Host has daily Docker prune cron at 04:00 with 24h retention (see .cron)."
|
||||
]
|
||||
}
|
||||
|
||||
17
.cron
Normal file
17
.cron
Normal file
@@ -0,0 +1,17 @@
|
||||
Docker cleanup cron (host-side)
|
||||
|
||||
Purpose:
|
||||
- Daily prune of unused images/containers/build cache for the runner host.
|
||||
- Keeps bind-mounted data safe (no named volumes removed).
|
||||
|
||||
Schedule:
|
||||
- 04:00 daily
|
||||
|
||||
Cron entry (root):
|
||||
0 4 * * * root /usr/bin/docker image prune -af --filter "until=24h" && /usr/bin/docker container prune -f && /usr/bin/docker builder prune -af --filter "until=24h"
|
||||
|
||||
|
||||
|
||||
|
||||
printf '%s\n' '0 4 * * * root /usr/bin/docker image prune -af --filter "until=24h" && /usr/bin/docker container prune -f && /usr/bin/docker builder prune -af --filter "until=24h"' | sudo tee /etc/cron.d/docker-prune
|
||||
cat /etc/cron.d/docker-prune
|
||||
18
.editorconfig
Normal file
18
.editorconfig
Normal file
@@ -0,0 +1,18 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.sh]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
21
.gitea/workflows/shellcheck.yml
Normal file
21
.gitea/workflows/shellcheck.yml
Normal file
@@ -0,0 +1,21 @@
|
||||
name: ShellCheck
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- "dotfiles/**/*.sh"
|
||||
- ".github/workflows/shellcheck.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "dotfiles/**/*.sh"
|
||||
- ".github/workflows/shellcheck.yml"
|
||||
|
||||
jobs:
|
||||
shellcheck:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install ShellCheck
|
||||
run: sudo apt-get update && sudo apt-get install -y shellcheck
|
||||
- name: Run ShellCheck
|
||||
run: shellcheck dotfiles/**/*.sh
|
||||
21
.github/workflows/shellcheck.yml
vendored
Normal file
21
.github/workflows/shellcheck.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
name: ShellCheck
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- "dotfiles/**/*.sh"
|
||||
- ".github/workflows/shellcheck.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "dotfiles/**/*.sh"
|
||||
- ".github/workflows/shellcheck.yml"
|
||||
|
||||
jobs:
|
||||
shellcheck:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install ShellCheck
|
||||
run: sudo apt-get update && sudo apt-get install -y shellcheck
|
||||
- name: Run ShellCheck
|
||||
run: shellcheck dotfiles/**/*.sh
|
||||
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.sshinfo.txt
|
||||
.cron
|
||||
22
CONTRIBUTING.md
Normal file
22
CONTRIBUTING.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Contributing
|
||||
|
||||
Thanks for helping improve ps1-craft. Keep changes small, readable, and fast.
|
||||
|
||||
## Style rules
|
||||
|
||||
- Keep the prompt hot path fast (no external commands unless feature-gated).
|
||||
- Use `printf` over `echo` for formatting.
|
||||
- Quote variables and paths; avoid word-splitting.
|
||||
- Maintain bash 3.2 compatibility for macOS.
|
||||
|
||||
## Add a new theme or palette
|
||||
|
||||
1) Update `dotfiles/ps1/ps1.sh` with the new colors/icons.
|
||||
2) Add a screenshot under `images/themes/`.
|
||||
3) Document it in `library.md` and `README.md`.
|
||||
|
||||
## Testing
|
||||
|
||||
- Run the installer script you changed.
|
||||
- Open a new shell and verify the prompt renders.
|
||||
- Run ShellCheck on `dotfiles/**/*.sh`.
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 Steffen Skui
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
97
README.md
97
README.md
@@ -1,19 +1,31 @@
|
||||
# Bashrc Dotfiles — Global & Portable Bash Prompt
|
||||
# ps1-craft — Global & Portable Bash Prompt
|
||||
|
||||
Elegant, portable, and easy-to-install Bash prompt with seasonal palettes, time-aware emoji, and clean powerline structure.
|
||||
|
||||
## ⚡ 10-Second Demo
|
||||
|
||||
```text
|
||||
[Mon 14:32 steffen] ▶
|
||||
@host ~/ps1-craft ⟦main⟧ ✨
|
||||
```
|
||||
|
||||
Preview (Aurora seasonal):
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## ⚡ Quick Look
|
||||
|
||||
- Theme gallery + full specs: [Theme Library](libary.md)
|
||||
- Theme gallery + full specs: [Theme Library](library.md)
|
||||
- Install scope + rollback: [UNINSTALL.md](UNINSTALL.md)
|
||||
- Packs: Seasonal (auto), Contest, Holidays, Custom, Git
|
||||
- Layout order option: day-time-user, user-time, time-user, day-time
|
||||
- Optional git capsule across themes
|
||||
|
||||
## ✅ Requirements (Nerd Fonts)
|
||||
|
||||
This prompt relies on Nerd Font glyphs for the rounded separators.
|
||||
This prompt relies on Nerd Fonts glyphs for the rounded separators.
|
||||
|
||||
```bash
|
||||
bash dotfiles/install/install-nerdfont.sh
|
||||
@@ -21,13 +33,29 @@ bash dotfiles/install/install-nerdfont.sh
|
||||
|
||||
After install:
|
||||
|
||||
- Set your terminal font to JetBrainsMono Nerd Font (or any Nerd Font)
|
||||
- Set your terminal font to JetBrainsMono Nerd Font (or any Nerd Fonts family)
|
||||
- Manual download: https://www.nerdfonts.com/font-downloads
|
||||
|
||||
If you use a non‑Nerd font, the prompt falls back to ASCII/Unicode.
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Safety / Scope (global install)
|
||||
|
||||
Linux/WSL installs are global and modify system files:
|
||||
|
||||
- Writes `/etc/profile.d/ps1.sh` and `/etc/profile.d/banner.sh`
|
||||
- Writes `/etc/ps1-season`, `/etc/ps1-style`, and `/etc/ps1-punchline`
|
||||
- Adds a managed source block in `/etc/bash.bashrc`
|
||||
|
||||
Rollback and uninstall steps live in [UNINSTALL.md](UNINSTALL.md). You can also disable per user:
|
||||
|
||||
- `export DISABLE_GLOBAL_PS1=1`
|
||||
- `export DISABLE_GLOBAL_BANNER=1`
|
||||
- `touch ~/.config/ps1/disable` (PS1) or `touch ~/.config/ps1/disable-banner` (banner)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Install
|
||||
|
||||
### 🐧 Linux / WSL (global, all users)
|
||||
@@ -35,13 +63,13 @@ If you use a non‑Nerd font, the prompt falls back to ASCII/Unicode.
|
||||
1) Clone the repo:
|
||||
|
||||
```bash
|
||||
git clone <repo-url>
|
||||
git clone git@github.com:Hawolex/ps1-craft.git
|
||||
```
|
||||
|
||||
2) Enter the folder:
|
||||
|
||||
```bash
|
||||
cd Bashrc
|
||||
cd ps1-craft
|
||||
```
|
||||
|
||||
3) Run the global installer (auto-installs deps + prompts for punchline):
|
||||
@@ -57,13 +85,13 @@ sudo bash dotfiles/install/install-linux-global.sh
|
||||
1) Clone the repo:
|
||||
|
||||
```bash
|
||||
git clone <repo-url>
|
||||
git clone git@github.com:Hawolex/ps1-craft.git
|
||||
```
|
||||
|
||||
2) Enter the folder:
|
||||
|
||||
```bash
|
||||
cd Bashrc
|
||||
cd ps1-craft
|
||||
```
|
||||
|
||||
3) Run the user installer:
|
||||
@@ -194,6 +222,12 @@ echo "Your punchline" | sudo tee /etc/ps1-punchline >/dev/null
|
||||
|
||||
## 🎛️ Themes & Style Packs
|
||||
|
||||
Terminology:
|
||||
|
||||
- Theme = palette + emoji set
|
||||
- Style = layout + separators
|
||||
- Pack = a curated set of styles/themes
|
||||
|
||||
### 🏁 Contest Pack
|
||||
|
||||
The contest pack is a bold, DEFCON-ready set of five styles (Aurora, Neon, Forge, Circuit, Mono) with optional layout order. It always starts on a new line and ends with `@host - /path`.
|
||||
@@ -225,11 +259,13 @@ Custom styles add a small context badge when relevant (`ssh`, `ctr`, `git`).
|
||||
|
||||
The Git theme adds a repo-aware capsule on line 2 that only appears inside a Git repo. The branch name is wrapped as `⟦branch⟧`, and status emojis reflect state:
|
||||
|
||||
- Clean: ✨
|
||||
- Dirty: 🔨
|
||||
- Staged: 📌
|
||||
- Untracked: 🧷
|
||||
- Stashed: 📦
|
||||
```text
|
||||
Clean ✨
|
||||
Dirty 🔨
|
||||
Staged 📌
|
||||
Untracked 🧷
|
||||
Stashed 📦
|
||||
```
|
||||
|
||||
It uses the same two-block layout as Aurora, but focuses on signal and minimal noise for fast scanning. Use it when you want repo status on every command without a full VCS prompt.
|
||||
|
||||
@@ -294,12 +330,16 @@ Meaning:
|
||||
|
||||
```text
|
||||
.
|
||||
├── .context.json
|
||||
├── contest-styles.json
|
||||
├── images/
|
||||
│ ├── bash-pallete.png
|
||||
│ └── contest.png
|
||||
│ └── themes/
|
||||
├── .editorconfig
|
||||
├── .github/
|
||||
│ └── workflows/
|
||||
│ └── shellcheck.yml
|
||||
├── .gitignore
|
||||
├── CONTRIBUTING.md
|
||||
├── LICENSE
|
||||
├── README.md
|
||||
├── UNINSTALL.md
|
||||
├── library.md
|
||||
├── dotfiles/
|
||||
│ ├── banner/
|
||||
│ │ └── banner.sh
|
||||
@@ -310,7 +350,9 @@ Meaning:
|
||||
│ ├── install-linux-global.sh
|
||||
│ ├── install-macos-user.sh
|
||||
│ └── install-nerdfont.sh
|
||||
└── README.md
|
||||
└── images/
|
||||
├── bash-pallete.png
|
||||
└── themes/
|
||||
```
|
||||
|
||||
<details>
|
||||
@@ -318,7 +360,7 @@ Meaning:
|
||||
|
||||
Sometimes autodetection doesn’t work (e.g., on macOS without fontconfig):
|
||||
|
||||
Force Nerd Font glyphs:
|
||||
Force Nerd Fonts glyphs:
|
||||
|
||||
```bash
|
||||
export PS1_FORCE_NF=1
|
||||
@@ -335,6 +377,14 @@ Add these to your `~/.bashrc` or `~/.bash_profile`.
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Performance Notes
|
||||
|
||||
- Git capsule work only runs inside a Git repo and only when enabled
|
||||
- Large repos can slow status checks; disable with `PS1_GIT=0` or avoid the Git theme
|
||||
- Prompt logic avoids external commands unless a feature is enabled (banner, git capsule)
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary><strong>Disable prompt (per user)</strong></summary>
|
||||
|
||||
@@ -445,10 +495,7 @@ Palette reference:
|
||||
|
||||
Want to help improve this project?
|
||||
|
||||
- Fork the repository
|
||||
- Make your changes
|
||||
- Open a merge request
|
||||
- Please keep consistent colors and styles
|
||||
- See [CONTRIBUTING.md](CONTRIBUTING.md) for style rules and how to add a new theme/palette
|
||||
|
||||
---
|
||||
|
||||
|
||||
35
UNINSTALL.md
Normal file
35
UNINSTALL.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Uninstall
|
||||
|
||||
## Linux / WSL (global)
|
||||
|
||||
Remove installed files:
|
||||
|
||||
```bash
|
||||
sudo rm -f /etc/profile.d/ps1.sh /etc/profile.d/banner.sh
|
||||
sudo rm -f /etc/ps1-season /etc/ps1-style /etc/ps1-punchline
|
||||
```
|
||||
|
||||
Remove the managed block from `/etc/bash.bashrc`:
|
||||
|
||||
```bash
|
||||
sudo sed -i '/# >>> dotfiles (managed) >>>/,/# <<< dotfiles (managed) <<</d' /etc/bash.bashrc
|
||||
```
|
||||
|
||||
Open a new shell to confirm the prompt is gone.
|
||||
|
||||
## macOS (per-user)
|
||||
|
||||
Remove installed files:
|
||||
|
||||
```bash
|
||||
rm -f ~/.config/ps1/ps1.sh ~/.config/ps1/season ~/.config/ps1/style
|
||||
```
|
||||
|
||||
Remove the managed block from your shell configs:
|
||||
|
||||
```bash
|
||||
sed -i '' '/# >>> user ps1 (managed) >>>/,/# <<< user ps1 (managed) <<</d' ~/.bashrc
|
||||
sed -i '' '/# >>> user ps1 (managed) >>>/,/# <<< user ps1 (managed) <<</d' ~/.bash_profile
|
||||
```
|
||||
|
||||
Open a new shell or run `source ~/.bashrc`.
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# PS1 module with Nerd Font fallback + disable switch
|
||||
# Designed for bash 3.2+ (macOS) and bash 4/5 (Linux)
|
||||
# Designed for bash 3.2+ (macOS) and bash 4/5 (Linux)
|
||||
# Load this in interactive shells.
|
||||
|
||||
case "$-" in
|
||||
@@ -220,6 +220,7 @@ __try_source_git_prompt() {
|
||||
"/etc/bash_completion.d/git-prompt.sh"
|
||||
)
|
||||
for f in "${candidates[@]}"; do
|
||||
# shellcheck disable=SC1090
|
||||
[[ -r "$f" ]] && source "$f" && return 0
|
||||
done
|
||||
return 1
|
||||
@@ -380,7 +381,9 @@ _ps1_symbol() {
|
||||
coffee="☕"; evening="🌆"; night="🌙"
|
||||
;;
|
||||
*)
|
||||
# shellcheck disable=SC2034
|
||||
sunrise_list=( "🏔️" "🌨️" "❄️" "🌌" )
|
||||
# shellcheck disable=SC2034
|
||||
work_list=( "🎿" "⛷️" "🏂" "🧊" )
|
||||
coffee="☕"; evening="🌆"; night="🌙"
|
||||
;;
|
||||
@@ -720,7 +723,8 @@ ${PREFIX}${M_FG}⟦${L1}⟧ ${M_DIM}${HOST_PART}${PATH_SEP}${M_FG}${PATH_PART}${
|
||||
local G_Z2_BG="\[\e[48;5;37m\]"
|
||||
local G_Z2_FG="\[\e[38;5;255m\]"
|
||||
local G_PATH_FG="\[\e[38;5;194m\]"
|
||||
local GIT_INFO="$(__git_capsule)"
|
||||
local GIT_INFO
|
||||
GIT_INFO="$(__git_capsule)"
|
||||
local G_LEFT=""
|
||||
local G_RIGHT=""
|
||||
local G_SEP=""
|
||||
@@ -864,7 +868,8 @@ ${T_FRAME}╭─${RST}${T_MAIN}${L1}${RST} ${T_FRAME}${L_HOST}${RST} $(_ps1_path
|
||||
local G_FRAME="\[\e[38;5;129m\]"
|
||||
local G_MAIN="\[\e[38;5;118m\]"
|
||||
local G_DIM="\[\e[38;5;60m\]"
|
||||
local G_SEP="$(_ps1_glitch_glyph)"
|
||||
local G_SEP
|
||||
G_SEP="$(_ps1_glitch_glyph)"
|
||||
PS1="\
|
||||
${G_FRAME}╭─${RST}${G_MAIN}${L1}${RST} ${G_DIM}${G_SEP}${RST} ${G_MAIN}${L_HOST} ${RST}${G_DIM}${G_SEP}${RST} ${G_MAIN}${__PS1_PATH}${RST}\
|
||||
\n${G_FRAME}╰─${RST}${prompt_sym} ${__PS1_SYM}${git_tail}"
|
||||
|
||||
@@ -2,6 +2,28 @@
|
||||
|
||||
This file lists every prompt theme, color codes, design intent, and configuration options.
|
||||
|
||||
## Git Capsule (optional, all themes)
|
||||
|
||||
What it is: a compact git status block shown on line 2 when you're inside a git repo.
|
||||
It uses `__git_ps1` when available, with a safe fallback to `git rev-parse` for the branch.
|
||||
|
||||
States + emojis (plain language):
|
||||
- Clean repo: ✨ no local changes; your files match the last commit
|
||||
- Dirty working tree: 🔨 you edited tracked files but haven’t staged them yet
|
||||
- Staged changes: 📌 changes are staged and ready to commit
|
||||
- Untracked files: 🧷 new files git hasn’t started tracking
|
||||
- Stashed changes: 📦 work saved with `git stash` (not in your working tree)
|
||||
|
||||
How it works:
|
||||
- The capsule only renders when a repo is detected (no extra noise outside git).
|
||||
- If `__git_ps1` is available, it reads git state flags and maps them to emojis.
|
||||
- If not, it falls back to the current branch/short SHA (still useful, but fewer states).
|
||||
|
||||
Best practices:
|
||||
- Keep the capsule on during active work; it surfaces risk at a glance.
|
||||
- If you want faster prompts in very large repos, leave untracked detection off.
|
||||
- Use the Git theme for a minimal, work-safe look with the capsule always enabled.
|
||||
|
||||
## Seasonal (Aurora, Standard Pack)
|
||||
|
||||
Design intent: calm, readable, long-session comfort with a subtle five-step gradient
|
||||
Reference in New Issue
Block a user