mirror of
https://github.com/dtzp555-max/ocp.git
synced 2026-07-19 09:44:07 +00:00
refactor: hoist port literal to lib/constants.mjs + CI gate (v3.16.4) (#98)
Closes the structural side of the port-drift cascade addressed by
v3.16.2/v3.16.3. Those releases reverted the literal line-by-line; this
one removes the invitation to drift.
Changes:
* NEW lib/constants.mjs — exports DEFAULT_PORT=3456, LOCAL_HOST,
OPENAI_API_BASE, LOCAL_PROXY_URL.
* server.mjs / setup.mjs / scripts/upgrade.mjs / scripts/doctor.mjs
(x2) / scripts/sync-openclaw.mjs all import DEFAULT_PORT from
lib/constants.mjs instead of hardcoding "3456".
* .github/workflows/alignment.yml:
- path filter extended to setup.mjs, scripts/**, lib/**,
ocp, ocp-connect.
- NEW job port-spot hard-fails any PR that introduces a hardcoded
"3478" or "3456" literal outside EXEMPT_REGEX (lib/constants.mjs,
test-features.mjs, ocp/ocp-connect bash CLIs, docs, the workflow
itself).
* Doc-comment rewording so CI grep finds zero hits.
No behavior change for any user. CLAUDE_PROXY_PORT env var still wins
at runtime; only the unset-env fallback now flows through one constant.
ALIGNMENT.md note: server.mjs change is one import + one literal swap,
mechanical. No cli.js operation changed; the citation requirement does
not apply.
cli.js: not applicable — mechanical refactor, no behavior change.
Co-authored-by: dtzp555 <dtzp555@gmail.com>
This commit is contained in:
@@ -4,6 +4,11 @@ on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'server.mjs'
|
||||
- 'setup.mjs'
|
||||
- 'scripts/**'
|
||||
- 'lib/**'
|
||||
- 'ocp'
|
||||
- 'ocp-connect'
|
||||
- '.github/workflows/alignment.yml'
|
||||
|
||||
jobs:
|
||||
@@ -66,6 +71,80 @@ jobs:
|
||||
|
||||
echo "Blacklist scan clean."
|
||||
|
||||
port-spot:
|
||||
name: port literal SPOT (hard fail)
|
||||
# Background: from 2026-05-08 (PR #71 dogfood accident) through 2026-05-13
|
||||
# a hardcoded "3478" in scripts/upgrade.mjs + scripts/doctor.mjs cascaded
|
||||
# into wrong baseUrl writes for the OpenClaw "claude-local" provider,
|
||||
# taking out the "大内总管" Telegram agent.
|
||||
#
|
||||
# Rule: the only places allowed to write a literal port number in source
|
||||
# are (a) lib/constants.mjs (the SPOT), (b) bash scripts ocp / ocp-connect
|
||||
# (which can't import .mjs and must keep the literal in sync — flagged
|
||||
# with a `// keep in sync with lib/constants.mjs` style comment), and
|
||||
# (c) test-features.mjs (intentionally pins historical ports for plist /
|
||||
# systemd parser tests). Everything else MUST import from lib/constants.mjs.
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Scan for hardcoded port literals outside SPOT
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
# Files/paths exempt from the SPOT requirement.
|
||||
EXEMPT_REGEX='^(lib/constants\.mjs|test-features\.mjs|ocp|ocp-connect|CHANGELOG\.md|README\.md|docs/|\.github/workflows/alignment\.yml)'
|
||||
|
||||
# Hardcoded port literals to forbid in non-exempt source.
|
||||
FORBIDDEN_PORTS=("3478" "3456")
|
||||
|
||||
FAIL=0
|
||||
for port in "${FORBIDDEN_PORTS[@]}"; do
|
||||
HITS="$(git ls-files | grep -E '\.(mjs|js|ts|json)$' \
|
||||
| xargs grep -n -E "[^0-9]${port}[^0-9]" 2>/dev/null \
|
||||
| grep -v -E "${EXEMPT_REGEX}" \
|
||||
|| true)"
|
||||
if [ -n "$HITS" ]; then
|
||||
echo "::error::Hardcoded port literal '${port}' found outside lib/constants.mjs:"
|
||||
echo "$HITS"
|
||||
FAIL=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$FAIL" -ne 0 ]; then
|
||||
cat <<'EOF'
|
||||
|
||||
============================================================
|
||||
PORT LITERAL SPOT VIOLATION
|
||||
============================================================
|
||||
A hardcoded TCP port literal was found in a source file
|
||||
that should import from lib/constants.mjs instead.
|
||||
|
||||
Background: this rule exists because between 2026-05-08 and
|
||||
2026-05-13 a stray hardcoded "3478" in scripts/upgrade.mjs
|
||||
and scripts/doctor.mjs cascaded into downstream OpenClaw
|
||||
config writes, taking out the OpenClaw Telegram agent.
|
||||
See v3.16.3 CHANGELOG and lib/constants.mjs header comment.
|
||||
|
||||
Required action:
|
||||
1. Import DEFAULT_PORT (or related constant) from
|
||||
lib/constants.mjs instead of hardcoding the literal.
|
||||
2. If the file genuinely cannot import .mjs (e.g. bash
|
||||
script), add it to EXEMPT_REGEX in this workflow and
|
||||
add a `keep in sync with lib/constants.mjs` comment
|
||||
at the reference.
|
||||
3. For test files that intentionally pin historical ports
|
||||
(test-features.mjs), the regex already exempts them.
|
||||
|
||||
============================================================
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Port SPOT scan clean."
|
||||
|
||||
commit-citation:
|
||||
name: commit message citation (soft check)
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
Reference in New Issue
Block a user