@netoalmanca/advpl-sensei 1.1.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/agents/changelog-generator.md +63 -0
- package/agents/code-generator.md +215 -0
- package/agents/code-reviewer.md +145 -0
- package/agents/debugger.md +83 -0
- package/agents/doc-generator.md +67 -0
- package/agents/docs-reference.md +86 -0
- package/agents/migrator.md +84 -0
- package/agents/process-consultant.md +97 -0
- package/agents/refactorer.md +75 -0
- package/agents/sx-configurator.md +67 -0
- package/commands/changelog.md +66 -0
- package/commands/diagnose.md +67 -0
- package/commands/docs.md +81 -0
- package/commands/document.md +67 -0
- package/commands/explain.md +60 -0
- package/commands/generate.md +111 -0
- package/commands/migrate.md +81 -0
- package/commands/process.md +111 -0
- package/commands/refactor.md +65 -0
- package/commands/review.md +60 -0
- package/commands/sxgen.md +98 -0
- package/commands/test.md +103 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +143 -0
- package/dist/index.js.map +1 -0
- package/package.json +30 -0
- package/skills/advpl-code-generation/SKILL.md +163 -0
- package/skills/advpl-code-generation/patterns-fwformbrowse.md +485 -0
- package/skills/advpl-code-generation/patterns-jobs.md +519 -0
- package/skills/advpl-code-generation/patterns-mvc.md +765 -0
- package/skills/advpl-code-generation/patterns-pontos-entrada.md +708 -0
- package/skills/advpl-code-generation/patterns-rest.md +974 -0
- package/skills/advpl-code-generation/patterns-soap.md +639 -0
- package/skills/advpl-code-generation/patterns-treport.md +481 -0
- package/skills/advpl-code-generation/patterns-workflow.md +779 -0
- package/skills/advpl-code-generation/templates-classes.md +1096 -0
- package/skills/advpl-code-review/SKILL.md +72 -0
- package/skills/advpl-code-review/rules-best-practices.md +444 -0
- package/skills/advpl-code-review/rules-modernization.md +290 -0
- package/skills/advpl-code-review/rules-performance.md +333 -0
- package/skills/advpl-code-review/rules-security.md +302 -0
- package/skills/advpl-debugging/SKILL.md +265 -0
- package/skills/advpl-debugging/common-errors.md +1124 -0
- package/skills/advpl-debugging/performance-tips.md +768 -0
- package/skills/advpl-refactoring/SKILL.md +139 -0
- package/skills/advpl-to-tlpp-migration/SKILL.md +293 -0
- package/skills/advpl-to-tlpp-migration/migration-checklist.md +122 -0
- package/skills/advpl-to-tlpp-migration/migration-rules.md +265 -0
- package/skills/changelog-patterns/SKILL.md +99 -0
- package/skills/code-explanation/SKILL.md +66 -0
- package/skills/documentation-patterns/SKILL.md +172 -0
- package/skills/embedded-sql/SKILL.md +379 -0
- package/skills/probat-testing/SKILL.md +226 -0
- package/skills/probat-testing/patterns-unit-tests.md +614 -0
- package/skills/protheus-business/SKILL.md +92 -0
- package/skills/protheus-business/modulo-compras.md +780 -0
- package/skills/protheus-business/modulo-contabilidade.md +874 -0
- package/skills/protheus-business/modulo-estoque.md +876 -0
- package/skills/protheus-business/modulo-faturamento.md +800 -0
- package/skills/protheus-business/modulo-financeiro.md +1015 -0
- package/skills/protheus-business/modulo-fiscal.md +749 -0
- package/skills/protheus-business/modulo-manutencao.md +848 -0
- package/skills/protheus-business/modulo-pcp.md +743 -0
- package/skills/protheus-reference/SKILL.md +119 -0
- package/skills/protheus-reference/native-functions.md +7029 -0
- package/skills/protheus-reference/rest-api-reference.md +1758 -0
- package/skills/protheus-reference/restricted-functions.md +265 -0
- package/skills/protheus-reference/sx-dictionary.md +854 -0
- package/skills/sx-configuration/SKILL.md +184 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { promises as fs } from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
// Estrutura: dist/index.js -> mcp-server/
|
|
11
|
+
const MCP_ROOT = path.resolve(__dirname, "..");
|
|
12
|
+
const server = new Server({
|
|
13
|
+
name: "advpl-sensei",
|
|
14
|
+
version: "1.1.0",
|
|
15
|
+
}, {
|
|
16
|
+
capabilities: {
|
|
17
|
+
resources: {},
|
|
18
|
+
tools: {},
|
|
19
|
+
prompts: {},
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Resources
|
|
24
|
+
*/
|
|
25
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
26
|
+
const skillsDir = path.join(MCP_ROOT, "skills");
|
|
27
|
+
const resources = [];
|
|
28
|
+
async function walk(dir) {
|
|
29
|
+
try {
|
|
30
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
31
|
+
for (const entry of entries) {
|
|
32
|
+
const fullPath = path.join(dir, entry.name);
|
|
33
|
+
if (entry.isDirectory()) {
|
|
34
|
+
await walk(fullPath);
|
|
35
|
+
}
|
|
36
|
+
else if (entry.name.endsWith(".md")) {
|
|
37
|
+
const relPath = path.relative(skillsDir, fullPath);
|
|
38
|
+
resources.push({
|
|
39
|
+
uri: `mcp://advpl/skills/${relPath}`,
|
|
40
|
+
name: relPath,
|
|
41
|
+
mimeType: "text/markdown",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (e) { }
|
|
47
|
+
}
|
|
48
|
+
await walk(skillsDir);
|
|
49
|
+
return { resources };
|
|
50
|
+
});
|
|
51
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
52
|
+
const uri = new URL(request.params.uri);
|
|
53
|
+
const relPath = uri.pathname.replace("/advpl/skills/", "");
|
|
54
|
+
const filePath = path.join(MCP_ROOT, "skills", relPath);
|
|
55
|
+
const text = await fs.readFile(filePath, "utf-8");
|
|
56
|
+
return {
|
|
57
|
+
contents: [{ uri: request.params.uri, mimeType: "text/markdown", text }],
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Tools
|
|
62
|
+
*/
|
|
63
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
64
|
+
const commandsDir = path.join(MCP_ROOT, "commands");
|
|
65
|
+
const tools = [];
|
|
66
|
+
try {
|
|
67
|
+
const files = await fs.readdir(commandsDir);
|
|
68
|
+
for (const file of files) {
|
|
69
|
+
if (file.endsWith(".md")) {
|
|
70
|
+
const name = file.replace(".md", "");
|
|
71
|
+
const content = await fs.readFile(path.join(commandsDir, file), "utf-8");
|
|
72
|
+
const descMatch = content.match(/description: (.*)/);
|
|
73
|
+
tools.push({
|
|
74
|
+
name: `advpl_${name}`,
|
|
75
|
+
description: descMatch ? descMatch[1] : `Command ${name}`,
|
|
76
|
+
inputSchema: {
|
|
77
|
+
type: "object",
|
|
78
|
+
properties: {
|
|
79
|
+
prompt: { type: "string" },
|
|
80
|
+
args: { type: "string" },
|
|
81
|
+
},
|
|
82
|
+
required: ["prompt"],
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (e) { }
|
|
89
|
+
return { tools };
|
|
90
|
+
});
|
|
91
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
92
|
+
const name = request.params.name.replace("advpl_", "");
|
|
93
|
+
const filePath = path.join(MCP_ROOT, "commands", `${name}.md`);
|
|
94
|
+
const instructions = await fs.readFile(filePath, "utf-8");
|
|
95
|
+
const { prompt, args } = request.params.arguments;
|
|
96
|
+
return {
|
|
97
|
+
content: [{
|
|
98
|
+
type: "text",
|
|
99
|
+
text: `Tool: ${name}\nContext: ${instructions}\nInput: ${prompt}\nArgs: ${args || ""}`,
|
|
100
|
+
}],
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
/**
|
|
104
|
+
* Prompts
|
|
105
|
+
*/
|
|
106
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
107
|
+
const agentsDir = path.join(MCP_ROOT, "agents");
|
|
108
|
+
const prompts = [];
|
|
109
|
+
try {
|
|
110
|
+
const files = await fs.readdir(agentsDir);
|
|
111
|
+
for (const file of files) {
|
|
112
|
+
if (file.endsWith(".md")) {
|
|
113
|
+
const name = file.replace(".md", "");
|
|
114
|
+
prompts.push({
|
|
115
|
+
name: `advpl_agent_${name}`,
|
|
116
|
+
description: `Agent ${name}`,
|
|
117
|
+
arguments: [{ name: "context", required: false }],
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (e) { }
|
|
123
|
+
return { prompts };
|
|
124
|
+
});
|
|
125
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
126
|
+
const name = request.params.name.replace("advpl_agent_", "");
|
|
127
|
+
const filePath = path.join(MCP_ROOT, "agents", `${name}.md`);
|
|
128
|
+
const text = await fs.readFile(filePath, "utf-8");
|
|
129
|
+
return {
|
|
130
|
+
messages: [{
|
|
131
|
+
role: "user",
|
|
132
|
+
content: {
|
|
133
|
+
type: "text",
|
|
134
|
+
text: `Role: ${name}\nRules: ${text}\nContext: ${request.params.arguments?.context || ""}`,
|
|
135
|
+
},
|
|
136
|
+
}],
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
async function main() {
|
|
140
|
+
const transport = new StdioServerTransport();
|
|
141
|
+
await server.connect(transport);
|
|
142
|
+
}
|
|
143
|
+
main().catch(() => { });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@netoalmanca/advpl-sensei",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "MCP Server for ADVPL/TLPP Protheus ecosystem",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"advpl-sensei": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"agents",
|
|
13
|
+
"commands",
|
|
14
|
+
"skills"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"dev": "ts-node src/index.ts"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.5.0",
|
|
23
|
+
"zod": "^3.24.2"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^22.13.9",
|
|
27
|
+
"ts-node": "^10.9.2",
|
|
28
|
+
"typescript": "^5.8.2"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: advpl-code-generation
|
|
3
|
+
description: Use when creating ADVPL/TLPP code - functions, classes, MVC structures, REST APIs, Web Services, or entry points for TOTVS Protheus
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ADVPL/TLPP Code Generation
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Patterns and templates for generating clean, standardized ADVPL and TLPP code for TOTVS Protheus. Covers User Functions, classes, MVC, REST APIs, Web Services, and entry points (pontos de entrada).
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- Creating new functions (User Function, Static Function)
|
|
15
|
+
- Creating TLPP classes with methods
|
|
16
|
+
- Building MVC structures (Model/View/Controller)
|
|
17
|
+
- Implementing REST API endpoints
|
|
18
|
+
- Writing entry points (pontos de entrada)
|
|
19
|
+
- Creating SOAP Web Services
|
|
20
|
+
- Any new .prw or .tlpp file creation
|
|
21
|
+
|
|
22
|
+
## Naming Conventions
|
|
23
|
+
|
|
24
|
+
| Element | Convention | Example |
|
|
25
|
+
|---------|-----------|---------|
|
|
26
|
+
| User Function | Module prefix + descriptive name | `FATA001` (Faturamento), `COMA100` (Compras) |
|
|
27
|
+
| Static Function | Descriptive, camelCase or PascalCase | `ValidaCampo`, `GravaRegistro` |
|
|
28
|
+
| Class (TLPP) | PascalCase, suffix with purpose | `PedidoService`, `ClienteController` |
|
|
29
|
+
| Method | camelCase | `getTotal`, `validarDados` |
|
|
30
|
+
| Variable Local | c/n/d/l/a/o prefix + PascalCase | `cNome`, `nTotal`, `dData`, `lOk`, `aItens`, `oObj` |
|
|
31
|
+
| Parameter | Same as variable | `cCodCli`, `nQuantidade` |
|
|
32
|
+
| Constant | UPPER_SNAKE_CASE | `MAX_RETRIES`, `DEFAULT_TIMEOUT` |
|
|
33
|
+
|
|
34
|
+
**Type prefixes (Hungarian notation):**
|
|
35
|
+
| Prefix | Type | Example |
|
|
36
|
+
|--------|------|---------|
|
|
37
|
+
| c | Character/String | `cNome`, `cEndereco` |
|
|
38
|
+
| n | Numeric | `nValor`, `nQuantidade` |
|
|
39
|
+
| d | Date | `dEmissao`, `dVencimento` |
|
|
40
|
+
| l | Logical/Boolean | `lOk`, `lContinua` |
|
|
41
|
+
| a | Array | `aItens`, `aCampos` |
|
|
42
|
+
| o | Object | `oModel`, `oView` |
|
|
43
|
+
| b | Code Block | `bBloco`, `bCondic` |
|
|
44
|
+
| x | Indefinido (any) | `xRetorno`, `xParam` |
|
|
45
|
+
|
|
46
|
+
**Module prefixes:**
|
|
47
|
+
| Prefix | Module |
|
|
48
|
+
|--------|--------|
|
|
49
|
+
| COM | Compras |
|
|
50
|
+
| EST | Estoque |
|
|
51
|
+
| FAT | Faturamento |
|
|
52
|
+
| FIN | Financeiro |
|
|
53
|
+
| CTB | Contabilidade |
|
|
54
|
+
| FIS | Fiscal |
|
|
55
|
+
| GFE | Gestao de Frete |
|
|
56
|
+
| HCM | Capital Humano |
|
|
57
|
+
| MNT | Manutencao de Ativos |
|
|
58
|
+
| PCP | Planejamento e Controle de Producao |
|
|
59
|
+
|
|
60
|
+
## Mandatory Structure - User Function
|
|
61
|
+
|
|
62
|
+
Every User Function MUST follow this pattern:
|
|
63
|
+
|
|
64
|
+
```advpl
|
|
65
|
+
#Include "TOTVS.CH"
|
|
66
|
+
#Include "TopConn.ch"
|
|
67
|
+
|
|
68
|
+
/*/{Protheus.doc} FATA001
|
|
69
|
+
Descricao breve da funcao
|
|
70
|
+
@type User Function
|
|
71
|
+
@author Nome do Autor
|
|
72
|
+
@since DD/MM/YYYY
|
|
73
|
+
@version 1.0
|
|
74
|
+
@param cParam1, Caractere, Descricao do parametro
|
|
75
|
+
@return lRet, Logico, Retorno da funcao
|
|
76
|
+
@example
|
|
77
|
+
u_FATA001("001")
|
|
78
|
+
/*/
|
|
79
|
+
User Function FATA001(cParam1)
|
|
80
|
+
Local lRet := .T.
|
|
81
|
+
Local cAlias := "SA1"
|
|
82
|
+
|
|
83
|
+
// Salva area de trabalho
|
|
84
|
+
Local aArea := GetArea()
|
|
85
|
+
|
|
86
|
+
Begin Sequence
|
|
87
|
+
|
|
88
|
+
// Logica principal aqui
|
|
89
|
+
DbSelectArea(cAlias)
|
|
90
|
+
DbSetOrder(1)
|
|
91
|
+
|
|
92
|
+
If DbSeek(xFilial(cAlias) + cParam1)
|
|
93
|
+
// Processamento
|
|
94
|
+
Else
|
|
95
|
+
lRet := .F.
|
|
96
|
+
MsgAlert("Registro nao encontrado")
|
|
97
|
+
EndIf
|
|
98
|
+
|
|
99
|
+
Recover Using oError
|
|
100
|
+
lRet := .F.
|
|
101
|
+
Conout("Erro em FATA001: " + oError:Description)
|
|
102
|
+
End Sequence
|
|
103
|
+
|
|
104
|
+
// Restaura area
|
|
105
|
+
RestArea(aArea)
|
|
106
|
+
|
|
107
|
+
Return lRet
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Variable Scope Rules
|
|
111
|
+
|
|
112
|
+
| Scope | Keyword | Visibility | Use Case |
|
|
113
|
+
|-------|---------|-----------|----------|
|
|
114
|
+
| Local | `Local` | Current function only | **Always prefer this** |
|
|
115
|
+
| Static | `Static` | Current PRW file | Shared state within file |
|
|
116
|
+
| Private | `Private` | Current function + called functions | **Avoid - use parameters** |
|
|
117
|
+
| Public | `Public` | Entire application | **Never use in new code** |
|
|
118
|
+
|
|
119
|
+
**Best practice:** Always use `Local`. Pass data via parameters, never via Private/Public.
|
|
120
|
+
|
|
121
|
+
## Error Handling Pattern
|
|
122
|
+
|
|
123
|
+
```advpl
|
|
124
|
+
Local oError
|
|
125
|
+
Local bErrorOld := ErrorBlock({|e| oError := e, Break(e)})
|
|
126
|
+
|
|
127
|
+
Begin Sequence
|
|
128
|
+
|
|
129
|
+
// Codigo que pode falhar
|
|
130
|
+
|
|
131
|
+
Recover Using oError
|
|
132
|
+
Conout("Erro: " + oError:Description)
|
|
133
|
+
Conout("Linha: " + cValToChar(oError:GenCode))
|
|
134
|
+
// Tratar erro ou re-raise
|
|
135
|
+
|
|
136
|
+
End Sequence
|
|
137
|
+
|
|
138
|
+
ErrorBlock(bErrorOld)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Quick Reference - Code Types
|
|
142
|
+
|
|
143
|
+
| Type | File Extension | Pattern File |
|
|
144
|
+
|------|---------------|-------------|
|
|
145
|
+
| User Function | .prw | Inline above |
|
|
146
|
+
| Static Function | .prw | Inline above (same file as User Function) |
|
|
147
|
+
| Class TLPP | .tlpp | templates-classes.md |
|
|
148
|
+
| MVC | .prw | patterns-mvc.md |
|
|
149
|
+
| REST API | .prw or .tlpp | patterns-rest.md |
|
|
150
|
+
| Ponto de Entrada | .prw | patterns-pontos-entrada.md |
|
|
151
|
+
| Web Service SOAP | .prw | patterns-soap.md |
|
|
152
|
+
|
|
153
|
+
## Common Mistakes
|
|
154
|
+
|
|
155
|
+
| Mistake | Fix |
|
|
156
|
+
|---------|-----|
|
|
157
|
+
| Using Private instead of Local | Always declare as Local, pass via parameters |
|
|
158
|
+
| Not saving/restoring area (GetArea/RestArea) | Always wrap DB operations with area save/restore |
|
|
159
|
+
| Missing error handling | Always use Begin Sequence / Recover / End Sequence |
|
|
160
|
+
| Not closing RecLock | Always use MsUnlock() after RecLock() |
|
|
161
|
+
| Hardcoded branch (filial) | Use xFilial(cAlias) for multi-branch compatibility |
|
|
162
|
+
| Missing TOTVS.CH include | Always include at minimum: #Include "TOTVS.CH" |
|
|
163
|
+
| Not validating function parameters | Check ValType() and empty values at function start |
|