@maxisoft/instantcms-mcp 1.2.3
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/LICENSE +21 -0
- package/README.md +308 -0
- package/dist/__tests__/artifact-tool.test.js +196 -0
- package/dist/__tests__/db-tool.test.js +152 -0
- package/dist/__tests__/define-tool.test.js +106 -0
- package/dist/__tests__/find-tool.test.js +185 -0
- package/dist/__tests__/get-component-api.test.js +144 -0
- package/dist/__tests__/hardening.test.js +73 -0
- package/dist/__tests__/hooks-tool.test.js +173 -0
- package/dist/__tests__/mcp-integration-extra.test.js +166 -0
- package/dist/__tests__/mcp-integration.test.js +53 -0
- package/dist/__tests__/pagination.test.js +114 -0
- package/dist/__tests__/performance-baseline.test.js +56 -0
- package/dist/__tests__/project-patch.test.js +144 -0
- package/dist/__tests__/project-source.test.js +44 -0
- package/dist/__tests__/project-workflows-extra.test.js +165 -0
- package/dist/__tests__/project-workflows.test.js +51 -0
- package/dist/__tests__/scaffold-addon-roundtrip.test.js +287 -0
- package/dist/__tests__/serialization.test.js +170 -0
- package/dist/__tests__/source-knowledge-parsers.test.js +42 -0
- package/dist/__tests__/template-development.test.js +78 -0
- package/dist/__tests__/template-productivity.test.js +87 -0
- package/dist/__tests__/tools.test.js +2143 -0
- package/dist/data/components.js +2818 -0
- package/dist/data/controllers-map.js +7571 -0
- package/dist/data/core-api.js +9356 -0
- package/dist/data/database-schema.js +4555 -0
- package/dist/data/events-map.js +1339 -0
- package/dist/data/fields-map.js +3692 -0
- package/dist/data/hooks.js +2257 -0
- package/dist/data/js-api.js +123 -0
- package/dist/data/libs-api.js +264 -0
- package/dist/data/routes-map.js +203 -0
- package/dist/data/schemas-validation.js +255 -0
- package/dist/data/schemas.js +1404 -0
- package/dist/data/traits-map.js +1004 -0
- package/dist/data/version-profiles.js +41 -0
- package/dist/data/widgets-map.js +131 -0
- package/dist/data/wysiwyg-map.js +486 -0
- package/dist/generated/components-source.js +14748 -0
- package/dist/generated/hooks-source.js +3399 -0
- package/dist/generated/knowledge-meta.js +101 -0
- package/dist/index.js +13 -0
- package/dist/registry/database-tools.js +112 -0
- package/dist/registry/extension-tools.js +473 -0
- package/dist/registry/generator-tools.js +506 -0
- package/dist/registry/knowledge-tools.js +441 -0
- package/dist/registry/language-tools.js +99 -0
- package/dist/registry/meta-tools.js +152 -0
- package/dist/registry/project-tools.js +48 -0
- package/dist/registry/resources.js +98 -0
- package/dist/registry/source-tools.js +211 -0
- package/dist/registry/template-development-tools.js +79 -0
- package/dist/server.js +32 -0
- package/dist/tools/addon-tool.js +1437 -0
- package/dist/tools/admin-partial-tool.js +498 -0
- package/dist/tools/api-tool.js +294 -0
- package/dist/tools/artifact-tool.js +95 -0
- package/dist/tools/cache-tool.js +360 -0
- package/dist/tools/component-tool.js +415 -0
- package/dist/tools/controllers-tool.js +125 -0
- package/dist/tools/cron-tool.js +197 -0
- package/dist/tools/crud-tool.js +659 -0
- package/dist/tools/db-tool.js +198 -0
- package/dist/tools/email-tool.js +222 -0
- package/dist/tools/external-api-tool.js +596 -0
- package/dist/tools/filter-tool.js +341 -0
- package/dist/tools/form-tool.js +275 -0
- package/dist/tools/grid-tool.js +189 -0
- package/dist/tools/hooks-tool.js +104 -0
- package/dist/tools/import-export-tool.js +548 -0
- package/dist/tools/lang-tool.js +251 -0
- package/dist/tools/layout-override-tool.js +125 -0
- package/dist/tools/layout-tool.js +548 -0
- package/dist/tools/maria-tool.js +127 -0
- package/dist/tools/mariadb.js +201 -0
- package/dist/tools/migration-tool.js +329 -0
- package/dist/tools/oauth-tool.js +520 -0
- package/dist/tools/parser/components-parser.js +76 -0
- package/dist/tools/parser/controllers-parser.js +313 -0
- package/dist/tools/parser/core-parser.js +294 -0
- package/dist/tools/parser/coverage-generator.js +424 -0
- package/dist/tools/parser/events-parser.js +127 -0
- package/dist/tools/parser/fields-parser.js +382 -0
- package/dist/tools/parser/hooks-parser.js +106 -0
- package/dist/tools/parser/sql-parser.js +197 -0
- package/dist/tools/parser/traits-parser.js +161 -0
- package/dist/tools/parser/widgets-parser.js +150 -0
- package/dist/tools/permission-tool.js +348 -0
- package/dist/tools/project-patch-tool.js +73 -0
- package/dist/tools/project-source-tool.js +188 -0
- package/dist/tools/project-workflow-tool.js +186 -0
- package/dist/tools/requirement-tool.js +212 -0
- package/dist/tools/scaffold-tool.js +815 -0
- package/dist/tools/seo-tool.js +412 -0
- package/dist/tools/source-tool.js +155 -0
- package/dist/tools/template-development-tool.js +271 -0
- package/dist/tools/template-overrides-tool.js +294 -0
- package/dist/tools/template-productivity-tool.js +319 -0
- package/dist/tools/template-tool.js +665 -0
- package/dist/tools/test-tool.js +183 -0
- package/dist/tools/webhook-tool.js +427 -0
- package/dist/tools/widget-tool.js +331 -0
- package/dist/tools/wysiwyg-tool.js +137 -0
- package/dist/types/scaffold.js +68 -0
- package/dist/utils/define-tool.js +37 -0
- package/dist/utils/find-tool.js +97 -0
- package/dist/utils/mcp-result.js +18 -0
- package/dist/utils/pagination.js +27 -0
- package/dist/utils/serialization.js +27 -0
- package/package.json +94 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Cron job scaffolding tool for InstantCMS
|
|
4
|
+
* Generates cron controller, manifest, and language files
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.scaffoldCron = scaffoldCron;
|
|
8
|
+
const scaffold_1 = require("../types/scaffold");
|
|
9
|
+
/**
|
|
10
|
+
* Formats a CronSchedule object into a crontab string
|
|
11
|
+
*/
|
|
12
|
+
function formatSchedule(schedule) {
|
|
13
|
+
const parts = [
|
|
14
|
+
schedule.minute ?? '*',
|
|
15
|
+
schedule.hour ?? '*',
|
|
16
|
+
schedule.day ?? '*',
|
|
17
|
+
schedule.month ?? '*',
|
|
18
|
+
schedule.day_of_week ?? '*',
|
|
19
|
+
];
|
|
20
|
+
return parts.join(' ');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generates the main cron controller file
|
|
24
|
+
*/
|
|
25
|
+
function generateCronMain(name, Name, tasks, options) {
|
|
26
|
+
const useLock = options?.use_lock_file ?? true;
|
|
27
|
+
const logExecution = options?.log_execution ?? true;
|
|
28
|
+
const taskCases = tasks
|
|
29
|
+
.map(t => {
|
|
30
|
+
return ` case '${t.name}':
|
|
31
|
+
${t.action}();
|
|
32
|
+
break;`;
|
|
33
|
+
})
|
|
34
|
+
.join('\n');
|
|
35
|
+
return `<?php
|
|
36
|
+
// InstantCMS 2. ${name}/cron.php
|
|
37
|
+
// Generated by InstantCMS MCP Server
|
|
38
|
+
|
|
39
|
+
define('PATH', dirname(__DIR__));
|
|
40
|
+
define('DS', DIRECTORY_SEPARATOR);
|
|
41
|
+
|
|
42
|
+
// Загрузка ядра
|
|
43
|
+
require_once PATH . '/core/bootstrap.php';
|
|
44
|
+
|
|
45
|
+
${useLock
|
|
46
|
+
? `
|
|
47
|
+
// Блокировка от повторного запуска
|
|
48
|
+
\\$${name}_lock_file = cmsConfig::get('cache_path') . '/${name}_cron.lock';
|
|
49
|
+
|
|
50
|
+
function ${name}_is_locked() {
|
|
51
|
+
global \\$${name}_lock_file;
|
|
52
|
+
if (!file_exists(\\$${name}_lock_file)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
$stat = stat(\\$${name}_lock_file);
|
|
56
|
+
if (time() - $stat['mtime'] > 3600) {
|
|
57
|
+
unlink(\\$${name}_lock_file);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function ${name}_lock() {
|
|
64
|
+
global \\$${name}_lock_file;
|
|
65
|
+
touch(\\$${name}_lock_file);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function ${name}_unlock() {
|
|
69
|
+
global \\$${name}_lock_file;
|
|
70
|
+
if (file_exists(\\$${name}_lock_file)) {
|
|
71
|
+
unlink(\\$${name}_lock_file);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (${name}_is_locked()) {
|
|
76
|
+
die('Cron already running or locked');
|
|
77
|
+
}
|
|
78
|
+
${name}_lock();
|
|
79
|
+
`
|
|
80
|
+
: ''}
|
|
81
|
+
|
|
82
|
+
${logExecution
|
|
83
|
+
? `
|
|
84
|
+
// Логирование
|
|
85
|
+
\\$${name}_log_file = cmsConfig::get('root_path') . '/cache/logs/${name}.log';
|
|
86
|
+
function ${name}_log($message) {
|
|
87
|
+
global \\$${name}_log_file;
|
|
88
|
+
$dir = dirname(\\$${name}_log_file);
|
|
89
|
+
if (!is_dir($dir)) {
|
|
90
|
+
mkdir($dir, 0755, true);
|
|
91
|
+
}
|
|
92
|
+
file_put_contents(\\$${name}_log_file, date('Y-m-d H:i:s') . ' - ' . $message . PHP_EOL, FILE_APPEND);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
${name}_log('Cron started');
|
|
96
|
+
`
|
|
97
|
+
: ''}
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
$task = $_SERVER['argv'][1] ?? 'all';
|
|
101
|
+
|
|
102
|
+
switch ($task) {
|
|
103
|
+
${taskCases}
|
|
104
|
+
default:
|
|
105
|
+
// Выполняем все задачи
|
|
106
|
+
${tasks.map(t => `${t.action}();`).join('\n ')}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
${logExecution ? `${name}_log('Cron completed successfully');` : ''}
|
|
111
|
+
} catch (Exception $e) {
|
|
112
|
+
${logExecution ? `${name}_log('Error: ' . $e->getMessage());` : ''}
|
|
113
|
+
echo 'Error: ' . $e->getMessage() . PHP_EOL;
|
|
114
|
+
exit(1);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
${useLock
|
|
118
|
+
? `
|
|
119
|
+
${name}_unlock();
|
|
120
|
+
`
|
|
121
|
+
: ''}
|
|
122
|
+
`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Generates the manifest.xml with task definitions
|
|
126
|
+
*/
|
|
127
|
+
function generateManifest(name, Name, tasks) {
|
|
128
|
+
const taskElements = tasks
|
|
129
|
+
.map(t => {
|
|
130
|
+
return ` <task name="${t.name}" schedule="${formatSchedule(t.schedule)}" action="${t.action}" ${t.description ? `description="${t.description}"` : ''} />`;
|
|
131
|
+
})
|
|
132
|
+
.join('\n');
|
|
133
|
+
return `<?xml version="1.0"?>
|
|
134
|
+
<manifest>
|
|
135
|
+
<name>${Name}</name>
|
|
136
|
+
<description>${Name} component cron jobs</description>
|
|
137
|
+
<version>1.0.0</version>
|
|
138
|
+
<tasks>
|
|
139
|
+
${taskElements}
|
|
140
|
+
</tasks>
|
|
141
|
+
</manifest>
|
|
142
|
+
`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Generates language file with task titles
|
|
146
|
+
*/
|
|
147
|
+
function generateLang(name, NAME, tasks) {
|
|
148
|
+
const langEntries = tasks
|
|
149
|
+
.map(t => {
|
|
150
|
+
return ` 'LANG_${NAME}_TASK_${t.name.toUpperCase()}' => '${t.description ?? t.name}',`;
|
|
151
|
+
})
|
|
152
|
+
.join('\n');
|
|
153
|
+
return `<?php
|
|
154
|
+
// InstantCMS 2. ${name} language file
|
|
155
|
+
|
|
156
|
+
return [
|
|
157
|
+
${langEntries}
|
|
158
|
+
];
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Generates cron job files for an InstantCMS addon
|
|
163
|
+
*
|
|
164
|
+
* @param opts - Configuration options for the cron job
|
|
165
|
+
* @returns Object containing generated files and metadata
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```typescript
|
|
169
|
+
* const result = scaffoldCron({
|
|
170
|
+
* addon_name: 'my_component',
|
|
171
|
+
* tasks: [
|
|
172
|
+
* { name: 'cleanup', schedule: { minute: '0', hour: '*' }, action: 'taskCleanup' }
|
|
173
|
+
* ]
|
|
174
|
+
* });
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
function scaffoldCron(opts) {
|
|
178
|
+
const { lowercase } = (0, scaffold_1.normalizeAddonName)(opts.addon_name);
|
|
179
|
+
const { UpperCamelCase } = (0, scaffold_1.normalizeAddonName)(opts.addon_name);
|
|
180
|
+
const uppercase = lowercase.toUpperCase();
|
|
181
|
+
const files = {};
|
|
182
|
+
const ctrl = `package/system/controllers/${lowercase}`;
|
|
183
|
+
files[`${ctrl}/cron.php`] = generateCronMain(lowercase, UpperCamelCase, opts.tasks, opts.options);
|
|
184
|
+
files[`${ctrl}/manifest.xml`] = generateManifest(lowercase, UpperCamelCase, opts.tasks);
|
|
185
|
+
files[`package/system/languages/ru/controllers/${lowercase}/${lowercase}.php`] = generateLang(lowercase, uppercase, opts.tasks);
|
|
186
|
+
return {
|
|
187
|
+
addon_name: lowercase,
|
|
188
|
+
tasks_count: opts.tasks.length,
|
|
189
|
+
files,
|
|
190
|
+
tasks: opts.tasks.map(t => ({
|
|
191
|
+
name: t.name,
|
|
192
|
+
schedule: formatSchedule(t.schedule),
|
|
193
|
+
action: t.action,
|
|
194
|
+
description: t.description,
|
|
195
|
+
})),
|
|
196
|
+
};
|
|
197
|
+
}
|