@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.
Files changed (70) hide show
  1. package/agents/changelog-generator.md +63 -0
  2. package/agents/code-generator.md +215 -0
  3. package/agents/code-reviewer.md +145 -0
  4. package/agents/debugger.md +83 -0
  5. package/agents/doc-generator.md +67 -0
  6. package/agents/docs-reference.md +86 -0
  7. package/agents/migrator.md +84 -0
  8. package/agents/process-consultant.md +97 -0
  9. package/agents/refactorer.md +75 -0
  10. package/agents/sx-configurator.md +67 -0
  11. package/commands/changelog.md +66 -0
  12. package/commands/diagnose.md +67 -0
  13. package/commands/docs.md +81 -0
  14. package/commands/document.md +67 -0
  15. package/commands/explain.md +60 -0
  16. package/commands/generate.md +111 -0
  17. package/commands/migrate.md +81 -0
  18. package/commands/process.md +111 -0
  19. package/commands/refactor.md +65 -0
  20. package/commands/review.md +60 -0
  21. package/commands/sxgen.md +98 -0
  22. package/commands/test.md +103 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +143 -0
  26. package/dist/index.js.map +1 -0
  27. package/package.json +30 -0
  28. package/skills/advpl-code-generation/SKILL.md +163 -0
  29. package/skills/advpl-code-generation/patterns-fwformbrowse.md +485 -0
  30. package/skills/advpl-code-generation/patterns-jobs.md +519 -0
  31. package/skills/advpl-code-generation/patterns-mvc.md +765 -0
  32. package/skills/advpl-code-generation/patterns-pontos-entrada.md +708 -0
  33. package/skills/advpl-code-generation/patterns-rest.md +974 -0
  34. package/skills/advpl-code-generation/patterns-soap.md +639 -0
  35. package/skills/advpl-code-generation/patterns-treport.md +481 -0
  36. package/skills/advpl-code-generation/patterns-workflow.md +779 -0
  37. package/skills/advpl-code-generation/templates-classes.md +1096 -0
  38. package/skills/advpl-code-review/SKILL.md +72 -0
  39. package/skills/advpl-code-review/rules-best-practices.md +444 -0
  40. package/skills/advpl-code-review/rules-modernization.md +290 -0
  41. package/skills/advpl-code-review/rules-performance.md +333 -0
  42. package/skills/advpl-code-review/rules-security.md +302 -0
  43. package/skills/advpl-debugging/SKILL.md +265 -0
  44. package/skills/advpl-debugging/common-errors.md +1124 -0
  45. package/skills/advpl-debugging/performance-tips.md +768 -0
  46. package/skills/advpl-refactoring/SKILL.md +139 -0
  47. package/skills/advpl-to-tlpp-migration/SKILL.md +293 -0
  48. package/skills/advpl-to-tlpp-migration/migration-checklist.md +122 -0
  49. package/skills/advpl-to-tlpp-migration/migration-rules.md +265 -0
  50. package/skills/changelog-patterns/SKILL.md +99 -0
  51. package/skills/code-explanation/SKILL.md +66 -0
  52. package/skills/documentation-patterns/SKILL.md +172 -0
  53. package/skills/embedded-sql/SKILL.md +379 -0
  54. package/skills/probat-testing/SKILL.md +226 -0
  55. package/skills/probat-testing/patterns-unit-tests.md +614 -0
  56. package/skills/protheus-business/SKILL.md +92 -0
  57. package/skills/protheus-business/modulo-compras.md +780 -0
  58. package/skills/protheus-business/modulo-contabilidade.md +874 -0
  59. package/skills/protheus-business/modulo-estoque.md +876 -0
  60. package/skills/protheus-business/modulo-faturamento.md +800 -0
  61. package/skills/protheus-business/modulo-financeiro.md +1015 -0
  62. package/skills/protheus-business/modulo-fiscal.md +749 -0
  63. package/skills/protheus-business/modulo-manutencao.md +848 -0
  64. package/skills/protheus-business/modulo-pcp.md +743 -0
  65. package/skills/protheus-reference/SKILL.md +119 -0
  66. package/skills/protheus-reference/native-functions.md +7029 -0
  67. package/skills/protheus-reference/rest-api-reference.md +1758 -0
  68. package/skills/protheus-reference/restricted-functions.md +265 -0
  69. package/skills/protheus-reference/sx-dictionary.md +854 -0
  70. 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 |