feat(cli,registry): introduce --herdr-workspace option and decouple socket fallback chains
This commit is contained in:
@@ -121,6 +121,19 @@ def get_job_status(s):
|
||||
return (jid, 'unknown')
|
||||
|
||||
|
||||
def _slug(path):
|
||||
if not path:
|
||||
return ''
|
||||
import re
|
||||
a = os.path.abspath(path)
|
||||
parent = os.path.basename(os.path.dirname(a)) or 'workspace'
|
||||
work = os.path.basename(a) or 'root'
|
||||
if parent in ('/', '.'): parent = 'workspace'
|
||||
if work in ('/', '.'): work = 'root'
|
||||
s = f'{parent}-{work}'.lower().replace('_', '-')
|
||||
return re.sub(r'[^a-zA-Z0-9-]', '', s).lstrip('-')
|
||||
|
||||
|
||||
sessions_detail = []
|
||||
from lib_py.agents.sanitize import sanitize_herdr_agent_name as _sanitize
|
||||
|
||||
@@ -129,15 +142,18 @@ def is_alive(name, server):
|
||||
|
||||
for s in d.get('herdr_sessions', []):
|
||||
name = s.get('name', '?')
|
||||
server = s.get('herdr_session') or s.get('herdr_server') or s.get('herdr_workspace') or 'default'
|
||||
# herdr_workspace 는 워크스페이스 *라벨* 이지 소켓 이름이 아니다.
|
||||
server = s.get('herdr_session') or s.get('herdr_server') or 'default'
|
||||
jid, jstatus = get_job_status(s)
|
||||
pane = s.get('pane') or {}
|
||||
wslabel = s.get('herdr_workspace') or _slug(pane.get('cwd', '')) or None
|
||||
sessions_detail.append({
|
||||
# Fields named/typed to match the reviewed D8 contract
|
||||
# (.mam/jobs/40bdce88/claude-reports/report-final.md §3.1) exactly —
|
||||
# mam_core maps this straight onto its Session/Pane/Drift models.
|
||||
'name': name,
|
||||
'server': server,
|
||||
'herdr_workspace': wslabel,
|
||||
'status': s.get('status', '?'),
|
||||
'herdr_alive': is_alive(name, server),
|
||||
'cmd': pane.get('cmd'),
|
||||
@@ -224,13 +240,26 @@ def get_job_status(s):
|
||||
return (jid, 'unknown')
|
||||
|
||||
|
||||
def _slug(path):
|
||||
if not path:
|
||||
return ''
|
||||
import re
|
||||
a = os.path.abspath(path)
|
||||
parent = os.path.basename(os.path.dirname(a)) or 'workspace'
|
||||
work = os.path.basename(a) or 'root'
|
||||
if parent in ('/', '.'): parent = 'workspace'
|
||||
if work in ('/', '.'): work = 'root'
|
||||
s = f'{parent}-{work}'.lower().replace('_', '-')
|
||||
return re.sub(r'[^a-zA-Z0-9-]', '', s).lstrip('-')
|
||||
|
||||
|
||||
from lib_py.agents.sanitize import sanitize_herdr_agent_name as _sanitize
|
||||
|
||||
sessions = d.get('herdr_sessions', [])
|
||||
print(f"agent-sessions status — {drift['timestamp']} (herdr_confirmed={drift['herdr_confirmed']})")
|
||||
print("=" * 136)
|
||||
print(f"{'NAME':<44} {'WORKSPACE':<12} {'YAML':<10} {'HERDR':<6} {'CMD':<6} {'RESUME':<8} {'JOB_ID':<10} {'JOB_STATUS':<12} DRIFT")
|
||||
print("-" * 136)
|
||||
print("=" * 150)
|
||||
print(f"{'NAME':<44} {'SOCKET':<12} {'WORKSPACE':<14} {'YAML':<10} {'HERDR':<6} {'CMD':<6} {'RESUME':<8} {'JOB_ID':<10} {'JOB_STATUS':<12} DRIFT")
|
||||
print("-" * 150)
|
||||
if not sessions:
|
||||
print("(no sessions registered)")
|
||||
def is_alive(name, server):
|
||||
@@ -238,14 +267,16 @@ def is_alive(name, server):
|
||||
|
||||
for s in sessions:
|
||||
name = s.get('name', '?')
|
||||
server = s.get('herdr_session') or s.get('herdr_server') or s.get('herdr_workspace') or 'default'
|
||||
# herdr_workspace 는 워크스페이스 *라벨* 이지 소켓 이름이 아니다.
|
||||
server = s.get('herdr_session') or s.get('herdr_server') or 'default'
|
||||
wslabel = s.get('herdr_workspace') or _slug((s.get('pane') or {}).get('cwd', '')) or '-'
|
||||
status = s.get('status', '?')
|
||||
herdr = 'alive' if is_alive(name, server) else 'dead'
|
||||
cmd = (s.get('pane') or {}).get('cmd', '?')
|
||||
res = resume_on_disk(s)
|
||||
jid, jstatus = get_job_status(s)
|
||||
drs = ','.join(drift_by_name.get(name, [])) or '-'
|
||||
print(f"{name:<44} {server:<12} {status:<10} {herdr:<6} {cmd:<6} {res:<8} {jid:<10} {jstatus:<12} {drs}")
|
||||
print(f"{name:<44} {server:<12} {wslabel:<14} {status:<10} {herdr:<6} {cmd:<6} {res:<8} {jid:<10} {jstatus:<12} {drs}")
|
||||
# drifts not tied to a registered row (e.g. class B unregistered, class D cache)
|
||||
known = {s.get('name') for s in sessions}
|
||||
extra = [dr for dr in drift.get('drifts', []) if dr['name'] not in known]
|
||||
|
||||
Reference in New Issue
Block a user