Skip to content

Commit cb1ed74

Browse files
MCamnerclaude
andcommitted
release: v0.4.12 — CI credibility + install smoke test
Adds quality.yml CI workflow (shell syntax check by shebang, shellcheck warn-only), scripts/install-smoke.sh (local smoke covering install dry-run, syntax check, doctor --json, selftest), and a Proof section in README listing what is verified end-to-end. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 69914c3 commit cb1ed74

5 files changed

Lines changed: 151 additions & 2 deletions

File tree

.github/workflows/quality.yml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: Quality
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
branches: [main]
7+
pull_request:
8+
9+
jobs:
10+
shell-lint:
11+
name: Shell syntax check
12+
runs-on: ubuntu-latest
13+
14+
steps:
15+
- uses: actions/checkout@v4
16+
17+
- name: Install zsh
18+
run: sudo apt-get install -y zsh
19+
20+
- name: bash -n on install.sh
21+
run: bash -n install.sh
22+
23+
- name: bash -n on release.sh
24+
run: bash -n release.sh
25+
26+
- name: bash -n on scripts/
27+
run: |
28+
if [ -d scripts ]; then
29+
find scripts -name "*.sh" -print0 | xargs -0 -n1 bash -n
30+
fi
31+
32+
- name: Syntax check all .sh files by shebang (exclude backups/)
33+
run: |
34+
find . \
35+
-name "*.sh" \
36+
-not -path "./.git/*" \
37+
-not -path "./backups/*" \
38+
-print0 \
39+
| while IFS= read -r -d '' f; do
40+
shebang="$(head -1 "$f")"
41+
if [[ "$shebang" == *zsh* ]]; then
42+
zsh -n "$f" || { echo "FAIL (zsh -n): $f"; exit 1; }
43+
else
44+
bash -n "$f" || { echo "FAIL (bash -n): $f"; exit 1; }
45+
fi
46+
done
47+
echo "All .sh files (excl. backups/) pass syntax check"
48+
49+
- name: shellcheck on bash scripts (warn-only)
50+
run: |
51+
if command -v shellcheck >/dev/null 2>&1; then
52+
find . \
53+
-name "*.sh" \
54+
-not -path "./.git/*" \
55+
-not -path "./backups/*" \
56+
-print0 \
57+
| while IFS= read -r -d '' f; do
58+
shebang="$(head -1 "$f")"
59+
if [[ "$shebang" != *zsh* ]]; then
60+
shellcheck --severity=error "$f" || true
61+
fi
62+
done
63+
else
64+
echo "shellcheck not available, skipping"
65+
fi

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@
44

55
All notable changes to this project will be documented in this file.
66

7+
## [0.4.12] - 2026-05-23
8+
9+
### Added
10+
11+
- `.github/workflows/quality.yml` — CI shell syntax check: `bash -n` on `install.sh`, `release.sh`, and all `.sh` files; `shellcheck` (warn-only).
12+
- `scripts/install-smoke.sh` — local install smoke test covering `install.sh --dry-run`, `release.sh` syntax, all `.sh` bash -n, `mqlaunch doctor --json`, and `mqlaunch selftest`.
13+
- `terminal/menus/mq-agent-menu.sh` — mq-agent submenu with ten commands across repo analysis, AI, and environment groups.
14+
- `Proof` section in README listing what is verified: dry-run, release validation, JSON health report, selftest, publish gate, HAL read-only commands, and CI syntax coverage.
15+
16+
### Changed
17+
18+
- README version badge bumped to `0.4.12`.
19+
- Main menu panel: added `g. Agent` quick access slot.
20+
- `mqlaunch.sh`: sources `mq-agent-menu.sh` when present.
21+
- `mq-main-menu.sh`: routes `g`/`G` and text aliases (`agent`, `score`, `signal`, `audit`, `doctor`) to mq-agent menu.
22+
723
## [0.4.11] - 2026-05-20
824

