Add interactive tree editor island (Phase 4) + MCP server fixes
Phase 4: defisland ~sx-tools/tree-editor — interactive tree viewer embedded in the SX Tools page. Features: - Textarea with :bind for SX source input - Parse button to re-parse on demand - Tree view: annotated tree with path labels, clickable nodes - Context view: enclosing chain from root to selected node - Validate view: structural integrity checks (catches missing body etc.) MCP server fixes: added ident-start?, ident-char?, make-keyword, escape-string, sx-expr-source — needed by parser.sx when loaded into the MCP evaluator. Also: .mcp.json for Claude Code MCP server config, CLAUDE.md protocol for structural .sx file editing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -61,6 +61,43 @@ let setup_env () =
|
||||
bind "identical?" (fun args -> match args with
|
||||
| [a; b] -> Bool (a == b)
|
||||
| _ -> Bool false);
|
||||
(* Character classification for SX parser.sx *)
|
||||
bind "ident-start?" (fun args -> match args with
|
||||
| [String s] when String.length s = 1 ->
|
||||
let c = s.[0] in
|
||||
Bool ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
|
||||
c = '_' || c = '~' || c = '*' || c = '+' || c = '-' ||
|
||||
c = '>' || c = '<' || c = '=' || c = '/' || c = '!' ||
|
||||
c = '?' || c = '&' || c = '@' || c = '^' || c = '%' ||
|
||||
Char.code c > 127)
|
||||
| _ -> Bool false);
|
||||
bind "ident-char?" (fun args -> match args with
|
||||
| [String s] when String.length s = 1 ->
|
||||
let c = s.[0] in
|
||||
Bool ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
|
||||
(c >= '0' && c <= '9') ||
|
||||
c = '_' || c = '~' || c = '*' || c = '+' || c = '-' ||
|
||||
c = '>' || c = '<' || c = '=' || c = '/' || c = '!' ||
|
||||
c = '?' || c = '&' || c = '.' || c = ':' || c = '#' ||
|
||||
c = ',' || c = '@' || c = '^' || c = '%' ||
|
||||
Char.code c > 127)
|
||||
| _ -> Bool false);
|
||||
bind "make-keyword" (fun args -> match args with
|
||||
| [String s] -> Keyword s | _ -> Nil);
|
||||
bind "escape-string" (fun args -> match args with
|
||||
| [String s] ->
|
||||
let buf = Buffer.create (String.length s) in
|
||||
String.iter (fun c -> match c with
|
||||
| '"' -> Buffer.add_string buf "\\\""
|
||||
| '\\' -> Buffer.add_string buf "\\\\"
|
||||
| '\n' -> Buffer.add_string buf "\\n"
|
||||
| '\t' -> Buffer.add_string buf "\\t"
|
||||
| '\r' -> Buffer.add_string buf "\\r"
|
||||
| c -> Buffer.add_char buf c) s;
|
||||
String (Buffer.contents buf)
|
||||
| _ -> String "");
|
||||
bind "sx-expr-source" (fun args -> match args with
|
||||
| [SxExpr s] -> String s | _ -> String "");
|
||||
(* Runtime functions needed by tree-tools *)
|
||||
bind "symbol-name" (fun args -> match args with
|
||||
| [Symbol s] -> String s | _ -> String "");
|
||||
|
||||
Reference in New Issue
Block a user