Add 39 shared skills from local agent inventory
Sources: ~/.openclaw/skills, ~/.agents/skills, workshop-skills, workspace/skills
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
#!/usr/bin/env python3
|
||||
"""创建早报页面,自动挂到按周分组目录下"""
|
||||
import json, sys, os, argparse
|
||||
from datetime import datetime
|
||||
import subprocess
|
||||
|
||||
SCRIPTS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
SPACE_ID = os.environ.get('FEISHU_SPACE_ID', '7664817589230570761')
|
||||
DIGEST_PARENT = os.environ.get('FEISHU_DIGEST_PARENT', 'BH8AwLgJhipBcUkehCAcyKvDngE')
|
||||
|
||||
def run_script(name, *args):
|
||||
cmd = ['python3', os.path.join(SCRIPTS_DIR, name)] + list(args)
|
||||
r = subprocess.run(cmd, capture_output=True, text=True)
|
||||
if r.returncode != 0:
|
||||
raise Exception(f"{name} failed: {r.stderr}")
|
||||
return json.loads(r.stdout)
|
||||
|
||||
def get_token():
|
||||
r = subprocess.run(['python3', os.path.join(SCRIPTS_DIR, 'init_token.py')],
|
||||
capture_output=True, text=True)
|
||||
return json.loads(r.stdout)['token']
|
||||
|
||||
def create_digest(title, content_file=None):
|
||||
import requests
|
||||
token = get_token()
|
||||
h = {'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json'}
|
||||
|
||||
# Find or create this week's node
|
||||
from datetime import timedelta
|
||||
today = datetime.now()
|
||||
iso_week = today.isocalendar()[1]
|
||||
week_end = today + timedelta(days=(6 - today.weekday()))
|
||||
week_title = f"{today.year}年第{iso_week}周 {today.strftime('%m.%d')}-{week_end.strftime('%m.%d')}"
|
||||
|
||||
# List children of digest parent
|
||||
r = requests.get(
|
||||
f'https://open.feishu.cn/open-apis/wiki/v2/spaces/{SPACE_ID}/nodes',
|
||||
params={'parent_node_token': DIGEST_PARENT}, headers=h
|
||||
)
|
||||
kids = r.json()['data']['items']
|
||||
|
||||
week_token = None
|
||||
for k in kids:
|
||||
if str(iso_week) in k['title']:
|
||||
week_token = k['node_token']
|
||||
break
|
||||
|
||||
if not week_token:
|
||||
r = requests.post(
|
||||
f'https://open.feishu.cn/open-apis/wiki/v2/spaces/{SPACE_ID}/nodes',
|
||||
headers=h,
|
||||
json={'obj_type': 'docx', 'node_type': 'origin', 'parent_node_token': DIGEST_PARENT, 'title': week_title}
|
||||
)
|
||||
data = r.json()
|
||||
if data.get('code') != 0:
|
||||
raise Exception(f"Create week node failed: {data.get('msg')}")
|
||||
week_token = data['data']['node']['node_token']
|
||||
|
||||
# Idempotency guard: reuse existing digest node with the same title
|
||||
# (cron retries after timeout would otherwise create duplicate documents)
|
||||
r = requests.get(
|
||||
f'https://open.feishu.cn/open-apis/wiki/v2/spaces/{SPACE_ID}/nodes',
|
||||
params={'parent_node_token': week_token}, headers=h
|
||||
)
|
||||
existing = r.json().get('data', {}).get('items', [])
|
||||
today_str = today.strftime('%m.%d')
|
||||
for k in existing:
|
||||
ktitle = (k.get('title') or '').strip()
|
||||
if ktitle == title.strip() or today_str in ktitle:
|
||||
node = {'node_token': k['node_token'], 'obj_token': k['obj_token']}
|
||||
print(json.dumps({'node_token': node['node_token'], 'obj_token': node['obj_token'], 'reused': True}))
|
||||
if content_file:
|
||||
subprocess.run(
|
||||
['python3', os.path.join(SCRIPTS_DIR, 'wiki_write.py'), '--node', node['node_token'], '--file', content_file],
|
||||
check=True
|
||||
)
|
||||
return node
|
||||
|
||||
# Create today's digest
|
||||
r = requests.post(
|
||||
f'https://open.feishu.cn/open-apis/wiki/v2/spaces/{SPACE_ID}/nodes',
|
||||
headers=h,
|
||||
json={'obj_type': 'docx', 'node_type': 'origin', 'parent_node_token': week_token, 'title': title}
|
||||
)
|
||||
data = r.json()
|
||||
if data.get('code') != 0:
|
||||
raise Exception(f"Create digest failed: {data.get('msg')}")
|
||||
|
||||
node = data['data']['node']
|
||||
print(json.dumps({'node_token': node['node_token'], 'obj_token': node['obj_token']}))
|
||||
|
||||
# Write content if provided
|
||||
if content_file:
|
||||
node_token = node['node_token']
|
||||
subprocess.run(
|
||||
['python3', os.path.join(SCRIPTS_DIR, 'wiki_write.py'), '--node', node_token, '--file', content_file],
|
||||
check=True
|
||||
)
|
||||
|
||||
return node
|
||||
|
||||
if __name__ == '__main__':
|
||||
p = argparse.ArgumentParser()
|
||||
p.add_argument('--title', required=True, help='Digest title')
|
||||
p.add_argument('--content', default=None, help='Content JSON file')
|
||||
args = p.parse_args()
|
||||
|
||||
try:
|
||||
create_digest(args.title, args.content)
|
||||
except Exception as e:
|
||||
print(f'Error: {e}', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
Reference in New Issue
Block a user