genexus-mcp 3.13.0 → 3.14.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/README.md CHANGED
@@ -9,6 +9,7 @@
9
9
  > **¿Hablás español?** → [Guía de inicio en español](docs/GETTING_STARTED.es.md)
10
10
  > **Fala português?** → [Guia de início em português](docs/GETTING_STARTED.pt-br.md)
11
11
  > **Stuck?** → [Troubleshooting guide](TROUBLESHOOTING.md)
12
+ > **All docs** → [Documentation index](docs/README.md)
12
13
 
13
14
  ---
14
15
 
@@ -175,11 +176,12 @@ the measured two-client smoke and backpressure results.
175
176
 
176
177
  ## What you can do with it
177
178
 
178
- A quick map of what the agent can do against your real KB through the **50 tools** (details in [Tool Surface](#tool-surface)):
179
+ A quick map of what the agent can do against your real KB through the **60 tools** (details in [Tool Surface](#tool-surface)):
179
180
 
180
181
  | Area | What the agent can do |
181
182
  |---|---|
182
183
  | 🔎 **Explore** | Search & list objects, read any part (source, rules, events, structure, docs, pattern XML), inspect metadata & callers, regex-search source, view the navigation report |
184
+ | 🧭 **Orient & trace** | Rank the objects a task touches, list direct and transitive callers, trace the shortest call path between two objects, check blast radius and safe-delete, follow one variable's data flow. Runs on exported sources through `genexus_wire` (read-only, token-budgeted) |
183
185
  | ✏️ **Edit code** | Edit any object part (`full`/`patch`/`ops` modes), variables CRUD, format, create & delete objects, scaffold a Procedure from a **curl command**, edit + rebuild callers in one shot |
184
186
  | 🗄️ **Author the data model** | Transaction structure (DSL), **unique/non-unique indexes** (create & drop), **attribute formulas & subtypes**, level Description/Image attributes, **Domain enum values**, folders & modules, table↔transaction relations & redundant-attribute detection |
185
187
  | 🧩 **Author other objects** | External Object methods & properties, Menu options, REST API objects, WorkWithPlus / WorkWith patterns, typed .NET generator references |
@@ -350,6 +352,12 @@ Once installed, here's what unlocks. Try these as your first prompts:
350
352
  - *"Remove the Export action from the Selection grid of WorkWithPlusReport."*
351
353
  - *"Read the Documentation part of the transaction Customer and rewrite it in markdown."*
352
354
 
355
+ **Architecture, call graph & impact** (`genexus_wire`)
356
+ - *"Before I change CliSaldo, what is the blast radius? Which procedures write it?"*
357
+ - *"Who calls PValidaCreditoLive, directly and through other procedures?"*
358
+ - *"Show me the call path from PEmiteFaturaLive to PValidaCreditoLive."*
359
+ - *"I need to change the invoice interest calculation. Where should I start?"*
360
+
353
361
  **Analysis**
354
362
  - *"Explain what the procedure ProcessShipment does."* — `genexus_analyze mode=explain` is a compatibility-only envelope and returns `NotImplemented`; use `mode=summary`, `mode=context`, or `genexus_read` for supported analysis and source.
355
363
  - *"What SQL does the query in WebPanel CustomerList generate?"*
@@ -359,7 +367,7 @@ Once installed, here's what unlocks. Try these as your first prompts:
359
367
  - *"Build the KB and report any errors."*
360
368
  - *"Run the unit tests and show me which failed."*
361
369
 
362
- The agent picks the right tool from the **50 tools** the MCP exposes (read, edit, refactor, analyze, build, data-model authoring, layout automation, DB/DDL, versioning, security, SQL preview, etc.). The full tool list is in [Tool Surface](#tool-surface) below.
370
+ The agent picks the right tool from the **60 tools** the MCP exposes (read, edit, refactor, analyze, build, data-model authoring, layout automation, DB/DDL, versioning, security, SQL preview, etc.). The full tool list is in [Tool Surface](#tool-surface) below.
363
371
 
364
372
  ---
365
373
 
@@ -429,7 +437,7 @@ Still stuck? [Open an issue](https://github.com/lennix1337/Genexus18MCP/issues)
429
437
 
430
438
  ## Tool Surface
431
439
 
432
- The worker exposes **50 tools** to the MCP router, grouped by capability below. Most are umbrellas with an `action` (e.g. `genexus_db action=sql_ddl`); the detailed schemas live in [`src/GxMcp.Gateway/tool_definitions.json`](src/GxMcp.Gateway/tool_definitions.json).
440
+ The worker exposes **60 tools** to the MCP router, grouped by capability below. Most are umbrellas with an `action` (e.g. `genexus_db action=sql_ddl`); the detailed schemas live in [`src/GxMcp.Gateway/tool_definitions.json`](src/GxMcp.Gateway/tool_definitions.json). Feature guides such as the [K2B Designer bridge](docs/k2b-ide-bridge.md), [WorkWithPlus on Empty WebPanels](docs/wwp-empty-webpanel.md), [textual Variables edits](docs/variables-text-integrity.md) and [External Object methods](docs/external-object-method-authoring.md) are listed in the [documentation index](docs/README.md).
433
441
 
434
442
  **Orientation & health**
435
443
  - `genexus_whoami` — KB context, version, worker/index/database health, self-update check, next-step hints
@@ -437,6 +445,11 @@ The worker exposes **50 tools** to the MCP router, grouped by capability below.
437
445
  - `genexus_recipe` — named playbooks / self-extending macros
438
446
  - `genexus_telemetry` — observability (metrics, latency, errors)
439
447
 
448
+ **Architecture discovery & call graph**
449
+ - `genexus_wire` — read-only, token-budgeted call-graph engine (bundled `gxwire.exe`). Actions: `pack_task` (default; one-shot orientation bundle for a task), `for` (intent ranking with domain synonyms such as `fat` → `faturamento`), `status` (graph size and top hubs), `callers` (direct and transitive), `impact` (blast radius, writers, readers), `path` (shortest call path from `from` to `to`), `slice` (definitions and uses of one variable, `target` = `Object:Variable`), `safe_delete` (blockers before deleting a symbol), `index` (rebuild the cache), `doctor` (engine and cache diagnostics)
450
+
451
+ `genexus_wire` does not go through the Worker or the GeneXus SDK. The Gateway runs `gxwire.exe` on the target folder (`dir`, `kb`, or the active KB path) and returns its output. It reads exported source text (`.prc`, `.trn`, `.wp`, `.sdp`, `.xml`, `.txt`, `.gx`, `.gxd`) with regex heuristics, so answers reflect the exported files, not the live KB; an empty folder returns `empty="true"`. Use it to decide where to look and what a change touches. Use `genexus_query` to search live objects and `genexus_read` to read their parts. Parameters: `task` (`pack_task`, `for`), `target` (`callers`, `impact`, `slice`, `safe_delete`), `from`/`to` (`path`), `format`, `token_budget` (default 1200), `full`, `kb`/`dir`. `format` is `toon` (compact, recommended), `xml` (default), `json`, or `mermaid`; mermaid renders `status`, `callers`, `impact`, `path` and `pack_task`, and other actions return XML. The only file it writes is `.gxwire_cache.bin` in the target folder, on `index` and when the cache is stale.
452
+
440
453
  **Search & discovery**
441
454
  - `genexus_query` — object search (prefixes `name:`, `type:`, `usedby:`, `parent:`, …)
442
455
  - `genexus_list_objects` — paginated object listing with aggregates
@@ -486,6 +499,7 @@ in GeneXus first.
486
499
  - `genexus_refactor` — rename, extract procedure, WWP condition set
487
500
  - `genexus_apply_pattern` — apply a GeneXus pattern (WorkWith, WorkWithPlus, …); `mode=actions` manages typed WorkWithPlus grid actions and Action Groups
488
501
  - `genexus_wwp` — typed WorkWithPlus editing: Action Groups, atomic native `add_grid_attribute`, plus `add_tab`, `move_tab`, and `remove_tab` for WebPanel tabs and typed children
502
+ - `genexus_workwith` — typed authoring of standard WorkWith (WorkWith for Web) pattern actions on tabs (`General`, etc.), procedure calls, conditions, and parameters
489
503
  - `genexus_compare` — IDE "Compare Objects" parity (`IComparerService`)
490
504
  - `genexus_merge` — 2- or 3-way object merge (`IMergeService`)
491
505
 
@@ -613,6 +627,15 @@ genexus-mcp layout status # native layout automation state
613
627
 
614
628
  Global flags: `--format toon|json|text` · `--fields f1,f2,...` · `--limit N` · `--query <text>` · `--quiet` · `--no-color`.
615
629
 
630
+ `genexus-mcp wire` is the exception: it forwards its arguments unchanged to the bundled `gxwire.exe` (exit code included), so its `--format` is GxWire's:
631
+
632
+ ```bash
633
+ genexus-mcp wire --dir ./exports/KBTeste --pack-task "invoice interest" --format toon
634
+ genexus-mcp wire --dir ./exports/KBTeste --callers PValidaCreditoLive
635
+ genexus-mcp wire --dir ./exports/KBTeste --path PEmiteFaturaLive:PValidaCreditoLive
636
+ genexus-mcp wire --help
637
+ ```
638
+
616
639
  Full contract: [`docs/axi_cli_contract.md`](docs/axi_cli_contract.md). Best-practices playbook: [`docs/llm_cli_mcp_playbook.md`](docs/llm_cli_mcp_playbook.md).
617
640
 
618
641
  ---
@@ -721,6 +744,7 @@ Want to contribute or run a local dev build?
721
744
  1. Clone this repo on Windows.
722
745
  2. Run `.\build.ps1` to restore and build the C# components and package the local artifacts. The script checks for the required .NET SDK and GeneXus 18 installation.
723
746
  3. If GeneXus is installed outside the default path, set `$env:GX_PATH` to its installation folder before running the build. A Knowledge Base is only needed for runtime testing.
747
+ 4. GxWire (needed for `genexus_wire` and `genexus-mcp wire`) is a Rust engine in `src/gxwire`. Install the Rust toolchain (`cargo`). `build.ps1` builds it in release mode and copies `gxwire.exe` into `publish/`. Without `cargo` that step is skipped without a message, and the tool returns `GxwireNotFound`. The Gateway looks for `gxwire.exe` next to itself, in `publish/`, in `src/gxwire/target/release/`, and on `PATH`. The CLI also honours `GENEXUS_MCP_GXWIRE_EXE`.
724
748
 
725
749
  ### Bundled AI skills (`.gemini/skills/`)
726
750
 
package/cli/docs.test.js CHANGED
@@ -74,3 +74,24 @@ test('the README release section describes the release flow that actually ships'
74
74
  // npm authentication is OIDC Trusted Publishing, so there is no token secret.
75
75
  assert.match(section, /OIDC Trusted Publishing/);
76
76
  });
77
+
78
+ test('the docs index lists every top-level document and every link resolves', () => {
79
+ const docsDir = path.join(repoRoot, 'docs');
80
+ const index = read('docs/README.md');
81
+ const targets = new Set(
82
+ [...index.matchAll(/\]\(([^)#\s]+)(?:#[^)]*)?\)/g)]
83
+ .map((match) => match[1])
84
+ .filter((target) => !/^[a-z]+:/i.test(target))
85
+ );
86
+
87
+ const unlisted = fs.readdirSync(docsDir)
88
+ .filter((name) => name.endsWith('.md') && name !== 'README.md')
89
+ .filter((name) => !targets.has(name));
90
+ assert.deepEqual(unlisted, [], 'Add these documents to docs/README.md');
91
+
92
+ const broken = [...targets].filter((target) => !fs.existsSync(path.join(docsDir, target)));
93
+ assert.deepEqual(broken, [], 'docs/README.md links to missing files');
94
+
95
+ assert.match(read('README.md'), /\]\(docs\/README\.md\)/);
96
+ assert.match(read('AGENTS.md'), /\]\(docs\/README\.md\)/);
97
+ });
package/cli/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  const { spawn } = require('child_process');
2
+ const fs = require('fs');
2
3
  const {
3
4
  getGatewayExePath,
5
+ getGxwireExePath,
4
6
  applyLauncherConfigOrExit,
5
7
  isPathLikelyAppLockerBlocked
6
8
  } = require('./lib/config');
@@ -67,7 +69,7 @@ const GLOBAL_DEFAULTS = {
67
69
  // Single source of truth for command routing: cli/run.js imports both sets so the
68
70
  // AXI-vs-passthrough decision (stdout vs stderr for unhandled errors) cannot drift
69
71
  // from the parser again — issue #207 was caused by two hand-synced copies.
70
- const KNOWN_COMMANDS = new Set(['status', 'doctor', 'tools', 'config', 'init', 'setup', 'whoami', 'uninstall', 'kb', 'clients', 'help', 'home', 'axi', 'llm', 'layout', 'update', 'version']);
72
+ const KNOWN_COMMANDS = new Set(['status', 'doctor', 'tools', 'config', 'init', 'setup', 'whoami', 'uninstall', 'kb', 'clients', 'help', 'home', 'axi', 'llm', 'layout', 'update', 'version', 'wire']);
71
73
 
72
74
  // Version query aliases. `-v` deliberately is NOT an alias of `--help`/`-h`: those
73
75
  // return immediately, while the version aliases are command tokens so that remaining
@@ -153,6 +155,11 @@ function parseArgs(argv) {
153
155
  tokens.shift();
154
156
  }
155
157
 
158
+ if (result.command === 'wire') {
159
+ result.passthroughArgs = tokens;
160
+ return result;
161
+ }
162
+
156
163
  for (let i = 0; i < tokens.length; i += 1) {
157
164
  const token = tokens[i];
158
165
 
@@ -718,6 +725,25 @@ async function main(argv) {
718
725
  case 'update':
719
726
  result = await handleUpdate(parsed.options, ctx);
720
727
  break;
728
+ case 'wire': {
729
+ const gxwireExe = getGxwireExePath();
730
+ if (!fs.existsSync(gxwireExe)) {
731
+ console.error(`[genexus-mcp] gxwire binary not found at: ${gxwireExe}`);
732
+ return EXIT_CODES.ERROR;
733
+ }
734
+ const wireArgs = argv.slice(1);
735
+ const child = spawn(gxwireExe, wireArgs, {
736
+ stdio: 'inherit',
737
+ windowsHide: true
738
+ });
739
+ return new Promise((resolve) => {
740
+ child.on('close', (code) => resolve(code ?? 0));
741
+ child.on('error', (err) => {
742
+ console.error(`[genexus-mcp] Failed to launch gxwire: ${err.message}`);
743
+ resolve(EXIT_CODES.ERROR);
744
+ });
745
+ });
746
+ }
721
747
  default:
722
748
  writeStructured(
723
749
  process.stdout,
package/cli/lib/config.js CHANGED
@@ -54,6 +54,21 @@ function getGatewayExePath() {
54
54
  return path.join(__dirname, '..', '..', 'publish', 'GxMcp.Gateway.exe');
55
55
  }
56
56
 
57
+ function getGxwireExePath() {
58
+ if (process.env.GENEXUS_MCP_GXWIRE_EXE) {
59
+ return process.env.GENEXUS_MCP_GXWIRE_EXE;
60
+ }
61
+ const publishPath = path.join(__dirname, '..', '..', 'publish', 'gxwire.exe');
62
+ if (fs.existsSync(publishPath)) {
63
+ return publishPath;
64
+ }
65
+ const releaseTarget = path.join(__dirname, '..', '..', 'src', 'gxwire', 'target', 'release', 'gxwire.exe');
66
+ if (fs.existsSync(releaseTarget)) {
67
+ return releaseTarget;
68
+ }
69
+ return publishPath;
70
+ }
71
+
57
72
  function getToolDefinitionsPath() {
58
73
  // The gateway loads tool_definitions.json from its own exe directory at
59
74
  // runtime (see GxMcp.Gateway/McpRouter.cs). The packaged distribution
@@ -1046,7 +1061,7 @@ function nodeEntrypointInfo(args) {
1046
1061
  if (arg.startsWith('-')) {
1047
1062
  // Inline/evaluated Node programs may start MCP, but their semantics
1048
1063
  // cannot be established without executing them. Keep them unknown.
1049
- if (/^(?:-e|-p|--eval(?:=|$)|--print(?:=|$)|--check(?:=|$))/.test(arg)) {
1064
+ if (/^(?:-e|-p|--ev(?:al)(?:=|$)|--print(?:=|$)|--check(?:=|$))/.test(arg)) {
1050
1065
  return { state: 'indeterminate', value: null };
1051
1066
  }
1052
1067
  continue;
@@ -2401,6 +2416,7 @@ module.exports = {
2401
2416
  generateConfig,
2402
2417
  generateNeutralConfig,
2403
2418
  getGatewayExePath,
2419
+ getGxwireExePath,
2404
2420
  getToolDefinitionsPath,
2405
2421
  getGeneXusVersionCatalog,
2406
2422
  getGeneXusCatalogEntries,
@@ -126,10 +126,15 @@ the profile(s) that expose it and the setting to change. Legacy alias names
126
126
  remain callable through compatibility rewrites but are not listed as tools.
127
127
 
128
128
  The public list omits examples and shortens long descriptions to stay within
129
- the enforced per-profile and per-tool byte budgets. Each tool description
130
- points to `genexus://kb/tool-help/<tool>`; read that resource when full
131
- constraints, rationale, or examples are needed. The original description and
132
- complete input schema remain available there.
129
+ the enforced per-profile and per-tool byte budgets. Each tool description is a
130
+ purpose summary of at most 200 characters (whole sentences when they fit)
131
+ followed by a pointer to `genexus://kb/tool-help/<tool>`; read that resource
132
+ when full constraints, rationale, or examples are needed. The original
133
+ description and complete input schema remain available there.
134
+
135
+ `initialize` and `server/discover` return `instructions`: a short
136
+ intent-to-tool routing guide built from the active profile, so it only names
137
+ tools the client can call.
133
138
 
134
139
  ### KB context, leases, and compatibility
135
140
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genexus-mcp",
3
- "version": "3.13.0",
3
+ "version": "3.14.0",
4
4
  "mcpName": "io.github.lennix1337/genexus",
5
5
  "description": "GeneXus 16, GeneXus 17, GeneXus 18 MCP server with native SDK support; basic legacy compatibility for GeneXus Evolution 3, GeneXus Evolution 2, GeneXus Evolution 1, GeneXus 15, GeneXus 9.0, GeneXus 8.0 via com-gxpublic and dotnet-reflection drivers — read, edit, and analyze Knowledge Base objects directly from Claude, Cursor, and other AI agents over the Model Context Protocol.",
6
6
  "keywords": [
@@ -7,7 +7,7 @@
7
7
  "targets": {
8
8
  ".NETCoreApp,Version=v10.0": {},
9
9
  ".NETCoreApp,Version=v10.0/win-x64": {
10
- "GxMcp.Gateway/3.13.0": {
10
+ "GxMcp.Gateway/3.14.0": {
11
11
  "dependencies": {
12
12
  "Newtonsoft.Json": "13.0.3",
13
13
  "System.Management": "10.0.5",
@@ -66,7 +66,7 @@
66
66
  }
67
67
  },
68
68
  "libraries": {
69
- "GxMcp.Gateway/3.13.0": {
69
+ "GxMcp.Gateway/3.14.0": {
70
70
  "type": "project",
71
71
  "serviceable": false,
72
72
  "sha512": ""
Binary file
Binary file
@@ -1,19 +1,19 @@
1
1
  {
2
+ "ConfigSchemaVersion": 2,
3
+ "GeneXus": {
4
+ "WorkerExecutable": "worker\\\\GxMcp.Worker.exe",
5
+ "InstallationPath": "C:\\Program Files (x86)\\GeneXus\\GeneXus18"
6
+ },
7
+ "GatewayMode": "stdio-isolated",
2
8
  "Server": {
3
- "WorkerIdleTimeoutMinutes": 5,
9
+ "TerseResponses": true,
10
+ "EmitStructuredContent": false,
4
11
  "McpStdio": true,
12
+ "HttpPort": 0,
5
13
  "SessionIdleTimeoutMinutes": 10,
6
- "EmitStructuredContent": false,
7
- "TerseResponses": true,
8
- "HttpPort": 0
14
+ "WorkerIdleTimeoutMinutes": 5
9
15
  },
10
- "ConfigSchemaVersion": 2,
11
- "GatewayMode": "stdio-isolated",
12
16
  "Environment": {
13
17
  "ResolutionPolicy": "strict"
14
- },
15
- "GeneXus": {
16
- "WorkerExecutable": "worker\\\\GxMcp.Worker.exe",
17
- "InstallationPath": "C:\\Program Files (x86)\\GeneXus\\GeneXus18"
18
18
  }
19
19
  }
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schemaVersion": "gxmcp-release-manifest/1",
3
- "version": "3.13.0",
4
- "sourceCommit": "8bba8d7aad9deca27d9d88c77e762dd2244bcdc4",
3
+ "version": "3.14.0",
4
+ "sourceCommit": "f01292782f848a1dcdc34a25c4df587109fae958",
5
5
  "sourceCommitPolicy": "exact-tag",
6
- "generatedAtUtc": "2026-10-09T03:33:43.9652493Z",
6
+ "generatedAtUtc": "2026-10-11T15:50:22.5851347Z",
7
7
  "runtime": {
8
8
  "gateway": "net10.0-windows",
9
9
  "worker": "net48-x86",
@@ -15,33 +15,33 @@
15
15
  "2026-07-28"
16
16
  ],
17
17
  "schema": "tool_definitions.json",
18
- "schemaSha256": "31c512cdf76eff834cc18ebe4be520b8b83fb403166be18f29f60155e1008c97",
18
+ "schemaSha256": "440b995c7f9a52d263eddf25540360171074afd2348c41c6c67d46f9154c46ea",
19
19
  "provenance": "gxmcp-sbom.json",
20
20
  "artifacts": [
21
21
  {
22
22
  "path": "gxmcp-sbom.json",
23
23
  "size": 591,
24
- "sha256": "a069f947d964d1b37715d94a9c0578099d5e3cd35397f8c4a241cb09c4ce6c11"
24
+ "sha256": "86f802b1181f634a72135ec29d3a5d060e413232af5b2a244f3144c2b87f8054"
25
25
  },
26
26
  {
27
27
  "path": "GxMcp.Gateway.exe",
28
28
  "size": 162304,
29
- "sha256": "ab9e22cd74d8e968126a7da384ef273196ebf4d9e55ee1c5ad0f18e574b91358"
29
+ "sha256": "fa65c1d520a4f11c773c7cc42a7dd7f7d526593bc1fc9f45186c5584a731b26f"
30
30
  },
31
31
  {
32
32
  "path": "nexus-ide.vsix",
33
- "size": 1319958,
34
- "sha256": "81460e8ad868007ebcf04f802f1dd6b3b625bb3813fe6dcf1c7cc3daee050bc1"
33
+ "size": 1319956,
34
+ "sha256": "f88521f2a4c580ecdbf389335fff35c83dad4b7b862108c9d603477b43ce2b8b"
35
35
  },
36
36
  {
37
37
  "path": "tool_definitions.json",
38
- "size": 147102,
39
- "sha256": "31c512cdf76eff834cc18ebe4be520b8b83fb403166be18f29f60155e1008c97"
38
+ "size": 152232,
39
+ "sha256": "440b995c7f9a52d263eddf25540360171074afd2348c41c6c67d46f9154c46ea"
40
40
  },
41
41
  {
42
42
  "path": "worker/GxMcp.Worker.exe",
43
- "size": 4143104,
44
- "sha256": "bf3285f0a043276c39a5f118ffc7f1d56a736b6fdbd3413a17620bf4b92fc96e"
43
+ "size": 4161024,
44
+ "sha256": "921fd79cde9d1a2ae3c915ac5c525c3adac7baf029ea47989aa1ae6296bbd251"
45
45
  }
46
46
  ]
47
47
  }
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "schemaVersion": "gxmcp-provenance/1",
3
- "version": "3.13.0",
4
- "sourceCommit": "8bba8d7aad9deca27d9d88c77e762dd2244bcdc4",
3
+ "version": "3.14.0",
4
+ "sourceCommit": "f01292782f848a1dcdc34a25c4df587109fae958",
5
5
  "sourceCommitPolicy": "exact-tag",
6
6
  "components": [
7
7
  {
8
8
  "name": "genexus-mcp",
9
9
  "lockfile": "package-lock.json",
10
10
  "size": 38806,
11
- "sha256": "6e541b2627b496630c928de3856e3bbd14b8d682f05fe8acad17a31205ba0d7e"
11
+ "sha256": "6b86c72717bbe224a34372c0a7d795f4a0b05acd0948f66794ee9b6fcef809ab"
12
12
  },
13
13
  {
14
14
  "name": "nexus-ide",
15
15
  "lockfile": "src/nexus-ide/package-lock.json",
16
- "size": 267538,
17
- "sha256": "f16469901322693f6f2fa4e4babbbfc9ef28b15a0867362731641e25fed47d81"
16
+ "size": 186678,
17
+ "sha256": "953ed5fc3493b150b1fdb3d410dbff02c15ea6da3b31555490e26773b9e4efad"
18
18
  }
19
19
  ]
20
20
  }
Binary file
Binary file
@@ -1,25 +1,25 @@
1
- @echo off
2
- setlocal
3
-
4
- rem Resolve the directory containing this bat file (works at any install path).
5
- set "BAT_DIR=%~dp0"
6
- rem Remove trailing backslash so paths join cleanly.
7
- if "%BAT_DIR:~-1%"=="\" set "BAT_DIR=%BAT_DIR:~0,-1%"
8
-
9
- rem Only set GX_CONFIG_PATH when the caller hasn't provided one.
10
- if not defined GX_CONFIG_PATH (
11
- set "GX_CONFIG_PATH=%BAT_DIR%\config.json"
12
- )
13
-
14
- set "GX_MCP_STDIO=true"
15
-
16
- rem Launch the gateway exe that lives alongside this bat file.
17
- set "GATEWAY_EXE=%BAT_DIR%\GxMcp.Gateway.exe"
18
- if exist "%GATEWAY_EXE%" (
19
- "%GATEWAY_EXE%"
20
- exit /b %ERRORLEVEL%
21
- )
22
-
23
- rem Fallback: run the DLL via dotnet (dev layout where .exe is not present).
24
- cd /d "%BAT_DIR%"
1
+ @echo off
2
+ setlocal
3
+
4
+ rem Resolve the directory containing this bat file (works at any install path).
5
+ set "BAT_DIR=%~dp0"
6
+ rem Remove trailing backslash so paths join cleanly.
7
+ if "%BAT_DIR:~-1%"=="\" set "BAT_DIR=%BAT_DIR:~0,-1%"
8
+
9
+ rem Only set GX_CONFIG_PATH when the caller hasn't provided one.
10
+ if not defined GX_CONFIG_PATH (
11
+ set "GX_CONFIG_PATH=%BAT_DIR%\config.json"
12
+ )
13
+
14
+ set "GX_MCP_STDIO=true"
15
+
16
+ rem Launch the gateway exe that lives alongside this bat file.
17
+ set "GATEWAY_EXE=%BAT_DIR%\GxMcp.Gateway.exe"
18
+ if exist "%GATEWAY_EXE%" (
19
+ "%GATEWAY_EXE%"
20
+ exit /b %ERRORLEVEL%
21
+ )
22
+
23
+ rem Fallback: run the DLL via dotnet (dev layout where .exe is not present).
24
+ cd /d "%BAT_DIR%"
25
25
  dotnet GxMcp.Gateway.dll
@@ -2,10 +2,11 @@
2
2
  {"name":"genexus_k2b_designer","description":"Inspect and edit an already-active K2B WebPanel Designer through the open GeneXus IDE document. The IDE bridge must be installed and started with the same explicit KB and pipe. No inactive Designer activation or pattern conversion is performed. Edits require expectedVersion; preview returns a read-only change summary; saves use the native IDE path and should be independently reread.","inputSchema":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Name of an open WebPanel with an active K2B Designer."},"action":{"type":"string","enum":["inspect","tree","preview","set_property","add_node","move_node","remove_node"],"default":"inspect","description":"Inspect the active Designer, read its tree, preview a change, or apply a typed edit."},"operation":{"type":"string","enum":["set_property","add_node","move_node","remove_node"],"description":"Mutation to validate when action=preview."},"path":{"type":"string","description":"Designer node path returned by tree; root is root."},"property":{"type":"string","description":"Exact SDK property name for set_property."},"value":{"type":"string","description":"Property value in the K2B SDK string format."},"nodeType":{"type":"string","description":"SDK node type offered by the Designer for add_node."},"destination":{"type":"string","description":"Parent node path for move_node."},"index":{"type":"integer","minimum":0,"description":"Optional destination child index for move_node."},"expectedVersion":{"type":"string","description":"Version from inspect, tree, or preview; required for mutations."},"confirm":{"type":"boolean","description":"Required for remove_node."},"kb":{"type":"string","description":"Explicit KB alias."}},"examples":[{"name":"SamplePanel","action":"tree"},{"name":"SamplePanel","action":"preview","operation":"set_property","path":"root","property":"Title","value":"Orders"},{"name":"SamplePanel","action":"set_property","path":"root","property":"Title","value":"Orders","expectedVersion":"<version from preview>"}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},
3
3
  {"name":"genexus_data_view","description":"Native, typed, atomic Transaction + Data View authoring over an existing physical table. action=inspect|dry_run|create|update|delete. dry_run performs validation without constructing or saving SDK objects. create/update persist the root-only Transaction and Data View, then reread and verify the committed pair; commit and verification status are reported separately. action=delete is destructive and requires confirm=true when dryRun=false. No action implicitly runs Specify, Generate, Build, Rebuild, Reorg, compilation, publish, execution, or tests; the response includes a no-DDL reorg preview.","inputSchema":{"type":"object","required":["action","transaction","dataViewName"],"additionalProperties":false,"properties":{"action":{"type":"string","enum":["inspect","dry_run","create","update","delete"],"description":"Operation to inspect, preview, create, update, or delete a native Data View mapping."},"transaction":{"type":"string","description":"Root-only Transaction name."},"dataViewName":{"type":"string","description":"Data View name associated with the Transaction logical table."},"dataStore":{"type":"string","description":"Existing GeneXus data store category (default Default)."},"schema":{"type":"string","description":"Existing physical schema."},"table":{"type":"string","description":"Existing physical table and GeneXus table-metadata name."},"attributeMappings":{"type":"array","items":{"type":"object","required":["attribute","column"],"additionalProperties":false,"properties":{"attribute":{"type":"string"},"column":{"type":"string"},"key":{"type":"boolean","default":false}}}},"updatable":{"type":"boolean","default":true},"expectedVersion":{"type":"string","description":"Optimistic concurrency token returned by inspect/dry_run/create/update/delete preview."},"dryRun":{"type":"boolean","default":false,"description":"Forces every action to remain read-only; create/update validate their complete definition and delete returns a deletion preview."},"confirm":{"type":"boolean","description":"Required for action=delete when dryRun=false; explicitly authorizes removing the Transaction and Data View."},"rollbackOnFailure":{"type":"boolean","default":true,"description":"Atomic SDK rollback is always enforced; this flag records the caller's rollback intent."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"action":"dry_run","transaction":"LedgerEntryView","dataViewName":"LedgerEntryDV","dataStore":"Default","schema":"APP","table":"LEDGERENTRY","updatable":true,"attributeMappings":[{"attribute":"LedgerEntryId","column":"LedgerEntryId","key":true},{"attribute":"LedgerEntryAmount","column":"LedgerEntryAmount"}],"rollbackOnFailure":true},{"action":"delete","transaction":"LedgerEntryView","dataViewName":"LedgerEntryDV","confirm":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},
4
4
  {"name":"genexus_whoami","description":"KB context + version + health (worker/index/database) + next-step hints. Call FIRST every session. Lean by default; pass verbose=true ONCE for the inline playbooks + skills catalog of verified GeneXus reference resources (navigation, GAM, SD panel, WebPanel events). For a minimal connection+index health check use genexus_doctor.","inputSchema":{"type":"object","properties":{"verbose":{"type":"boolean","description":"Include the static playbooks + skills catalog + per-tool stats/heatmap. Default false (lean health payload)."}},"additionalProperties":false,"examples":[{},{"verbose":true}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
5
+ {"name":"genexus_wire","description":"MANDATORY ARCHITECTURAL DISCOVERY & CALL GRAPH ENGINE (Rust native, sub-10ms). Call this FIRST before genexus_read, genexus_query, or editing KB objects to orient on any task. Features domain synonyms (fat->faturamento), shortest-path tracing, auto-refreshed cache (mtime), callers/impact, and native Mermaid diagrams. action=pack_task (default, orientation bundle) | status (KB status & hubs) | for (semantic search with synonyms) | callers (who calls symbol) | impact (blast radius) | path (trace shortest path from A to B via 'from' and 'to') | slice (variable data flow) | safe_delete (safe deletion check) | index (fast cache) | doctor (engine diagnostics).","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["pack_task","status","for","callers","impact","path","slice","safe_delete","index","doctor"],"default":"pack_task","description":"Architectural discovery action to run."},"task":{"type":"string","description":"Intent / task description in natural language (for pack_task or for actions)."},"target":{"type":"string","description":"Symbol name (e.g. 'CustomerProc' or 'CustomerProc:VarName' for slice)."},"from":{"type":"string","description":"Source symbol name for path action (e.g. 'PInvoice')."},"to":{"type":"string","description":"Target symbol name for path action (e.g. 'Customer')."},"token_budget":{"type":"integer","description":"Maximum token budget cap (default 1200)."},"full":{"type":"boolean","default":false,"description":"Bypass token budget clipping and output full untruncated graph/results."},"format":{"type":"string","enum":["xml","json","toon","mermaid"],"default":"xml","description":"Output format: toon (~40% savings, recommended), xml, json, or mermaid (graph diagram)."},"kb":{"type":"string","description":"KB alias or directory path (defaults to active open KB)."},"dir":{"type":"string","description":"Explicit KB directory path override."}},"additionalProperties":false,"examples":[{"action":"pack_task","task":"Update invoice discount calculation"},{"action":"status"},{"action":"path","from":"PInvoice","to":"Customer","format":"mermaid"},{"action":"for","task":"faturamento clientes"},{"action":"callers","target":"CalculateDiscount"},{"action":"impact","target":"InvoiceTotal"},{"action":"slice","target":"CalculateDiscount:DiscountRate"},{"action":"doctor"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
5
6
  {"name":"genexus_recipe","description":"Named playbooks + self-extending macros. action=list|describe|suggest_macro|crystallize.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Recipe key (latest version), 'name@v1' (pinned), or 'list'."},"action":{"type":"string","enum":["list","describe","suggest_macro","crystallize"],"description":"list: show recipes; describe: inspect recipe; suggest_macro: detect repeated sequences; crystallize: save sequence as recipe."},"windowMinutes":{"type":"integer","description":"suggest_macro: history window (default 30)."},"minRepetitions":{"type":"integer","description":"suggest_macro: threshold (default 3)."},"macroName":{"type":"string","description":"crystallize: proposed name from suggest_macro."},"description":{"type":"string","description":"crystallize: human-readable description."},"steps":{"type":"array","items":{"type":"object","description":"Tool call step object or template."},"description":"crystallize: ordered array of tool call steps to include in the macro."}},"examples":[{"name":"list"},{"name":"wwp_on_transaction"},{"action":"suggest_macro"}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},
6
- {"name":"genexus_query","description":"Search objects in active KB. Prefixes: name:, type:, usedby:, parent:, parentPath:, description:. name:\"X\" (or bare quoted \"X\") demands exact-name match — use it when you know the object's name. Compact by default. Pass kbs:[...] to run the same read-only search across an explicit set of already-open KBs in one bounded, per-KB-reported call. See genexus://kb/tool-help/genexus_query. Requires the KB index to be Ready — check genexus_lifecycle action=status if results look empty.","inputSchema":{"type":"object","properties":{"query":{"type":"string"},"typeFilter":{"type":"string"},"domainFilter":{"type":"string"},"limit":{"type":"integer"},"inline_read_top":{"type":"integer","description":"0-3. Inline reads of top N."},"sort":{"type":"string","enum":["relevance","lastUpdate"],"description":"relevance (default) or lastUpdate (newest first; bypasses score ranking)."},"since":{"type":"string","description":"ISO-8601 UTC. Only items with lastUpdate >= since."},"modifiedBefore":{"type":"string","description":"ISO-8601 UTC. Only items with lastUpdate < modifiedBefore."},"cursor":{"type":"string","description":"Opaque token from prior nextCursor. Use with sort=lastUpdate for stable paging."},"kb":{"type":"string","description":"KB alias."},"kbs":{"type":"array","items":{"type":"string"},"description":"Federated read-only discovery over an explicit KB set (max 16). Uses only already-open KBs and never opens one (the Worker pool can evict a KB you are working in). Results are grouped per KB with per-KB status and complete flags plus a coverage summary; a not-open/warming/slow/failing KB is reported individually, never as zero matches. Mutually exclusive with kb."},"cursors":{"type":"object","additionalProperties":{"type":"string"},"description":"Per-KB continuation: map each alias in kbs to that KB's nextCursor. An alias outside kbs is rejected, not dropped."},"maxConcurrency":{"type":"integer","description":"Federation only: KBs searched in parallel (default 4, max 8)."},"maxTotalResults":{"type":"integer","description":"Federation only: total results across all KBs (default 500, max 5000). Overflow marks the affected KB incomplete with its nextCursor intact."},"perKbTimeoutMs":{"type":"integer","description":"Federation only: per-KB deadline in ms (default 30000, max 120000)."},"axiCompact":{"type":"boolean","description":"Compact projection (default true).","default":true},"exactMatch":{"type":"boolean","description":"Require an exact object-name match."}},"required":["query"],"examples":[{"query":"type:Transaction parent:Customers"},{"query":"\"Customer\"","limit":5},{"query":"name:\"Customer\"","kbs":["KbAlpha","KbBeta"]}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
7
+ {"name":"genexus_query","description":"Search objects in active KB. Prefixes: name:, type:, usedby:, parent:, parentPath:, description:. name:\"X\" (or bare quoted \"X\") demands exact-name match — use it when you know the object's name. Compact by default. Pass kbs:[...] to run the same read-only search across an explicit set of already-open KBs in one bounded, per-KB-reported call. TIP: For architectural orientation, intent ranking, or call graph impact, call genexus_wire first (sub-10ms, token-budgeted). See genexus://kb/tool-help/genexus_query. Requires the KB index to be Ready — check genexus_lifecycle action=status if results look empty.","inputSchema":{"type":"object","properties":{"query":{"type":"string"},"typeFilter":{"type":"string"},"domainFilter":{"type":"string"},"limit":{"type":"integer"},"inline_read_top":{"type":"integer","description":"0-3. Inline reads of top N."},"sort":{"type":"string","enum":["relevance","lastUpdate"],"description":"relevance (default) or lastUpdate (newest first; bypasses score ranking)."},"since":{"type":"string","description":"ISO-8601 UTC. Only items with lastUpdate >= since."},"modifiedBefore":{"type":"string","description":"ISO-8601 UTC. Only items with lastUpdate < modifiedBefore."},"cursor":{"type":"string","description":"Opaque token from prior nextCursor. Use with sort=lastUpdate for stable paging."},"kb":{"type":"string","description":"KB alias."},"kbs":{"type":"array","items":{"type":"string"},"description":"Federated read-only discovery over an explicit KB set (max 16). Uses only already-open KBs and never opens one (the Worker pool can evict a KB you are working in). Results are grouped per KB with per-KB status and complete flags plus a coverage summary; a not-open/warming/slow/failing KB is reported individually, never as zero matches. Mutually exclusive with kb."},"cursors":{"type":"object","additionalProperties":{"type":"string"},"description":"Per-KB continuation: map each alias in kbs to that KB's nextCursor. An alias outside kbs is rejected, not dropped."},"maxConcurrency":{"type":"integer","description":"Federation only: KBs searched in parallel (default 4, max 8)."},"maxTotalResults":{"type":"integer","description":"Federation only: total results across all KBs (default 500, max 5000). Overflow marks the affected KB incomplete with its nextCursor intact."},"perKbTimeoutMs":{"type":"integer","description":"Federation only: per-KB deadline in ms (default 30000, max 120000)."},"axiCompact":{"type":"boolean","description":"Compact projection (default true).","default":true},"exactMatch":{"type":"boolean","description":"Require an exact object-name match."}},"required":["query"],"examples":[{"query":"type:Transaction parent:Customers"},{"query":"\"Customer\"","limit":5},{"query":"name:\"Customer\"","kbs":["KbAlpha","KbBeta"]}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
7
8
  {"name":"genexus_list_objects","description":"List objects with pagination. Feed nextOffset until hasMore=false. Every item exposes its persisted GUID and path; verbose=true also exposes the typed EntityKey when available.","inputSchema":{"type":"object","properties":{"filter":{"type":"string","description":"Legacy: name OR description. Prefer nameFilter/descriptionFilter."},"nameFilter":{"type":"string","description":"Substring on name."},"descriptionFilter":{"type":"string","description":"Substring on description."},"pathPrefix":{"type":"string","description":"Folder prefix, e.g. 'Root Module/X/'."},"limit":{"type":"integer"},"offset":{"type":"integer"},"parent":{"type":"string"},"parentPath":{"type":"string"},"typeFilter":{"type":"string"},"verbose":{"type":"boolean","description":"Full item shape."},"sort":{"type":"string","enum":["name","lastUpdate"],"description":"name (default, type-bucketed) or lastUpdate (newest first)."},"since":{"type":"string","description":"ISO-8601 UTC. Only items with lastUpdate >= since."},"modifiedBefore":{"type":"string","description":"ISO-8601 UTC. Only items with lastUpdate < modifiedBefore."},"cursor":{"type":"string","description":"Opaque token from prior nextCursor. Use with sort=lastUpdate for stable paging."},"inline_read_top":{"type":"integer","description":"0-3. Inline reads of top N."},"kb":{"type":"string","description":"KB alias."},"axiCompact":{"type":"boolean","description":"Compact projection (default true).","default":true},"projection":{"type":"string","enum":["minimal","standard","verbose"],"description":"minimal=name+type+lastUpdate; standard=default compact; verbose=all fields. Overrides axiCompact when set."}},"examples":[{"limit":25},{"typeFilter":"Transaction","limit":10}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
8
- {"name":"genexus_read","description":"Read object code and metadata. Omitting 'part' (RECOMMENDED) returns the COMPLETE object in 1 call (rules with parm, source/events, variables, structure, called signatures) tailored to the object type. Resolve modular objects by name/type, persisted GUID, EntityKey, or path. Pass 'part' only for targeted single-part reads. Response carries versionToken for safe writes. A single-part response also carries contentToken: echo it back as ifUnchangedSince to re-read the same representation without retransmitting an unchanged body. See genexus://kb/tool-help/genexus_read.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"targets":{"type":"array","items":{"type":"string"}},"guid":{"type":"string","description":"Persisted object GUID from genexus_list_objects."},"entityKey":{"type":"string","description":"Typed GeneXus EntityKey from genexus_list_objects verbose output."},"path":{"type":"string","description":"Module/folder-qualified object path from genexus_list_objects."},"part":{"type":"string","description":"DataSelector: parameters|conditions|orders|projection|definedBy|baseTransaction|baseTable|joins|structure."},"parts":{"type":"array","items":{"type":"string"},"description":"Selected parts; unavailable DataSelector parts appear in unsupportedParts. Mutually exclusive with part/offset/limit."},"offset":{"type":"integer"},"limit":{"type":"integer"},"refresh":{"type":"boolean","default":false,"description":"Bypass response caches, invalidate the SDK object, then independently reload the same identity. Use after an IDE save. Fails with FreshReadUnavailable if freshness cannot be confirmed. readFreshness reports Worker origin/age; _meta reports Gateway cache hits."},"ifUnchangedSince":{"type":"string","description":"Opaque contentToken from a previous single-part read of the SAME object/part/offset/limit. Provably unchanged -> notModified:true with identity and freshness metadata and no source; otherwise the full body plus a new contentToken and conditional.reason. Single-part reads only (rejected with ConditionalReadUnsupportedForm on targets[]/parts[]/full-object forms). Omit to keep the unconditional behavior."},"type":{"type":"string"},"kb":{"type":"string","description":"KB alias."}},"examples":[{"name":"Customer"},{"name":"Customer","type":"Procedure","guid":"<guid-from-list>"},{"name":"Customer","path":"Operations/Customer","type":"Procedure"},{"name":"Customer","part":"Source"},{"name":"Customer","part":"Source","refresh":true},{"name":"Customer","part":"Source","limit":0,"ifUnchangedSince":"<contentToken-from-previous-read>"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
9
+ {"name":"genexus_read","description":"Read object code and metadata. Omitting 'part' (RECOMMENDED) returns the COMPLETE object in 1 call (rules with parm, source/events, variables, structure, called signatures) tailored to the object type. Resolve modular objects by name/type, persisted GUID, EntityKey, or path. Pass 'part' only for targeted single-part reads. Response carries versionToken for safe writes. A single-part response also carries contentToken: echo it back as ifUnchangedSince to re-read the same representation without retransmitting an unchanged body. TIP: Avoid blind whole-object reads; call genexus_wire action=pack_task or callers/impact first to pinpoint exact targets. See genexus://kb/tool-help/genexus_read.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"targets":{"type":"array","items":{"type":"string"}},"guid":{"type":"string","description":"Persisted object GUID from genexus_list_objects."},"entityKey":{"type":"string","description":"Typed GeneXus EntityKey from genexus_list_objects verbose output."},"path":{"type":"string","description":"Module/folder-qualified object path from genexus_list_objects."},"part":{"type":"string","description":"DataSelector: parameters|conditions|orders|projection|definedBy|baseTransaction|baseTable|joins|structure."},"parts":{"type":"array","items":{"type":"string"},"description":"Selected parts; unavailable DataSelector parts appear in unsupportedParts. Mutually exclusive with part/offset/limit."},"offset":{"type":"integer"},"limit":{"type":"integer"},"refresh":{"type":"boolean","default":false,"description":"Bypass response caches, invalidate the SDK object, then independently reload the same identity. Use after an IDE save. Fails with FreshReadUnavailable if freshness cannot be confirmed. readFreshness reports Worker origin/age; _meta reports Gateway cache hits."},"ifUnchangedSince":{"type":"string","description":"Opaque contentToken from a previous single-part read of the SAME object/part/offset/limit. Provably unchanged -> notModified:true with identity and freshness metadata and no source; otherwise the full body plus a new contentToken and conditional.reason. Single-part reads only (rejected with ConditionalReadUnsupportedForm on targets[]/parts[]/full-object forms). Omit to keep the unconditional behavior."},"type":{"type":"string"},"kb":{"type":"string","description":"KB alias."}},"examples":[{"name":"Customer"},{"name":"Customer","type":"Procedure","guid":"<guid-from-list>"},{"name":"Customer","path":"Operations/Customer","type":"Procedure"},{"name":"Customer","part":"Source"},{"name":"Customer","part":"Source","refresh":true},{"name":"Customer","part":"Source","limit":0,"ifUnchangedSince":"<contentToken-from-previous-read>"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
9
10
  {"name":"genexus_edit","description":"Edit object part. name or targets (exclusive). mode: full|patch|ops. dryRun first. async=true returns an operationId for lifecycle polling. Text payloads for Source/Rules/Events/Code must contain real line breaks; literal backslash sequences \\r\\n, \\n, or \\r are rejected before persistence with LiteralLineBreaksDetected. For WWP edit host's PatternInstance NOT the parent WebForm (gets overwritten on reapply). Uncertain about a property/method/event? → resources/read uri=genexus://kb/skills/navigation (or gam-integrated-security / sd-panel-mobile / webpanel-events) first.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"part":{"type":"string"},"parts":{"type":"array","description":"Multi-part edit on a single object. Each item: {part, content, mode?}. Saves the object once atomically. Text content must use real line breaks; literal backslash sequences \\r\\n, \\n, or \\r are rejected before persistence.","items":{"type":"object","properties":{"part":{"type":"string"},"content":{"type":"string"},"mode":{"type":"string"}},"required":["part","content"]}},"mode":{"type":"string","enum":["full","patch","ops"]},"content":{"type":"string"},"ops":{"type":"array","description":"GeneXus semantic ops (NOT RFC 6902 JSON-Patch). Each item: {op, args}. Supported ops: set_attribute, add_attribute, remove_attribute (Transaction); add_rule, remove_rule (Transaction/Procedure/WebPanel); set_property (any kind). Use mode=patch for textual find/replace.","items":{"type":"object","properties":{"op":{"type":"string","enum":["set_attribute","add_attribute","remove_attribute","add_rule","remove_rule","set_property"]},"args":{"type":"object","description":"Op-specific args. set_attribute: {name, type?, description?}. add_attribute: {name, type, ...}. add_rule: {rule}. set_property: {name, value}."}},"required":["op"]}},"patch":{"type":"object","additionalProperties":true,"description":"Shorthand for {find,replace}; implies mode=patch when mode is omitted, and is a usage_error with mode=full|ops: find is the exact existing text, replace is inserted literally (no auto-indentation). Optional opt-in protections: scope bounds the search region, indentation validates the replacement's base indent. Both apply ONLY to this shape — never with operation, mode=ops, targets[], parts[], Insert_After or Append.","properties":{"find":{"type":"string","description":"Exact existing text to find. Real line breaks; tabs/spaces must match the part."},"replace":{"type":"string","description":"Replacement text, inserted literally."},"scope":{"type":"object","required":["start"],"description":"Region delimited by complete-line anchors: editable starts after scope.start's last line and ends before scope.end's first line (EOF when end is omitted). Anchors stay outside the region, are compared with only CRLF/LF normalized, and must each be unique. Errors: ScopeStartRequired, ScopeAnchorNotFound, ScopeAnchorAmbiguous, ScopeAnchorNotComparable. The response reports editableStartLine, editableEndLineExclusive and scopeEndsAtEof.","properties":{"start":{"type":"string","description":"Required. Unique complete-line anchor ending immediately before the editable region."},"end":{"type":"string","description":"Optional. Unique complete-line anchor starting immediately after the editable region. Omitted = region runs to EOF."}}},"indentation":{"type":"object","required":["mode"],"description":"Validates the base indentation of the located match against the first line of replace before persisting; tabs and spaces are distinct and nothing is reformatted. With replaceAll=true every match is validated. Errors: IndentationMismatch, IndentationNotComparable.","properties":{"mode":{"type":"string","enum":["validate"],"description":"validate: block the write when the replacement's base indentation differs from the matched line's."}}}}},"scope":{"type":"object","description":"patch.scope may also be passed at the top level. Honored ONLY by the abbreviated patch={find,replace} form; combined with operation, mode=ops, targets[], parts[], Insert_After or Append the call is rejected with ScopeUnsupportedPatchForm and nothing is written."},"indentation":{"type":"object","description":"patch.indentation may also be passed at the top level. Honored ONLY by the abbreviated patch={find,replace} form; combined with operation, mode=ops, targets[], parts[], Insert_After or Append the call is rejected with IndentationUnsupportedPatchForm and nothing is written."},"context":{"type":"string","description":"Exact existing text to find (Replace) or anchor after (Insert_After). Required for both. For text parts, send real line breaks; literal backslash sequences \\r\\n, \\n, or \\r are rejected before persistence."},"operation":{"type":"string","enum":["Replace","Insert_After","Append"]},"expectedCount":{"type":"integer"},"replaceAll":{"type":"boolean","description":"patch mode only. Apply to ALL occurrences instead of requiring expectedCount to match exactly."},"dryRun":{"type":"boolean"},"async":{"type":"boolean","description":"Run as a background job. Result returns operationId/job_id for genexus_lifecycle polling."},"estimated_seconds":{"type":"integer","description":"When async=true, expected runtime used for progress/job metadata (default 30)."},"verifyRollback":{"type":"boolean"},"targets":{"type":"array","description":"Multi-target Source/Rules writes. Each target may include expectedVersion/baseVersion; all versions are checked before the first write.","items":{"type":"object","properties":{"name":{"type":"string"},"part":{"type":"string"},"content":{"type":"string"},"expectedVersion":{"type":"string"},"baseVersion":{"type":"string"}},"required":["name","content"]}},"type":{"type":"string"},"return_post_state":{"type":"boolean","description":"Omit post_state.diff (default true)."},"includePersistedText":{"type":"boolean","description":"Full text; default false."},"verbose":{"type":"boolean","description":"Add ±15-line slices to post_state."},"validate":{"type":"string","enum":["strict","best-effort","only"],"description":"strict (default) aborts on first error and post-write-verifies visual/PatternInstance writes (re-reads + diffs the persisted XML). best-effort applies what compiles and SKIPS the post-write XML re-read/diff (faster on large WebForm/PatternInstance writes; build to confirm). only runs in-memory, no persist."},"validationMode":{"type":"string","enum":["specify"],"description":"Issue #60: run the inline Specify pass (Spec+Gen, no Compile) against the edited object right after the write, returning structured spc*/gen* diagnostics in the same call. Combines with rollbackOnFailure."},"rollbackOnFailure":{"type":"boolean","description":"Explicit rollback only. Full Source verification failure reports AtomicRollbackUnavailable without a restore write until atomic conditional restore is supported. Other paths require a valid snapshot. No rollback when false or omitted."},"requireObjectSave":{"type":"boolean","default":false,"description":"Full Source requires transactional object save. Events patch: dryRun available; real writes blocked by ObjectSaveIsolationUnverified until SDK/pattern save-event isolation is established. No override; baseVersion required."},"forceWrite":{"type":"boolean","default":false,"description":"WebForm only: persist despite SDK WebForm validation errors; response includes validationOverridden=true."},"verifyMode":{"type":"string","enum":["semantic","normalized","exact"],"default":"normalized","description":"Post-save text comparison. Full exact compares public-read text verbatim; patch exact retains logical CRLF/LF equivalence. normalized ignores EOL, BOM, trailing whitespace and blank lines; semantic also tolerates casing/spacing. Fresh reread always required. sdkSaveCompleted/saved report physical save; persistedStateKnown and postSaveVerification report read evidence. Mismatch never retries automatically."},"visualVerify":{"type":"boolean","default":false,"description":"Post-edit headless screenshot + pixel-diff vs baseline. See tool-help."},"baseVersion":{"type":"string","description":"Optimistic concurrency: pass the versionToken from the genexus_read this edit is based on. If the object changed since (e.g. edited in the IDE), the write is refused with VersionConflict instead of overwriting the newer version. Omit to skip the check."},"expectedVersion":{"type":"string","description":"Alias of baseVersion. The write is refused when the current version no longer matches."},"concurrencyPolicy":{"type":"string","enum":["warn","fail_if_open"],"default":"warn","description":"warn (default) or fail_if_open if open in GeneXus IDE."},"autoDeclareVariables":{"type":"boolean","default":false,"description":"When true, scans updated source for newly referenced &Variable tokens and auto-declares them in VariablesPart."},"kb":{"type":"string","description":"KB alias."},"changeSet":{"type":"object","required":["action","changes"],"properties":{"action":{"type":"string","enum":["preview","validate","apply"]},"changes":{"type":"array","items":{"type":"object","required":["name","content"],"properties":{"name":{"type":"string"},"part":{"type":"string","enum":["Source","Rules","Variables"]},"content":{"type":"string"},"expectedVersion":{"type":"string"}}}},"changeSetId":{"type":"string"},"baseRevision":{"type":"string"}}},"module":{"type":"string","description":"mode=ops: Transaction module for modular objects."}},"examples":[{"name":"Customer","mode":"patch","part":"Source","patch":{"find":"old","replace":"new"}},{"name":"Customer","mode":"patch","part":"Rules","patch":{"find":"error(","replace":"msg("},"dryRun":true},{"name":"Customer","mode":"patch","part":"Source","patch":{"find":"old","replace":"new","scope":{"start":"// Banco B","end":"// Proximo banco"}}}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},
10
11
  {"name":"genexus_inspect","description":"Use this for a compact object snapshot: metadata, variables, structure, signature and navigation context. Modular objects accept persisted GUID, EntityKey, or path in addition to name/type. Don't use it when you need full Source or exact part bytes; use genexus_read for that. runtimeIds needs a prior build.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"guid":{"type":"string","description":"Persisted object GUID from genexus_list_objects."},"entityKey":{"type":"string","description":"Typed GeneXus EntityKey from genexus_list_objects verbose output."},"path":{"type":"string","description":"Module/folder-qualified object path from genexus_list_objects."},"include":{"type":"array","items":{"type":"string","enum":["metadata","variables","signature","structure","parts","controls","events_repertoire","callers","runtimeIds"]}},"projection":{"type":"string","enum":["minimal","standard","verbose"],"description":"Token budget. minimal=name/type/lastUpdate; standard=default (vars≤40 name+type, source heads 1200c); verbose=full vars + 8000c heads."},"type":{"type":"string"},"kb":{"type":"string","description":"KB alias."},"verbose":{"type":"boolean","description":"Include verbose diagnostic fields."}},"examples":[{"name":"Customer"},{"name":"Customer","type":"Procedure","path":"Operations/Customer"},{"name":"Customer","include":["variables","signature"]}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
11
12
  {"name":"genexus_analyze","description":"Use this for cross-object semantic analysis. mode=context (alias deep_context) returns 360° task context in 1 call (object + called procedures' parm signatures + referenced tables' schemas/PKs + SDTs + callers). Other modes: impact, callers, hierarchy, navigation, linter, summary, explain. mode=theme_classes lists the KB's theme classes (name + objectGuid) so you can pick a class by name; objectGuid is the class object's GUID and is NOT the value a layout class attribute takes, so never invent that value. mode=explain is compatibility-only: it preserves the legacy response envelope and returns NotImplemented; use mode=summary for a concise overview, mode=context for 360° task context, or genexus_read for source. Requires Ready index for impact/callers.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"mode":{"type":"string","enum":["context","deep_context","linter","navigation","hierarchy","impact","cross_platform_impact","callers","event_flow","data_context","ui_context","pattern_metadata","summary","dependency_heatmap","code_metrics","kb_stats","table_relations","theme_classes","explain"]},"code":{"type":"string","description":"mode=explain: legacy code snippet carried through the compatibility-only envelope; the result is NotImplemented. Use mode=summary, mode=context, or genexus_read for supported analysis."},"cursor":{"type":"string","description":"Continuation cursor from a budgeted page. mode=context: scan.nextCursor. mode=callers: the integer scan.nextCursor (resume offset into the caller list)."},"maxCallers":{"type":"integer","description":"mode=callers: callers to scan in this page (default 50)."},"maxSourceBytes":{"type":"integer","description":"mode=callers: UTF-8 bytes of caller source per page (default 4194304). A caller larger than this is listed in scan.skippedCallers."},"format":{"type":"string","enum":["json","ascii"],"description":"mode=dependency_heatmap: ascii adds rendered bar chart."},"kb":{"type":"string","description":"KB alias."},"maxBytes":{"type":"integer","description":"mode=context: maximum UTF-8 bytes for the returned context bundle (bounded by the server)."},"waitForIndex":{"type":"boolean","description":"mode=impact: block up to 30s for Ready index (default true).","default":true},"dryRun":{"type":"boolean","description":"mode=linter: with fix=true, reject the unsupported combination before any SDK read; with fix=false, lint remains read-only."},"fix":{"type":"boolean","description":"mode=linter: apply automatic fixes to the KB."},"top":{"type":"integer","description":"mode=code_metrics: maximum results (default 25)."},"waitTimeoutMs":{"type":"integer","description":"mode=impact: maximum index wait in milliseconds."}},"required":["mode"],"examples":[{"name":"Customer","mode":"impact"},{"name":"Customer","mode":"summary"}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},
@@ -56,5 +57,6 @@
56
57
  {"name":"genexus_worker_pool","description":"Gateway-only worker-pool warm-spare configuration. Does not require a KB selection or dispatch to the Worker.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["warm_spares"],"description":"Worker-pool operation to warm spare workers."},"spareCount":{"type":"integer"},"count":{"type":"integer"}},"examples":[{"action":"warm_spares","spareCount":1}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
57
58
  {"name":"genexus_dfd","description":"Read-only entity-relationship diagram of a Transaction or Table, built only from the table relations the SDK reports: extends (N-1) and subordinates (1-N) edges, a Mermaid erDiagram, and the truncation cause.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Transaction or Table name."},"maxDepth":{"type":"integer","minimum":1,"maximum":6,"description":"Relation hops from the root (default 3)."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"name":"Order"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
58
59
  {"name":"genexus_impact","description":"Read-only affected set of an object over the caller/callee graph: objects with depth, counts by type, a dependencies-first rebuild order, cycles and the cap that truncated it. No risk score.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Object name; a name shared by several objects is refused with their guids and paths."},"guid":{"type":"string","description":"Object GUID."},"entityKey":{"type":"string","description":"Object entity key."},"path":{"type":"string","description":"Object path, with or without the Root Module/ prefix; never falls back to a homonym."},"type":{"type":"string","description":"Object type, to narrow a bare name."},"kb":{"type":"string","description":"KB alias."},"direction":{"type":"string","enum":["up","down","both"],"description":"up: callers (default); down: callees."},"maxDepth":{"type":"integer","minimum":1,"maximum":6,"description":"Default 2."},"maxNodes":{"type":"integer","minimum":1,"maximum":2000,"description":"Default 200."},"typeFilter":{"type":"string","description":"Only report objects of this type; the traversal is unchanged."}},"examples":[{"name":"PostOrder","direction":"up","maxDepth":3}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
59
- {"name":"genexus_object_context","description":"Read-only context of one object: identity from the index, callers/callees with coverage (fieldTrust partial means not read), and its data model (ER diagram for a Transaction/Table), with what was suppressed.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Object name; a name shared by several objects is refused with their guids and paths."},"guid":{"type":"string","description":"Object GUID."},"entityKey":{"type":"string","description":"Object entity key."},"path":{"type":"string","description":"Object path, with or without the Root Module/ prefix; never falls back to a homonym."},"type":{"type":"string","description":"Object type, to narrow a bare name."},"kb":{"type":"string","description":"KB alias."},"maxDepth":{"type":"integer","minimum":1,"maximum":6,"description":"Default 1."},"maxNodes":{"type":"integer","minimum":1,"maximum":2000,"description":"Default 100."}},"examples":[{"guid":"00000000-0000-0000-0000-000000000000"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}
60
+ {"name":"genexus_object_context","description":"Read-only context of one object: identity from the index, callers/callees with coverage (fieldTrust partial means not read), and its data model (ER diagram for a Transaction/Table), with what was suppressed.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Object name; a name shared by several objects is refused with their guids and paths."},"guid":{"type":"string","description":"Object GUID."},"entityKey":{"type":"string","description":"Object entity key."},"path":{"type":"string","description":"Object path, with or without the Root Module/ prefix; never falls back to a homonym."},"type":{"type":"string","description":"Object type, to narrow a bare name."},"kb":{"type":"string","description":"KB alias."},"maxDepth":{"type":"integer","minimum":1,"maximum":6,"description":"Default 1."},"maxNodes":{"type":"integer","minimum":1,"maximum":2000,"description":"Default 100."}},"examples":[{"guid":"00000000-0000-0000-0000-000000000000"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
61
+ {"name":"genexus_workwith","description":"Typed authoring of actions and action parameters for standard WorkWith (WorkWith for Web) pattern instances. action=list_actions|add_action. Preserves strict boundary with WorkWithPlus (genexus_wwp). add_action authors a custom action with Procedure call, ordered parameters, condition expression, and caption on a target tab (default General) through the native SDK. Supports dryRun and optimistic concurrency; never mutates derived objects directly (derived WebComponents may require IDE Apply/build to re-project).","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Target Transaction or standard WorkWith PatternInstance name (e.g. 'TestTrn' or 'WorkWithWebTestTrn')."},"action":{"type":"string","enum":["list_actions","add_action"],"default":"list_actions","description":"Operation to perform: list_actions (read existing actions on tabs) or add_action (author a typed action with Procedure call)."},"tab":{"type":"string","default":"General","description":"Target tab code on the View (default 'General')."},"actionName":{"type":"string","description":"Unique name for the action (required for add_action, e.g. 'ExecutaTeste')."},"caption":{"type":"string","description":"Display caption for the button (defaults to actionName)."},"procedure":{"type":"string","description":"Target Procedure name or GUID to invoke on action click (required for add_action)."},"parameters":{"type":"array","items":{"type":"string"},"description":"Ordered parameters passed to the Procedure (attributes, variables, or expressions, e.g. ['procUrlTeste(\"General\")', 'TestTrnEmpresaId'])."},"condition":{"type":"string","description":"Optional condition expression to determine whether the action is enabled."},"dryRun":{"type":"boolean","default":false,"description":"When true, returns the execution plan without persisting changes to the KB."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"name":"Customer","action":"list_actions"},{"name":"TestTrn","action":"add_action","tab":"General","actionName":"ExecutaTeste","caption":"Executa Teste","procedure":"procExecutaTeste","parameters":["procUrlTeste(\"General\")","TestTrnEmpresaId"],"condition":"TestTrnPropria","dryRun":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}
60
62
  ]
Binary file