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:
kim
2026-05-28 16:55:14 +09:00
co-authored by Claude Sonnet 4.6
parent 5608b83850
commit 2d3e33b6b3
15 changed files with 96 additions and 85 deletions
+19 -7
View File
@@ -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: