Centralize all path management via src/config/paths.ts
- Add getPaths() with workspace, scripts, ppt skin/template paths - Export getWorkspacePath(args?) helper — removes duplicate local functions and stale process.cwd()/workspace fallbacks from sqlite, pdf, excel, image, pubmed, email, audio-transcribe (7 files) - weather.ts: replace __dirname-relative scripts path with getPaths().scripts - Move ppt/ to .smallclaw/skills/presenter/ppt/; update server-v2.ts, pptx.ts, pptx_gen.py (argparse --skin-dir/--template-dir) - Fix PPT skin thumbnail serving: res.sendFile → fs.createReadStream (bypasses send module dotfiles restriction for .smallclaw/ paths) - Fix workspace default: .smallclaw/workspace (was project root workspace/) - Fix subagent paths to use SMALLCLAW_DATA_DIR env var - Fix Monaco marked module load failure: restore define.amd on DOMContentLoaded after deferred UMD libs (tone, magenta) have loaded - Add AudioContext resume on first user click (Chrome autoplay policy) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+19
-7
@@ -39,6 +39,7 @@ import json
|
||||
import os
|
||||
import re
|
||||
import math
|
||||
import argparse
|
||||
|
||||
# Force UTF-8 output on Windows
|
||||
if sys.platform == 'win32':
|
||||
@@ -56,8 +57,8 @@ from pptx.enum.text import PP_ALIGN, MSO_ANCHOR, MSO_AUTO_SIZE
|
||||
|
||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
PROJECT_ROOT = os.path.join(SCRIPT_DIR, '..')
|
||||
SKIN_DIR = os.path.join(PROJECT_ROOT, 'ppt', 'skin')
|
||||
TEMPLATE_DIR = os.path.join(PROJECT_ROOT, 'ppt', 'template')
|
||||
SKIN_DIR = os.path.join(PROJECT_ROOT, '.smallclaw', 'skills', 'presenter', 'ppt', 'skin')
|
||||
TEMPLATE_DIR = os.path.join(PROJECT_ROOT, '.smallclaw', 'skills', 'presenter', 'ppt', 'template')
|
||||
|
||||
SKIN_EXTENSIONS = {'.png', '.jpg', '.jpeg'}
|
||||
|
||||
@@ -1354,12 +1355,23 @@ def generate(spec: dict, workspace_path: str) -> dict:
|
||||
# ─── CLI Entry Point ───────────────────────────────────────────────────────────
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print(json.dumps({"success": False, "error": "Usage: python pptx_gen.py <spec_json_path> [workspace_path]"}))
|
||||
sys.exit(1)
|
||||
parser = argparse.ArgumentParser(description='Generate PPTX from spec JSON')
|
||||
parser.add_argument('spec_path', help='Path to spec JSON file')
|
||||
parser.add_argument('workspace_path', nargs='?', default=os.getcwd(), help='Workspace directory')
|
||||
parser.add_argument('--skin-dir', default=None, help='Override skin directory path')
|
||||
parser.add_argument('--template-dir', default=None, help='Override template directory path')
|
||||
args = parser.parse_args()
|
||||
|
||||
spec_path = sys.argv[1]
|
||||
workspace_path = sys.argv[2] if len(sys.argv) > 2 else os.getcwd()
|
||||
spec_path = args.spec_path
|
||||
workspace_path = args.workspace_path
|
||||
|
||||
# Override paths if provided by caller (keeps paths.ts as single source of truth)
|
||||
global SKIN_DIR, TEMPLATE_DIR, SKIN_INDEX
|
||||
if args.skin_dir:
|
||||
SKIN_DIR = args.skin_dir
|
||||
SKIN_INDEX = _build_skin_index()
|
||||
if args.template_dir:
|
||||
TEMPLATE_DIR = args.template_dir
|
||||
|
||||
try:
|
||||
with open(spec_path, "r", encoding="utf-8") as f:
|
||||
|
||||
Reference in New Issue
Block a user