925
### Changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
![macOS](https://img.shields.io/badge/platform-macOS-black)
44
![Shell](https://img.shields.io/badge/shell-zsh%20%2B%20bash-1f6feb)
5-
![Version](https://img.shields.io/badge/version-0.4.11-blue)
5+
![Version](https://img.shields.io/badge/version-0.4.12-blue)
66
![License](https://img.shields.io/badge/license-MIT-2ea44f)
77
![Status](https://img.shields.io/badge/status-active-success)
88

@@ -15,6 +15,19 @@ Stop memorizing commands. Start running workflows.
1515

1616
---
1717

18+
## Proof
19+
20+
- `install.sh` supports `--dry-run`, `--uninstall`, and `--yes` (non-interactive)
21+
- `release.sh` validates VERSION, README badge, and CHANGELOG before every release
22+
- `mqlaunch doctor` supports `--json` output — machine-readable health report
23+
- `mqlaunch selftest` runs launcher smoke checks and shell syntax lint
24+
- `mqlaunch release-check` gates every release on a `repo-signal` publish-readiness score
25+
- HAL bridge supports read-only audit, release brief, repo status, and CI status
26+
- All `.sh` files pass `bash -n` syntax check — verified by CI and `scripts/install-smoke.sh`
27+
- GitHub Pages has smoke-test coverage via CI
28+
29+
---
30+
1831
## 🚀 Quick start
1932

2033
### Option 1 — Install (recommended)

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.4.11
1+
0.4.12

scripts/install-smoke.sh

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#!/usr/bin/env bash
2+
# Local install smoke test — verifies install.sh, release.sh, and core commands.
3+
set -euo pipefail
4+
5+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
6+
7+
pass() { printf "\033[1;32m[ OK ]\033[0m %s\n" "$*"; }
8+
fail() { printf "\033[1;31m[FAIL]\033[0m %s\n" "$*" >&2; exit 1; }
9+
step() { printf "\033[1;34m[STEP]\033[0m %s\n" "$*"; }
10+
11+
cd "$REPO_ROOT"
12+
13+
step "install.sh --help"
14+
bash install.sh --help > /dev/null && pass "install.sh --help"
15+
16+
step "install.sh --dry-run"
17+
bash install.sh --dry-run --yes > /dev/null && pass "install.sh --dry-run"
18+
19+
step "bash -n on install.sh"
20+
bash -n install.sh && pass "install.sh syntax OK"
21+
22+
step "bash -n on release.sh"
23+
bash -n release.sh && pass "release.sh syntax OK"
24+
25+
step "Syntax check all .sh files by shebang (exclude backups/)"
26+
find . \
27+
-name "*.sh" \
28+
-not -path "./.git/*" \
29+
-not -path "./backups/*" \
30+
-print0 \
31+
| while IFS= read -r -d '' f; do
32+
shebang="$(head -1 "$f")"
33+
if [[ "$shebang" == *zsh* ]]; then
34+
zsh -n "$f" || { printf "\033[1;31m[FAIL]\033[0m zsh -n: %s\n" "$f" >&2; exit 1; }
35+
else
36+
bash -n "$f" || { printf "\033[1;31m[FAIL]\033[0m bash -n: %s\n" "$f" >&2; exit 1; }
37+
fi
38+
done
39+
pass "all .sh files pass syntax check"
40+
41+
step "mqlaunch doctor --json"
42+
if command -v mqlaunch >/dev/null 2>&1; then
43+
mqlaunch doctor --json | grep -q '"status"' && pass "mqlaunch doctor --json"
44+
else
45+
printf "[SKIP] mqlaunch not in PATH — run after install\n"
46+
fi
47+
48+
step "mqlaunch selftest"
49+
if command -v mqlaunch >/dev/null 2>&1; then
50+
mqlaunch selftest && pass "mqlaunch selftest"
51+
else
52+
printf "[SKIP] mqlaunch not in PATH — run after install\n"
53+
fi
54+
55+
printf "\n\033[1;32m=== install smoke test passed ===\033[0m\n"

0 commit comments

Comments
 (0)