@semalt-ai/code 1.8.5 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +6 -1
- package/.github/workflows/ci.yml +69 -0
- package/CLAUDE.md +1584 -26
- package/README.md +147 -3
- package/examples/embed.js +74 -0
- package/index.js +251 -10
- package/lib/agent.js +711 -104
- package/lib/api.js +213 -49
- package/lib/args.js +74 -2
- package/lib/audit.js +23 -1
- package/lib/background.js +584 -0
- package/lib/checkpoints.js +757 -0
- package/lib/commands/auth.js +94 -0
- package/lib/commands/chat-session.js +306 -0
- package/lib/commands/chat-slash.js +399 -0
- package/lib/commands/chat-turn.js +446 -0
- package/lib/commands/chat.js +403 -0
- package/lib/commands/custom.js +157 -0
- package/lib/commands/history-utils.js +66 -0
- package/lib/commands/index.js +268 -0
- package/lib/commands/mcp.js +113 -0
- package/lib/commands/oneshot.js +193 -0
- package/lib/commands/registry.js +269 -0
- package/lib/commands/tasks.js +89 -0
- package/lib/compact.js +87 -0
- package/lib/config.js +333 -11
- package/lib/constants.js +372 -3
- package/lib/deny.js +199 -0
- package/lib/doctor.js +160 -0
- package/lib/headless.js +167 -0
- package/lib/hooks.js +286 -0
- package/lib/images.js +264 -0
- package/lib/internals.js +49 -0
- package/lib/mcp/boundary.js +131 -0
- package/lib/mcp/client.js +270 -0
- package/lib/mcp/oauth.js +134 -0
- package/lib/memory.js +209 -0
- package/lib/metrics.js +37 -2
- package/lib/payload.js +54 -0
- package/lib/permission-rules.js +401 -0
- package/lib/permissions.js +100 -10
- package/lib/pricing.js +67 -0
- package/lib/proc.js +62 -0
- package/lib/prompts.js +84 -5
- package/lib/sandbox.js +568 -0
- package/lib/sdk.js +328 -0
- package/lib/secrets.js +211 -0
- package/lib/skills.js +223 -0
- package/lib/subagents.js +516 -0
- package/lib/tool_registry.js +2558 -0
- package/lib/tool_specs.js +222 -2
- package/lib/tools.js +272 -1020
- package/lib/ui/format.js +22 -1
- package/lib/ui/input-field.js +16 -7
- package/lib/ui/status-bar.js +79 -11
- package/lib/ui/theme.js +1 -0
- package/lib/ui/web-activity.js +218 -0
- package/lib/verify.js +229 -0
- package/lib/web-extract.js +213 -0
- package/lib/web-summarize.js +68 -0
- package/package.json +19 -4
- package/scripts/lint.js +57 -0
- package/test/agent-loop.test.js +389 -0
- package/test/background.test.js +414 -0
- package/test/chat.test.js +114 -0
- package/test/checkpoints-agent.test.js +181 -0
- package/test/checkpoints.test.js +650 -0
- package/test/command-registry.test.js +160 -0
- package/test/compact.test.js +116 -0
- package/test/completion-lazy.test.js +52 -0
- package/test/config-merge.test.js +324 -0
- package/test/config-quarantine.test.js +128 -0
- package/test/config-write-guard-allow-anywhere.test.js +56 -0
- package/test/config-write-guard-skip.test.js +46 -0
- package/test/config-write-guard.test.js +153 -0
- package/test/context-split.test.js +215 -0
- package/test/cost-doctor.test.js +142 -0
- package/test/custom-commands-chat.test.js +106 -0
- package/test/custom-commands.test.js +230 -0
- package/test/deny-windows.test.js +120 -0
- package/test/deny.test.js +83 -0
- package/test/download-allow-anywhere.test.js +66 -0
- package/test/download-confine.test.js +153 -0
- package/test/executors.test.js +362 -0
- package/test/extract-tool-calls.test.js +315 -0
- package/test/fetch-url-validation.test.js +219 -0
- package/test/fixtures/tool-calls.js +57 -0
- package/test/fixtures/web-page.js +91 -0
- package/test/git-tools.test.js +384 -0
- package/test/grep-glob-serialize.test.js +242 -0
- package/test/grep-glob.test.js +268 -0
- package/test/harness/README.md +57 -0
- package/test/harness/chat-harness.js +142 -0
- package/test/harness/memwarn-headless-child.js +65 -0
- package/test/harness/mock-llm.js +120 -0
- package/test/harness/mock-mcp-server.js +142 -0
- package/test/harness/sse-server.js +69 -0
- package/test/headless.test.js +203 -0
- package/test/history-utils.test.js +88 -0
- package/test/hooks-agent.test.js +238 -0
- package/test/hooks-verify-sandbox.test.js +232 -0
- package/test/hooks.test.js +216 -0
- package/test/http-get-user-agent.test.js +142 -0
- package/test/images-api.test.js +208 -0
- package/test/images.test.js +238 -0
- package/test/max-iterations.test.js +216 -0
- package/test/mcp-boundary.test.js +57 -0
- package/test/mcp-client.test.js +267 -0
- package/test/mcp-oauth.test.js +86 -0
- package/test/memory-truncation-warning.test.js +222 -0
- package/test/memory.test.js +198 -0
- package/test/native-dispatch.test.js +356 -0
- package/test/output-chokepoint.test.js +188 -0
- package/test/path-guards.test.js +134 -0
- package/test/payload.test.js +99 -0
- package/test/permission-rules-agent.test.js +210 -0
- package/test/permission-rules.test.js +297 -0
- package/test/permissions.test.js +163 -0
- package/test/plan-mode.test.js +167 -0
- package/test/read-paginate.test.js +275 -0
- package/test/readonly-tools.test.js +177 -0
- package/test/result-cap.test.js +233 -0
- package/test/sandbox-agent.test.js +147 -0
- package/test/sandbox-integration.test.js +216 -0
- package/test/sandbox.test.js +408 -0
- package/test/sdk.test.js +234 -0
- package/test/shell-output-cap.test.js +181 -0
- package/test/skills-chat.test.js +110 -0
- package/test/skills.test.js +295 -0
- package/test/smoke.test.js +68 -0
- package/test/status-bar-pause.test.js +164 -0
- package/test/stream-parser.test.js +147 -0
- package/test/subagents-agent.test.js +178 -0
- package/test/subagents.test.js +222 -0
- package/test/tool-registry.test.js +85 -0
- package/test/trim-budget.test.js +101 -0
- package/test/verify-agent.test.js +317 -0
- package/test/verify.test.js +141 -0
- package/test/web-activity-ordering.test.js +194 -0
- package/test/web-activity.test.js +207 -0
- package/test/web-data-extraction-guidance.test.js +71 -0
- package/test/web-extract.test.js +185 -0
- package/test/web-fetch-agent.test.js +291 -0
- package/test/web-fetch-mode.test.js +193 -0
- package/test/web-search.test.js +380 -0
- package/lib/commands.js +0 -1438
package/lib/tool_specs.js
CHANGED
|
@@ -50,7 +50,11 @@ const TOOL_SPECS = {
|
|
|
50
50
|
},
|
|
51
51
|
|
|
52
52
|
read_file: {
|
|
53
|
-
description: 'Read a UTF-8 text file
|
|
53
|
+
description: 'Read a UTF-8 text file. Paginated: by default returns the first ~2000 lines; '
|
|
54
|
+
+ 'if the file is longer the result ends with a [PARTIAL] notice giving the total line count '
|
|
55
|
+
+ 'and the start_line for the next page. Use start_line/end_line to read a specific slice '
|
|
56
|
+
+ '(also capped to ~2000 lines). Set show_line_numbers=true when you need line numbers to '
|
|
57
|
+
+ 'target an edit_file call (off by default — keeps content copyable for replace_in_file and cheaper).',
|
|
54
58
|
parameters: {
|
|
55
59
|
type: 'object',
|
|
56
60
|
properties: {
|
|
@@ -58,6 +62,20 @@ const TOOL_SPECS = {
|
|
|
58
62
|
type: 'string',
|
|
59
63
|
description: 'Absolute or relative path to the file to read',
|
|
60
64
|
},
|
|
65
|
+
start_line: {
|
|
66
|
+
type: 'integer',
|
|
67
|
+
description: 'First line to read (1-based, inclusive). Omit to start at line 1.',
|
|
68
|
+
},
|
|
69
|
+
end_line: {
|
|
70
|
+
type: 'integer',
|
|
71
|
+
description: 'Last line to read (1-based, inclusive). Omit to read to the line cap. '
|
|
72
|
+
+ 'A range wider than the line cap is still capped — page with start_line.',
|
|
73
|
+
},
|
|
74
|
+
show_line_numbers: {
|
|
75
|
+
type: 'boolean',
|
|
76
|
+
description: 'Prefix each line with its 1-based line number (aligned with edit_file). '
|
|
77
|
+
+ 'Default false. Turn on when you intend to edit by line number.',
|
|
78
|
+
},
|
|
61
79
|
},
|
|
62
80
|
required: ['path'],
|
|
63
81
|
},
|
|
@@ -289,6 +307,70 @@ const TOOL_SPECS = {
|
|
|
289
307
|
},
|
|
290
308
|
},
|
|
291
309
|
|
|
310
|
+
grep: {
|
|
311
|
+
description: 'Search file contents by regular expression across the working tree and return the actual matches (file:line:text), so you can navigate to the relevant lines and read only a slice instead of whole files. Honors .gitignore, skips binary files and node_modules/.git. Prefers ripgrep when available with an identical pure-Node fallback. output_mode selects what is returned: "content" (default) gives file:line:text per match ("show me the lines"); "files_with_matches" gives just the unique file paths ("which files contain this"); "count" gives per-file and total match counts ("how many") — count/files_with_matches return almost nothing, so prefer them when you do not need the line text. Results are bounded by head_limit (default 100); when more matches exist than are shown, a truncation notice tells you how many were omitted — narrow the pattern, switch to count/files_with_matches, or raise head_limit.',
|
|
312
|
+
parameters: {
|
|
313
|
+
type: 'object',
|
|
314
|
+
properties: {
|
|
315
|
+
pattern: {
|
|
316
|
+
type: 'string',
|
|
317
|
+
description: 'Regular expression to search for (matched per line)',
|
|
318
|
+
},
|
|
319
|
+
path: {
|
|
320
|
+
type: 'string',
|
|
321
|
+
description: 'Optional glob limiting which files are searched, e.g. "*.js" or "src/**/*.ts"',
|
|
322
|
+
},
|
|
323
|
+
ignore_case: {
|
|
324
|
+
type: 'boolean',
|
|
325
|
+
description: 'Case-insensitive match when true',
|
|
326
|
+
default: false,
|
|
327
|
+
},
|
|
328
|
+
output_mode: {
|
|
329
|
+
type: 'string',
|
|
330
|
+
enum: ['content', 'files_with_matches', 'count'],
|
|
331
|
+
description: 'What to return: "content" = file:line:text per match (default); "files_with_matches" = unique file paths only; "count" = match counts per file and total. Use count/files_with_matches when you only need how many / which files.',
|
|
332
|
+
default: 'content',
|
|
333
|
+
},
|
|
334
|
+
head_limit: {
|
|
335
|
+
type: 'integer',
|
|
336
|
+
description: 'Maximum number of results to serialize into context (default 100): match lines in content mode, files in files_with_matches/count mode. Excess is omitted with a truncation notice.',
|
|
337
|
+
},
|
|
338
|
+
offset: {
|
|
339
|
+
type: 'integer',
|
|
340
|
+
description: 'Number of results to skip before serializing (for paging through a large match set). Default 0.',
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
required: ['pattern'],
|
|
344
|
+
},
|
|
345
|
+
},
|
|
346
|
+
|
|
347
|
+
glob: {
|
|
348
|
+
description: 'List files matching a glob pattern (relative paths). Skips node_modules/.git and hidden entries. The file list is bounded by head_limit (default 100); when more files match than are shown, a truncation notice reports how many were omitted — narrow the glob or raise head_limit.',
|
|
349
|
+
parameters: {
|
|
350
|
+
type: 'object',
|
|
351
|
+
properties: {
|
|
352
|
+
pattern: {
|
|
353
|
+
type: 'string',
|
|
354
|
+
description: 'Glob pattern such as "*.ts" or "src/**/*.js"; matches the basename when it has no slash, otherwise the relative path',
|
|
355
|
+
},
|
|
356
|
+
path: {
|
|
357
|
+
type: 'string',
|
|
358
|
+
description: 'Base directory to search from; defaults to the current working directory',
|
|
359
|
+
default: '.',
|
|
360
|
+
},
|
|
361
|
+
head_limit: {
|
|
362
|
+
type: 'integer',
|
|
363
|
+
description: 'Maximum number of file paths to serialize into context (default 100). Excess is omitted with a truncation notice.',
|
|
364
|
+
},
|
|
365
|
+
offset: {
|
|
366
|
+
type: 'integer',
|
|
367
|
+
description: 'Number of file paths to skip before serializing (for paging). Default 0.',
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
required: ['pattern'],
|
|
371
|
+
},
|
|
372
|
+
},
|
|
373
|
+
|
|
292
374
|
replace_in_file: {
|
|
293
375
|
description: 'Regex-replace occurrences of a pattern in a file; returns the number of replacements made.',
|
|
294
376
|
parameters: {
|
|
@@ -384,7 +466,7 @@ const TOOL_SPECS = {
|
|
|
384
466
|
},
|
|
385
467
|
|
|
386
468
|
http_get: {
|
|
387
|
-
description: '
|
|
469
|
+
description: 'Fetch a web page. The `mode` parameter selects how much processing to apply: "summarized" (default) runs the page through Readability + Markdown conversion and a secondary-model summary so only a compact result enters context — use it for find/answer tasks; "extracted" returns the extracted main-content Markdown without the summary — use it to read an article/doc verbatim or grab an exact snippet/quote; "raw" bypasses extraction entirely and returns the ORIGINAL fetched HTML/content (token-capped) — use it to analyze a page\'s HTML/CSS/JavaScript/markup/structure, which extraction destroys. Plain-text/JSON responses pass through unchanged in summarized/extracted modes. Optionally pass intent to focus the summary. The deprecated booleans summarize=false and raw=true are aliases for mode="extracted". DATA EXTRACTION: to pull SPECIFIC VALUES out of a page (hex colors, version strings, URLs, IDs, counts), do NOT use http_get — use `download` (or sandboxed `curl`) to save the page to the working directory, then `grep` it (e.g. `grep -oiE \'#[0-9a-f]{6}\'` for hex colors) so only the matching lines enter context, not the whole page. Reserve mode="raw" for when you actually need to read the markup structure; it loads the entire (token-capped) page and is expensive for simple value extraction. For SPA / asset-heavy sites the values often live in linked assets (e.g. /_nuxt/*.css or *.js, bundled stylesheets) rather than the top-level HTML — download+grep those asset URLs.',
|
|
388
470
|
parameters: {
|
|
389
471
|
type: 'object',
|
|
390
472
|
properties: {
|
|
@@ -392,11 +474,46 @@ const TOOL_SPECS = {
|
|
|
392
474
|
type: 'string',
|
|
393
475
|
description: 'HTTP or HTTPS URL to fetch',
|
|
394
476
|
},
|
|
477
|
+
mode: {
|
|
478
|
+
type: 'string',
|
|
479
|
+
enum: ['summarized', 'extracted', 'raw'],
|
|
480
|
+
description: 'How to process the page. "summarized" (default): extract main content, convert to Markdown, then summarize with a secondary model — for find/answer tasks. "extracted": extracted Markdown of the main content, no summary — for reading a doc/article verbatim or an exact snippet. "raw": the original fetched HTML/content, token-capped, NO extraction — for analyzing the page\'s HTML/CSS/JS/structure.',
|
|
481
|
+
},
|
|
482
|
+
summarize: {
|
|
483
|
+
type: 'boolean',
|
|
484
|
+
description: 'DEPRECATED alias (prefer mode). false ≡ mode="extracted" (extracted Markdown, no summary). An explicit mode wins over this.',
|
|
485
|
+
},
|
|
486
|
+
raw: {
|
|
487
|
+
type: 'boolean',
|
|
488
|
+
description: 'DEPRECATED alias (prefer mode). true ≡ mode="extracted". NOTE: this does NOT return raw HTML — use mode="raw" for the original markup. An explicit mode wins over this.',
|
|
489
|
+
},
|
|
490
|
+
intent: {
|
|
491
|
+
type: 'string',
|
|
492
|
+
description: 'Why you are fetching this page; focuses the summary on answering it.',
|
|
493
|
+
},
|
|
395
494
|
},
|
|
396
495
|
required: ['url'],
|
|
397
496
|
},
|
|
398
497
|
},
|
|
399
498
|
|
|
499
|
+
web_search: {
|
|
500
|
+
description: 'Search the web and return a compact list of candidate results — each with a title, url, and snippet. Use this to FIND relevant pages when you do not already know the URL, instead of guessing URLs. IMPORTANT: this returns only short snippets, NOT page content. Read the snippets, pick the single most relevant result (or the few that matter), and then fetch ONLY those with http_get to read them — use http_get mode="summarized" for reading/answering and mode="raw" only for analyzing markup. Do NOT fetch every result; that wastes context. Optional count caps how many results to return (the backend clamps it).',
|
|
501
|
+
parameters: {
|
|
502
|
+
type: 'object',
|
|
503
|
+
properties: {
|
|
504
|
+
query: {
|
|
505
|
+
type: 'string',
|
|
506
|
+
description: 'The search query.',
|
|
507
|
+
},
|
|
508
|
+
count: {
|
|
509
|
+
type: 'integer',
|
|
510
|
+
description: 'Optional maximum number of results to return (clamped by the backend; defaults to the backend default).',
|
|
511
|
+
},
|
|
512
|
+
},
|
|
513
|
+
required: ['query'],
|
|
514
|
+
},
|
|
515
|
+
},
|
|
516
|
+
|
|
400
517
|
ask_user: {
|
|
401
518
|
description: 'Prompt the interactive user for input and return their answer; auto-answers "y" in non-TTY mode.',
|
|
402
519
|
parameters: {
|
|
@@ -462,6 +579,109 @@ const TOOL_SPECS = {
|
|
|
462
579
|
},
|
|
463
580
|
},
|
|
464
581
|
|
|
582
|
+
// ──────────────────────────────────────────────────────────────────
|
|
583
|
+
// Native git tools (Task 5.1). Implemented by shelling out to `git`
|
|
584
|
+
// through the same sandbox + deny-list chokepoint as <shell>, but they
|
|
585
|
+
// parse output into structured results. Read-only: git_status, git_diff,
|
|
586
|
+
// git_log (and the LIST ops of git_branch / git_worktree). Mutating:
|
|
587
|
+
// git_add, git_commit, git_branch (create/delete), git_checkout,
|
|
588
|
+
// git_worktree (add/remove). NOTE: git operations are NOT reversible via
|
|
589
|
+
// /rewind — checkpoints (Task 4.3) snapshot file-tool mutations only.
|
|
590
|
+
// ──────────────────────────────────────────────────────────────────
|
|
591
|
+
|
|
592
|
+
git_status: {
|
|
593
|
+
description: 'Show the working-tree status as structured lists of staged, unstaged, and untracked files plus the current branch. Read-only.',
|
|
594
|
+
parameters: { type: 'object', properties: {}, required: [] },
|
|
595
|
+
},
|
|
596
|
+
|
|
597
|
+
git_diff: {
|
|
598
|
+
description: 'Show changes as a structured diff (files, hunks, +/- counts). Defaults to unstaged changes; set staged=true for the staged (index) diff. Read-only.',
|
|
599
|
+
parameters: {
|
|
600
|
+
type: 'object',
|
|
601
|
+
properties: {
|
|
602
|
+
staged: { type: 'boolean', description: 'Diff the staged (index) changes instead of the working tree', default: false },
|
|
603
|
+
path: { type: 'string', description: 'Optional path to limit the diff to' },
|
|
604
|
+
},
|
|
605
|
+
required: [],
|
|
606
|
+
},
|
|
607
|
+
},
|
|
608
|
+
|
|
609
|
+
git_log: {
|
|
610
|
+
description: 'List recent commits as structured records (hash, author, email, date, subject). Read-only.',
|
|
611
|
+
parameters: {
|
|
612
|
+
type: 'object',
|
|
613
|
+
properties: {
|
|
614
|
+
count: { type: 'integer', description: 'Maximum number of commits to return (default 20)', minimum: 1, default: 20 },
|
|
615
|
+
path: { type: 'string', description: 'Optional path to limit history to' },
|
|
616
|
+
},
|
|
617
|
+
required: [],
|
|
618
|
+
},
|
|
619
|
+
},
|
|
620
|
+
|
|
621
|
+
git_add: {
|
|
622
|
+
description: 'Stage changes for commit. Provide `paths` (one or more files) or set all=true to stage everything. Mutating — requires approval.',
|
|
623
|
+
parameters: {
|
|
624
|
+
type: 'object',
|
|
625
|
+
properties: {
|
|
626
|
+
paths: { type: 'string', description: 'File path(s) to stage; space-separated for multiple' },
|
|
627
|
+
all: { type: 'boolean', description: 'Stage all changes (git add -A)', default: false },
|
|
628
|
+
},
|
|
629
|
+
required: [],
|
|
630
|
+
},
|
|
631
|
+
},
|
|
632
|
+
|
|
633
|
+
git_commit: {
|
|
634
|
+
description: 'Create a commit with the given message and return the new commit hash and branch. The message is required and must be non-empty (the tool never invents one). Mutating — requires approval. NOTE: a commit is not reversible via /rewind.',
|
|
635
|
+
parameters: {
|
|
636
|
+
type: 'object',
|
|
637
|
+
properties: {
|
|
638
|
+
message: { type: 'string', description: 'Commit message (required, non-empty)' },
|
|
639
|
+
all: { type: 'boolean', description: 'Automatically stage modified/deleted tracked files before committing (git commit -a)', default: false },
|
|
640
|
+
},
|
|
641
|
+
required: ['message'],
|
|
642
|
+
},
|
|
643
|
+
},
|
|
644
|
+
|
|
645
|
+
git_branch: {
|
|
646
|
+
description: 'List branches (no name — read-only) or create/delete a branch (name given — mutating). Set delete=true to delete (force=true for -D). Branch creation/deletion is not reversible via /rewind.',
|
|
647
|
+
parameters: {
|
|
648
|
+
type: 'object',
|
|
649
|
+
properties: {
|
|
650
|
+
name: { type: 'string', description: 'Branch name to create or delete; omit to list branches' },
|
|
651
|
+
delete: { type: 'boolean', description: 'Delete the named branch instead of creating it', default: false },
|
|
652
|
+
force: { type: 'boolean', description: 'Force the operation (e.g. delete an unmerged branch with -D)', default: false },
|
|
653
|
+
},
|
|
654
|
+
required: [],
|
|
655
|
+
},
|
|
656
|
+
},
|
|
657
|
+
|
|
658
|
+
git_checkout: {
|
|
659
|
+
description: 'Switch to a branch or ref (set create=true to create and switch with -b). Mutating — requires approval. WARNING: checkout can overwrite or discard uncommitted changes in the working tree, and those changes are NOT recoverable via /rewind (checkpoints snapshot file-tool mutations only, not git operations).',
|
|
660
|
+
parameters: {
|
|
661
|
+
type: 'object',
|
|
662
|
+
properties: {
|
|
663
|
+
name: { type: 'string', description: 'Branch or ref to switch to' },
|
|
664
|
+
create: { type: 'boolean', description: 'Create the branch and switch to it (git checkout -b)', default: false },
|
|
665
|
+
force: { type: 'boolean', description: 'Force checkout, discarding local changes (git checkout -f)', default: false },
|
|
666
|
+
},
|
|
667
|
+
required: ['name'],
|
|
668
|
+
},
|
|
669
|
+
},
|
|
670
|
+
|
|
671
|
+
git_worktree: {
|
|
672
|
+
description: 'Manage linked worktrees for running parallel agents in isolated working trees. op=list (read-only) lists worktrees; op=add creates one (optionally on a new `branch`); op=remove deletes one (force=true to override). add/remove are mutating and not reversible via /rewind.',
|
|
673
|
+
parameters: {
|
|
674
|
+
type: 'object',
|
|
675
|
+
properties: {
|
|
676
|
+
op: { type: 'string', description: 'Operation: list | add | remove', enum: ['list', 'add', 'remove'], default: 'list' },
|
|
677
|
+
path: { type: 'string', description: 'Worktree directory path (required for add/remove)' },
|
|
678
|
+
branch: { type: 'string', description: 'For add: create and check out this new branch in the worktree' },
|
|
679
|
+
force: { type: 'boolean', description: 'For remove: remove even with local changes', default: false },
|
|
680
|
+
},
|
|
681
|
+
required: [],
|
|
682
|
+
},
|
|
683
|
+
},
|
|
684
|
+
|
|
465
685
|
// ──────────────────────────────────────────────────────────────────
|
|
466
686
|
// Parser-wrapper tags. These are XML envelopes that carry other tool
|
|
467
687
|
// calls; they are not invocable tools themselves. Entries exist only
|