Files
dingtalk-workspace-cli/skills/mono/scripts/report_inbox_today.py
修雨 5ce7cb61b0 feat(skill): dws skill setup with mono/multi modes (#332)
新增 `dws skill setup` 交互式安装命令,支持单产品(mono)和多产品(multi,标记为试验版)两种 skill 布局,并与开源 dws v1.0.30 命令对齐。

主要变更:
- 骨架:skills/ 拆为 skills/mono/ 和 skills/multi/(29 个产品 skill),git rename 保留历史
- 命令:新增 `skill setup` cobra 子命令,支持 --mode、--target、--source、--yes,huh 交互
  - multi 模式支持 -s/--skill、-x/--exclude 按产品选择
  - 覆盖全部 14 个 agent home 目录(与 install.sh 一致)
- 发布:install.sh / install.ps1 / post-goreleaser.sh 改读 skills/mono;dws-skills.zip 同时包含 mono 和 multi 内容;~/.dws 本地缓存
- 内容对齐:删除 8 个仅内部使用的产品 skill、dingtalk-a2a;修正 mono/multi 共 15+ 处命令引用以匹配 OSS dws v1.0.30;chat skill 从 dws-wukong 回移更新
- 漂移清理:物理删除 skill 文档中 OSS 未暴露的命令,true-fail 命令转为 caveat;--help diff 100% 覆盖审计
- 测试:新增 Layer A 静态命令调度验证 + Layer B 端到端 mock 调度验证
- 同步 main:drive 9 个命令同步到 mono/multi skill
2026-05-26 09:17:37 +08:00

115 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""
查看今天收到的日志列表及详情
用法:
python report_inbox_today.py
python report_inbox_today.py --days 3 # 最近 3 天
python report_inbox_today.py --dry-run
"""
import sys
import json
import subprocess
import argparse
from datetime import datetime, timedelta
from typing import List, Any, Optional
def run_dws(
args: List[str], dry_run: bool = False,
) -> Optional[Any]:
cmd = ['dws'] + args
if dry_run:
print(f"[dry-run] {' '.join(cmd)}")
return None
try:
result = subprocess.run(
cmd, capture_output=True, text=True, timeout=60
)
if result.returncode != 0:
print(f"错误:{result.stderr.strip()}", file=sys.stderr)
return None
return json.loads(result.stdout)
except (subprocess.TimeoutExpired, json.JSONDecodeError,
FileNotFoundError) as e:
print(f"错误:{e}", file=sys.stderr)
return None
def to_iso(dt: datetime) -> str:
return dt.strftime('%Y-%m-%dT%H:%M:%S+08:00')
def main():
parser = argparse.ArgumentParser(
description='查看收到的日志'
)
parser.add_argument(
'--days', type=int, default=1, help='查询天数 (默认 1)'
)
parser.add_argument('--dry-run', action='store_true')
args = parser.parse_args()
now = datetime.now()
start = now - timedelta(days=args.days)
start = start.replace(hour=0, minute=0, second=0)
label = '今天' if args.days == 1 else f'最近 {args.days} 天'
print(f'📓 查看{label}收到的日志...\n')
data = run_dws([
'report', 'list',
'--start', to_iso(start),
'--end', to_iso(now),
'--cursor', '0',
'--size', '20',
'--format', 'json',
], dry_run=args.dry_run)
if args.dry_run:
return
if not data:
print('未查到日志')
return
reports = (data if isinstance(data, list)
else data.get('result', data.get('reports', [])))
if not reports:
print(' ✅ 暂无收到的日志')
return
print(f"📓 {label}日志 ({len(reports)} 条)")
print('=' * 50)
for r in reports:
rid = r.get('reportId') or r.get('id', '')
creator = r.get('creatorName') or r.get('creator', '未知')
template = r.get('templateName') or r.get('template', '')
create_time = r.get('createTime', '')
if isinstance(create_time, (int, float)):
create_time = datetime.fromtimestamp(
create_time / 1000
).strftime('%Y-%m-%d %H:%M')
print(f"\n 📝 {template or '日志'} - {creator}")
print(f" 时间: {create_time}")
print(f" ID: {rid}")
if rid:
detail = run_dws([
'report', 'detail',
'--report-id', rid, '--format', 'json',
])
if detail and isinstance(detail, dict):
contents = detail.get('contents', [])
for c in contents[:3]:
key = c.get('key') or c.get('title', '')
val = c.get('value') or c.get('content', '')
if key and val:
print(f" {key}: {str(val)[:60]}")
if __name__ == '__main__':
main()