ci(#2): dogfood apexstack CI with pr-title, markdown, shell, link checks#26
Conversation
- Add .github/workflows/pr-title-check.yml (copied verbatim from golden-paths/pipelines/pr-title-check.yml) - Add .github/workflows/markdown-lint.yml running markdownlint-cli2 on **/*.md - Add .github/workflows/shellcheck.yml running ludeeus/action-shellcheck on .claude/hooks - Add .github/workflows/link-check.yml running lycheeverse/lychee-action on site/index.html and **/*.md - Add .markdownlint.json with a relaxed ruleset (real problems, not cosmetic nits) Refs #2
atlas-apex
left a comment
There was a problem hiding this comment.
Code Review: PR #26
Commit: d37be94dca32ad090f15bc69f07860b84ada7ad6
Summary
Adds 4 GitHub Actions workflows to dogfood CI on the apexstack repo itself: pr-title-check, markdown-lint, shellcheck, and link-check. Plus a relaxed .markdownlint.json config. Well-scoped, clean YAML, good PR description.
Checklist Results
- N/A Architecture & DDD: Not applicable (CI config, no domain code)
- PASS Code Quality: YAML is clean, well-commented, appropriate
permissionsblocks - N/A Testing: CI-only change, self-testing by nature (first run is this PR)
- PASS Security: Minimal permissions (
contents: read,pull-requests: write), no secrets - PASS Performance: Path filters on all workflows prevent unnecessary runs
- PASS PR Description & Glossary: Glossary present with 5 terms, clear summary, deviations documented
- N/A Technical Decisions (AgDR): No novel decisions -- tools are industry-standard choices for their category (markdownlint for MD, shellcheck for sh, lychee for links). The pr-title-check is copied verbatim from the golden-path.
Issues Found
None blocking.
Suggestions (nice-to-have, not blocking)
-
ShellCheck will likely flag
validate-pr-create.shline 101:printf "$ERRORS"is SC2059 (variable used as format string). Since severity iswarning, this would fail the check. Considerprintf '%s' "$ERRORS"in a follow-up PR, or add a# shellcheck disable=SC2059directive if the%formatting is intentional. Not blocking this PR since fixing hooks is a separate ticket. -
markdownlint-cli2-action pinned at
@v16: Latest is v23. Thev16tag still works but you may want to bump in a follow-up for any new rule support. Same for lychee-action:@v2resolves to a major tag (currently v2.8.0), which is fine for auto-patching. -
shellcheck action pinned at
@2.0.0: This IS the latest release, good. -
PR title regex vs git-conventions.md: The workflow checks for ticket ID presence anywhere in the title (
/#\d+/or/[A-Z]{2,10}-\d+/) but does NOT enforce the fulltype(TICKET): descriptionformat from git-conventions.md. This is the same as the golden-path template, so it's consistent, but a title like"random #42 text"would pass CI. The local hookvalidate-pr-create.shenforces the stricter format, so this is defense-in-depth, not a gap. -
Link-check
--accept 429: Smart -- avoids false positives from rate-limited sites (GitHub, npm). The--exclude-loopback --exclude-privateflags are reasonable for docs that referencelocalhostexamples.
Surprising
The pr-title-check is byte-identical to the golden-path template. That's the right call -- dogfood the exact artifact adopters use.
Verdict
COMMENT -- Looks good. No blocking issues. The ShellCheck printf warning in existing hooks is worth noting but is a pre-existing issue, not introduced by this PR.
Rex (Code Reviewer Agent)
Reviewed commit: d37be94dca32ad090f15bc69f07860b84ada7ad6
Co-authored-by: Cursor <cursoragent@cursor.com>
Summary
ApexStack now dogfoods its own CI. Four GitHub Actions workflows added so that PRs to the framework repo itself get the same quality gates it ships to adopters via
golden-paths/pipelines/.Refs #2
What changed
.github/workflows/pr-title-check.ymlgolden-paths/pipelines/pr-title-check.yml..github/workflows/markdown-lint.ymlmarkdownlint-cli2on**/*.md. Catches broken markdown and inconsistent headings..github/workflows/shellcheck.ymlshellcheckon.claude/hooks/*.sh. Catches portability bugs in hook scripts..github/workflows/link-check.ymllycheeonsite/index.htmland**/*.md. Includes weekly cron for link-rot detection..markdownlint.jsonDeviations from the ticket
html-validate.ymlskipped —site/index.htmlis ~2000 lines of hand-written marketing HTML with hero animations and custom attributes. html-validate would need non-trivial config and likely false-positive heavily. Not worth the noise.link-check.yml— catches upstream link rot between PRs at zero extra config cost.How it was tested
YAML.load_file(Ruby) — valid syntax.markdownlint.jsonvalidated withpython3 json— valid JSONGlossary
.markdownlint.json.golden-paths/pipelines/that adopters copy into their own repos.Test plan
pull_request).markdownlint.jsonconfig doesn't produce false-positive noise.claude/hooks/🤖 Generated with Claude Code