feat: add local project and kanban usage surfaces#2
Conversation
|
bugbot run |
|
bugbot run |
|
bugbot run |
|
bugbot run |
|
bugbot run |
|
bugbot run |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit aaddb2f. Configure here.
Merge-captain review: changes requestedI found a blocking Review-gate state-machine regression on the current head Blocking finding:
Required fix:
Validation I ran:
I stopped the local Bugbot polling after finding this blocker; Cursor Bugbot was still in progress at that point. |
|
Fixed the mergecaptain blocker on current head |
|
Fixed Cursor Bugbot issue |
|
Merge-captain blocker on current head The Review gate still does not work end-to-end for real mergecaptain workers because Repro from TMP=$(mktemp -d)
DB="$TMP/kanban.db"
HERMES_HOME=/Users/openclaw/ai-os-migration/configs/hermes \
HERMES_KANBAN_DB="$DB" \
./venv/bin/python - <<'PY' > "$TMP/task.txt"
from hermes_cli import kanban_db as kb
kb.init_db()
with kb.connect() as conn:
t=kb.create_task(conn,title='profile review config gap',assignee='default')
impl=kb.claim_task(conn,t)
assert kb.complete_task(conn,t,summary='ready',expected_run_id=impl.current_run_id)
task=kb.get_task(conn,t)
print(t, task.status, task.assignee)
PY
TID=$(awk '{print $1}' "$TMP/task.txt")
HERMES_HOME=/Users/openclaw/ai-os-migration/configs/hermes/profiles/mergecaptain \
HERMES_PROFILE=mergecaptain \
HERMES_KANBAN_DB="$DB" \
./venv/bin/python - <<PY
from hermes_cli import kanban_db as kb
with kb.connect() as conn:
review=kb.claim_review_task(conn,'$TID')
assert kb.block_task(conn,'$TID',reason='review rejected',expected_run_id=review.current_run_id)
task=kb.get_task(conn,'$TID')
run=kb.latest_run(conn,'$TID')
print('after_block', task.status, task.assignee, run.status, run.metadata)
print('last_event', kb.list_events(conn,'$TID')[-1].kind, kb.list_events(conn,'$TID')[-1].payload)
PYObserved: Required fix:
Validation run on current head before blocking:
|
|
Cursor/Bugbot sweep final status for
|
…, ClawHub, browse.sh, OpenAI, …) (NousResearch#32336) The Skills Hub page was stuck on a stale Feb 25 snapshot, showing only Built-in + Optional + Anthropic + LobeHub. The unified index already has 2078 skills from skills.sh / ClawHub / LobeHub / GitHub taps / Claude Marketplace, and BrowseShSource adds another ~330 — none of it was reaching the page. Changes: - website/scripts/extract-skills.py: read website/static/api/skills-index.json (the unified multi-source catalog, rebuilt twice daily) as the canonical external source. Keep the legacy skills/index-cache/ fallback for offline builds. Add friendly per-source labels (skills.sh, ClawHub, browse.sh, OpenAI, HuggingFace, Anthropic, LobeHub, etc.) and per-entry installCmd. - website/src/pages/skills/index.tsx: add source pills + ordering for the 11 new sources; render installCmd from the index entry. - website/scripts/prebuild.mjs: when no local skills-index.json exists, fetch the live one from hermes-agent.nousresearch.com so local 'npm run build' matches production without burning GitHub API quota. - scripts/build_skills_index.py: crawl BrowseShSource so browse.sh entries land in the unified index. Adjust source_order. - tools/skills_hub.py: GitHubSource.DEFAULT_TAPS — openai/skills moved its skills into skills/.curated/ and skills/.system/, so add both as explicit taps (the listing code skips dotted dirs by design). Drop VoltAgent/awesome-agent-skills (README-only, no SKILL.md files) and MiniMax-AI/cli (singular skill, not a tap directory). Net effect: github source jumps from 83 → 143 skills, with OpenAI properly included. - .github/workflows/deploy-site.yml: build the unified index BEFORE running extract-skills.py — previous order meant extract-skills always fell back to the legacy cache. Drop the 'skip if file exists' guard; the file is gitignored and must be rebuilt every deploy. - .github/workflows/skills-index.yml: drop the broken 'deploy-with-index' job (it cp'd 'landingpage/\*' which no longer exists, failing every cron run since the landingpage move). Replace it with a workflow_dispatch trigger of deploy-site.yml so the index refresh still reaches production on schedule. - website/docs/user-guide/features/skills.md: drop VoltAgent from the default-taps doc list to match the code. Before: 695 skills (Built-in 90, Optional 84, Anthropic 16, LobeHub 505). After: 2168 skills across 9 source pills, including the 1212 skills.sh entries the user expected to see.
bd876a8 to
7976c00
Compare
| -t "${IMAGE_NAME}:main" \ | ||
| -t "${IMAGE_NAME}:latest" \ | ||
| "${args[@]}" | ||
| fi |
There was a problem hiding this comment.
:latest tag races and regresses on backport releases
Medium Severity
Both main pushes and releases unconditionally tag :latest, removing the ancestor check that previously prevented backport releases from dragging :latest backwards. A patch release on an older branch (e.g., v1.1.6 after v1.2.3) will overwrite :latest with older code. Additionally, every commit to main now overwrites :latest, making it track unstable dev code rather than the latest stable release—conflating the purpose of :main and :latest.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 7c0bd37. Configure here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 3 total unresolved issues (including 2 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 7ed5aa8. Configure here.
| tag_commit="$(git -C "$GITHUB_WORKSPACE" rev-parse "${TAG}^{commit}")" | ||
| latest_revision="" | ||
| if latest_metadata="$(docker buildx imagetools inspect "${IMAGE_NAME}:latest" --format '{{json .}}' 2>/dev/null)"; then | ||
| latest_revision="$(python3 -c 'import json,sys; data=json.load(sys.stdin); print((data.get("image") or {}).get("labels", {}).get("org.opencontainers.image.revision", ""))' <<<"$latest_metadata")" |
There was a problem hiding this comment.
Label extraction uses wrong JSON key casing
Medium Severity
The Python one-liner extracting the OCI revision label from docker buildx imagetools inspect --format '{{json .}}' uses data.get("image"), but the Go template field is .Image (uppercase). Go's default JSON serialization preserves the uppercase field name, so data.get("image") always returns None, making latest_revision always empty. This causes the :latest backport guard to silently fall through to the weaker origin/main ancestry check instead of comparing against the actual current :latest commit.
Reviewed by Cursor Bugbot for commit 7ed5aa8. Configure here.


Purpose
This PR is for local/fork review only. It is not intended for NousResearch/hermes-agent upstream merge.
Summary
Codex/Cursor sweep summary
Current accepted head:
8f95720bbfb85175187f83ebba28f8f739949c30Bugs found and fixed
19cfaecf-6ed7-42d6-bda0-7fbc02f7a571: release manifests always include the release tag and only release events can move:latest; main pushes publish:mainonly.b9ce1492-dc9d-4442-b1f3-5586567bf412::latestupdates are guarded by the current registryorg.opencontainers.image.revisionplus anorigin/mainancestry fallback, so backport releases cannot move:latestbackwards.85d87d13-2d27-415b-a339-8197f901ef5c: Docker label extraction reads bothImage/Labelsandimage/labelsJSON casing fromdocker buildx imagetools inspect.Implemented changes in the PR
scripts/update_local_fork_and_restart.shas the operator continuity wrapper around the narrowscripts/update_local_fork.shGit helper.HERMES_HOMEby default, clean checkout/branch switching, pre-rebase Hermes backup, editable reinstall viauv pip install --python ./venv/bin/python -e '.[all]', config migrate/check, scalar continuity settings only, YAML verification for review-agent skills, system LaunchDaemon-first gateway restart, GUI LaunchAgent-unloaded verification, no standalone Kanban daemon, dashboard restart, and post-upgrade health checks.hermes status --all, added a non-secret Telegram connection assertion, and verifies post-restart Kanban dispatcher activity from captured log offsets for both LaunchDaemon and manual-fallback paths.Validation
bash -n scripts/update_local_fork_and_restart.sh— passed.scripts/update_local_fork_and_restart.sh --help— passed.scripts/update_local_fork_and_restart.sh --hermes-home /Users/openclaw/ai-os-migration/configs/hermes --dry-run— passed without mutating state.ruff check hermes_cli/kanban_db.py hermes_cli/kanban.py tools/kanban_tools.py tests/hermes_cli/test_kanban_db.py tests/hermes_cli/test_kanban_core_functionality.py tests/test_docker_publish_workflow.py— passed.env -u HERMES_KANBAN_BOARD -u HERMES_KANBAN_DB -u HERMES_KANBAN_TASK -u HERMES_KANBAN_RUN_ID -u HERMES_KANBAN_CLAIM_LOCK -u HERMES_KANBAN_WORKSPACE -u HERMES_KANBAN_WORKSPACES_ROOT -u HERMES_KANBAN_REQUIRE_REVIEW_BEFORE_DONE -u HERMES_KANBAN_MERGE_CAPTAIN_PROFILE ./venv/bin/python -m pytest tests/hermes_cli/test_kanban_db.py tests/hermes_cli/test_kanban_core_functionality.py tests/test_docker_publish_workflow.py -q— 406 passed, 1 skipped.python3 /Users/openclaw/.codex/skills/cursor-bugbot-sweep/scripts/poll_cursor_review.py --repo the24thLetter/hermes-agent --pr 2 --head-sha current --once— current-head clean for8f95720bbfb85175187f83ebba28f8f739949c30; check-run metadata still lists the three fixed prior Docker threads above as unresolved in GitHub.gh pr checks 2 --repo the24thLetter/hermes-agent --watch --interval 10— all required checks passing; Docker build/merge/save-duration jobs are skipped for this fork PR.Local fork update/restart wrapper
scripts/update_local_fork_and_restart.shas the operator continuity wrapper around the narrowscripts/update_local_fork.shGit helper.HERMES_HOME, clean checkout/branch switching, Hermes quick backup, editable reinstall viauv pip install --python ./venv/bin/python -e '.[all]', config migrate/check, scalar continuity settings, YAML-only review skill verification, system LaunchDaemon-first gateway restart, GUI LaunchAgent-unloaded verification, no standalone Kanban daemon, dashboard restart, and post-upgrade health checks.Validation:
bash -n scripts/update_local_fork_and_restart.shscripts/update_local_fork_and_restart.sh --helpscripts/update_local_fork_and_restart.sh --dry-rungit diff --cached --checkshellchecknot installed locally;bash -nused as shellcheck-equivalent validation.Note
High Risk
Changes PID 1, image entrypoint, Docker Hub tag semantics, and credential/API client behavior—any regression affects every container user and long-running sessions.
Overview
This changeset is dominated by container runtime and CI delivery, not the Kanban/local-fork items named in the PR title (those do not appear in the provided diff).
Docker image moves from
tini+entrypoint.shto s6-overlay (/init,stage2-hook,main-wrapper, supervised services), ships Node 22 from an upstream stage, bakesHERMES_GIT_SHAfor supportability, adds adocker execprivilege-drop shim, extra Python provider extras, and tighter build-context ignores. Smoke tests now hit the real image ENTRYPOINT (fixing a no-op after s6 migration).Docker publish simplifies tagging:
:mainon main pushes only; releases tag the version and move:latestonly when the release commit is not behind current:latest/origin/main(removes separatemove-main/move-shajobs). Docker integration tests run in the amd64 publish job against the already-loaded:testimage. New hadolint/shellcheck workflow lints the Dockerfile anddocker/scripts.CI tests switch from single-job
pytest -n autoto a 6-shard matrix driven byscripts/run_tests_parallel.pywith merged duration caching. Docs deploy always rebuilds the skills index; scheduled skills-index runs triggerdeploy-siteinstead of duplicating deploy; a 4-hour freshness watchdog opens GitHub issues on stale live index.Agent/runtime fixes include credential-pool provider mismatch guards and faster rotation on exhausted keys, custom-provider
extra_bodymerge, platformenabled_toolsetsgating for memory/context tools, MiniMax OAuth per-request tokens, atomic rollback on in-place model switch, safer TCP shutdown without cross-threadclose(NousResearch#29507), and ACP delivery whentransform_llm_outputchanges the final text after streaming. Anthropic adapter is refactored with safer OAuth credential writes and MCP name double-prefix avoidance.Supply-chain audit uses three-dot diffs and narrows install-hook file detection to repo-root paths to cut false positives.
Reviewed by Cursor Bugbot for commit 8f95720. Bugbot is set up for automated code reviews on this repo. Configure here.