Files
workspace/ws

168 lines
5.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""
ws - Unified workspace CLI
A single entry point for all workspace tools and projects.
"""
import os
import sys
import subprocess
from pathlib import Path
WORKSPACE = Path("/home/wdjones/.openclaw/workspace")
TOOLS = WORKSPACE / "tools"
PROJECTS = WORKSPACE / "projects"
COMMANDS = {
# Tools
'search': ('tools/search.py', 'Search workspace files'),
'inbox': ('tools/inbox-processor.py', 'Show inbox status'),
'digest': ('tools/daily-digest.py', 'Generate daily digest'),
'clip': ('tools/web-clipper.py', 'Web clipper (add, list, search)'),
'note': ('tools/quicknote.py', 'Quick timestamped notes'),
'dash': ('tools/dashboard.py', 'Start web dashboard'),
'brief': ('tools/briefing.py', 'Morning briefing'),
'scaffold': ('tools/scaffold.py', 'Create new project'),
'watch': ('tools/watcher.py', 'Watch for file changes'),
'focus': ('tools/focus.py', 'Pomodoro focus timer'),
'habits': ('tools/habits.py', 'Habit tracker with streaks'),
'track': ('tools/track.py', 'Time tracking'),
'cap': ('tools/capture.py', 'Quick thought capture'),
'today': ('tools/today.py', 'Daily overview dashboard'),
'wisdom': ('tools/wisdom.py', 'Quotes and wisdom collection'),
'sys': ('tools/sysmon.py', 'System monitor'),
'journal': ('tools/journal.py', 'Structured journaling'),
'backup': ('tools/backup.py', 'Backup and export'),
'goals': ('tools/goals.py', 'Goal tracking'),
'reading': ('tools/reading.py', 'Reading list'),
'people': ('tools/people.py', 'Personal CRM'),
# Projects
'news': ('projects/news-feed/main.py', 'RSS news reader'),
'reddit': ('projects/reddit-scanner/main.py', 'Reddit scanner'),
}
def show_help():
"""Show help message."""
print("""
╔═══════════════════════════════════════════════════╗
║ 🖤 Case's Workspace CLI ║
╚═══════════════════════════════════════════════════╝
Usage: ws <command> [args...]
TOOLS:
""")
for cmd, (path, desc) in sorted(COMMANDS.items()):
if path.startswith('tools/'):
print(f" {cmd:12} {desc}")
print("\nPROJECTS:")
for cmd, (path, desc) in sorted(COMMANDS.items()):
if path.startswith('projects/'):
print(f" {cmd:12} {desc}")
print("""
SHORTCUTS:
ws Show this help
ws status Quick status overview
ws today Show today's notes
ws tasks Show tasks
ws git Git status
EXAMPLES:
ws search "config" Search workspace
ws news refresh Fetch new articles
ws reddit sub python Show r/python
ws focus 25 "coding" 25 min focus session
ws scaffold myapp node Create Node.js project
""")
def quick_status():
"""Show quick status overview."""
print("\n🖤 Workspace Status")
print("=" * 40)
# Git status
result = subprocess.run(['git', 'status', '-s'], cwd=WORKSPACE, capture_output=True, text=True)
changes = len(result.stdout.strip().split('\n')) if result.stdout.strip() else 0
print(f"📂 Git: {changes} uncommitted changes")
# Tasks
tasks_file = WORKSPACE / "TASKS.md"
if tasks_file.exists():
content = tasks_file.read_text()
in_progress = content.count("- [ ]")
print(f"✅ Tasks: {in_progress} in progress")
# Today's notes
from datetime import datetime
today_file = WORKSPACE / "memory" / f"{datetime.now().strftime('%Y-%m-%d')}.md"
if today_file.exists():
lines = len(today_file.read_text().split('\n'))
print(f"📝 Today: {lines} lines logged")
# Projects
projects = [p for p in PROJECTS.iterdir() if p.is_dir() and not p.name.startswith('.')]
print(f"🔨 Projects: {len(projects)}")
# Tools
tools = [t for t in TOOLS.iterdir() if t.suffix == '.py']
print(f"🔧 Tools: {len(tools)}")
print()
def run_command(cmd: str, args: list):
"""Run a workspace command."""
if cmd not in COMMANDS:
print(f"Unknown command: {cmd}")
print("Run 'ws' for help")
return 1
path, _ = COMMANDS[cmd]
full_path = WORKSPACE / path
if not full_path.exists():
print(f"Command not found: {full_path}")
return 1
# Run the command
result = subprocess.run(
['python3', str(full_path)] + args,
cwd=WORKSPACE
)
return result.returncode
def main():
if len(sys.argv) < 2:
show_help()
return
cmd = sys.argv[1]
args = sys.argv[2:]
# Special commands
if cmd == 'help' or cmd == '-h' or cmd == '--help':
show_help()
elif cmd == 'status':
quick_status()
elif cmd == 'today':
from datetime import datetime
today_file = WORKSPACE / "memory" / f"{datetime.now().strftime('%Y-%m-%d')}.md"
if today_file.exists():
print(today_file.read_text())
else:
print("No notes for today")
elif cmd == 'tasks':
tasks_file = WORKSPACE / "TASKS.md"
if tasks_file.exists():
print(tasks_file.read_text())
elif cmd == 'git':
subprocess.run(['git'] + args, cwd=WORKSPACE)
else:
sys.exit(run_command(cmd, args))
if __name__ == "__main__":
main()