@hagicode/hagitask 0.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/README.md +241 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +36 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/validate-command.d.ts +4 -0
- package/dist/commands/validate-command.js +14 -0
- package/dist/commands/validate-command.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/validation/diagnostics.d.ts +13 -0
- package/dist/validation/diagnostics.js +16 -0
- package/dist/validation/diagnostics.js.map +1 -0
- package/dist/validation/package-discovery.d.ts +10 -0
- package/dist/validation/package-discovery.js +45 -0
- package/dist/validation/package-discovery.js.map +1 -0
- package/dist/validation/package-validator.d.ts +4 -0
- package/dist/validation/package-validator.js +374 -0
- package/dist/validation/package-validator.js.map +1 -0
- package/dist/validation/schema-loader.d.ts +8 -0
- package/dist/validation/schema-loader.js +50 -0
- package/dist/validation/schema-loader.js.map +1 -0
- package/package.json +44 -0
- package/schemas/community-index-v1.schema.json +159 -0
- package/schemas/community-task-detail-v1.schema.json +182 -0
- package/schemas/task-preset-plugin/commands.schema.json +122 -0
- package/schemas/task-preset-plugin/locales.schema.json +24 -0
- package/schemas/task-preset-plugin/manifest.schema.json +225 -0
- package/schemas/task-preset-plugin/panel.schema.json +190 -0
- package/schemas/task-preset-plugin/prompt-package.schema.json +262 -0
- package/schemas/task-preset-plugin/store-page-frontmatter.schema.json +73 -0
- package/schemas/task-preset-plugin/task-preset.schema.json +153 -0
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync, } from 'node:fs';
|
|
2
|
+
import { dirname, relative, resolve, sep } from 'node:path';
|
|
3
|
+
import { schemaErrorLocation, createSchemaLoader, } from './schema-loader.js';
|
|
4
|
+
const TASK_ID = /^[a-z0-9][a-z0-9-]*$/;
|
|
5
|
+
const TARGET_SOURCES = new Set([
|
|
6
|
+
'owner-project-repositories',
|
|
7
|
+
'vault-registry',
|
|
8
|
+
'project-registry',
|
|
9
|
+
]);
|
|
10
|
+
function readJson(path) {
|
|
11
|
+
try {
|
|
12
|
+
return { value: JSON.parse(readFileSync(path, 'utf8')) };
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function walkJson(root, current = root, result = []) {
|
|
19
|
+
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
20
|
+
const path = resolve(current, entry.name);
|
|
21
|
+
if (entry.isDirectory())
|
|
22
|
+
walkJson(root, path, result);
|
|
23
|
+
else if (entry.isFile() && entry.name.endsWith('.json'))
|
|
24
|
+
result.push(relative(root, path));
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
function parseFrontmatter(content) {
|
|
29
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
|
|
30
|
+
if (!match)
|
|
31
|
+
return {};
|
|
32
|
+
const result = {};
|
|
33
|
+
let key;
|
|
34
|
+
let list;
|
|
35
|
+
const flush = () => {
|
|
36
|
+
if (key && list)
|
|
37
|
+
result[key] = list;
|
|
38
|
+
list = undefined;
|
|
39
|
+
};
|
|
40
|
+
for (const line of match[1].split(/\r?\n/)) {
|
|
41
|
+
const item = line.match(/^\s*-\s+(.+)$/);
|
|
42
|
+
if (item) {
|
|
43
|
+
list ??= [];
|
|
44
|
+
list.push(item[1].trim().replace(/^['"]|['"]$/g, ''));
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const scalar = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
|
|
48
|
+
if (!scalar)
|
|
49
|
+
continue;
|
|
50
|
+
flush();
|
|
51
|
+
key = scalar[1];
|
|
52
|
+
const value = scalar[2].trim().replace(/^['"]|['"]$/g, '');
|
|
53
|
+
if (value)
|
|
54
|
+
result[key] = value;
|
|
55
|
+
else
|
|
56
|
+
list = undefined;
|
|
57
|
+
}
|
|
58
|
+
flush();
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
function errorFor(pkg, file, field, message) {
|
|
62
|
+
return {
|
|
63
|
+
packageId: pkg.rel,
|
|
64
|
+
file: file ? `${pkg.rel}/${file}` : pkg.rel,
|
|
65
|
+
field,
|
|
66
|
+
message,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function schemaErrors(pkg, file, schema, loader, value) {
|
|
70
|
+
return loader.validate(schema, value).map((error) => {
|
|
71
|
+
const detail = error.params?.allowedValues
|
|
72
|
+
? ` (${error.params.allowedValues.join(', ')})`
|
|
73
|
+
: '';
|
|
74
|
+
return errorFor(pkg, file, `schema:${schema}${schemaErrorLocation(error)}`, `${error.message ?? 'schema validation failed'}${detail}`);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function validateJsonDocuments(pkg, loader) {
|
|
78
|
+
const errors = [];
|
|
79
|
+
let files = [];
|
|
80
|
+
try {
|
|
81
|
+
files = walkJson(pkg.dir);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
errors.push(errorFor(pkg, '', 'filesystem', `unable to read package: ${String(error)}`));
|
|
85
|
+
return errors;
|
|
86
|
+
}
|
|
87
|
+
for (const file of files) {
|
|
88
|
+
const parsed = readJson(resolve(pkg.dir, file));
|
|
89
|
+
if (parsed.error) {
|
|
90
|
+
errors.push(errorFor(pkg, file, 'parse', `invalid JSON: ${parsed.error}`));
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const document = parsed.value;
|
|
94
|
+
if (!document || typeof document !== 'object')
|
|
95
|
+
continue;
|
|
96
|
+
const schemaReference = typeof document.$schema === 'string' ? document.$schema : undefined;
|
|
97
|
+
const knownSchema = file === 'manifest.json'
|
|
98
|
+
? 'manifest.schema.json'
|
|
99
|
+
: file === 'frontend/panel.json'
|
|
100
|
+
? 'panel.schema.json'
|
|
101
|
+
: file === 'frontend/commands.json'
|
|
102
|
+
? 'commands.schema.json'
|
|
103
|
+
: file === 'backend/task-preset.json'
|
|
104
|
+
? 'task-preset.schema.json'
|
|
105
|
+
: file === 'backend/prompts.json'
|
|
106
|
+
? 'prompt-package.schema.json'
|
|
107
|
+
: file.startsWith('locales/') ? 'locales.schema.json' : undefined;
|
|
108
|
+
const schema = schemaReference ? loader.resolveReference(schemaReference) : knownSchema;
|
|
109
|
+
if (!schema) {
|
|
110
|
+
if (schemaReference) {
|
|
111
|
+
errors.push(errorFor(pkg, file, `$schema(${schemaReference})`, 'unresolved schema reference (only package schemas shipped with @hagicode/hagitask are available)'));
|
|
112
|
+
}
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (!loader.hasSchema(schema)) {
|
|
116
|
+
errors.push(errorFor(pkg, file, schemaReference ? `$schema(${schemaReference})` : '$schema', `schema '${schema}' is not available in the published schema set`));
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
errors.push(...schemaErrors(pkg, file, schema, loader, document));
|
|
120
|
+
}
|
|
121
|
+
return errors;
|
|
122
|
+
}
|
|
123
|
+
function validatePath(pkg, file, field, reference, directory = false) {
|
|
124
|
+
if (typeof reference !== 'string' || reference.length === 0)
|
|
125
|
+
return { errors: [] };
|
|
126
|
+
const path = resolve(pkg.dir, reference);
|
|
127
|
+
if (path !== pkg.dir && !path.startsWith(pkg.dir + sep)) {
|
|
128
|
+
return { errors: [errorFor(pkg, 'manifest.json', field, `path escapes package directory: ${reference}`)] };
|
|
129
|
+
}
|
|
130
|
+
if (!existsSync(path)) {
|
|
131
|
+
return { errors: [errorFor(pkg, 'manifest.json', field, `missing declared ${directory ? 'directory' : 'file'}: ${reference}`)] };
|
|
132
|
+
}
|
|
133
|
+
if (directory && !statSync(path).isDirectory()) {
|
|
134
|
+
return { errors: [errorFor(pkg, 'manifest.json', field, `must be a directory: ${reference}`)] };
|
|
135
|
+
}
|
|
136
|
+
if (!directory && !statSync(path).isFile()) {
|
|
137
|
+
return { errors: [errorFor(pkg, 'manifest.json', field, `must be a file: ${reference}`)] };
|
|
138
|
+
}
|
|
139
|
+
return { path, errors: [] };
|
|
140
|
+
}
|
|
141
|
+
function validateCrossFile(pkg, manifest, loader) {
|
|
142
|
+
const errors = [];
|
|
143
|
+
const add = (file, field, message) => errors.push(errorFor(pkg, file, field, message));
|
|
144
|
+
const localization = manifest.localization ?? {};
|
|
145
|
+
const supported = Array.isArray(localization.supportedLocales) ? localization.supportedLocales : [];
|
|
146
|
+
const bundles = localization.bundles ?? {};
|
|
147
|
+
const defaultLocale = localization.defaultLocale;
|
|
148
|
+
if (defaultLocale && !supported.includes(defaultLocale)) {
|
|
149
|
+
add('manifest.json', 'localization.defaultLocale', `default locale '${defaultLocale}' not in supportedLocales`);
|
|
150
|
+
}
|
|
151
|
+
for (const locale of supported) {
|
|
152
|
+
if (!(locale in bundles)) {
|
|
153
|
+
add('manifest.json', 'localization.bundles', `missing bundle for supported locale '${locale}'`);
|
|
154
|
+
}
|
|
155
|
+
const page = `store-page/index.${locale}.md`;
|
|
156
|
+
if (!existsSync(resolve(pkg.dir, page))) {
|
|
157
|
+
add(page, 'store-page', `missing store page for supported locale '${locale}'`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const storePageRef = manifest.site?.storePage;
|
|
161
|
+
const storePage = typeof storePageRef === 'string' ? resolve(pkg.dir, storePageRef) : resolve(pkg.dir, 'store-page');
|
|
162
|
+
if (existsSync(storePage) && statSync(storePage).isDirectory()) {
|
|
163
|
+
for (const file of readdirSync(storePage)) {
|
|
164
|
+
const match = file.match(/^index\.([A-Za-z-]+)\.md$/);
|
|
165
|
+
if (!match)
|
|
166
|
+
continue;
|
|
167
|
+
const locale = match[1];
|
|
168
|
+
const relativeFile = relative(pkg.dir, resolve(storePage, file)).replaceAll(sep, '/');
|
|
169
|
+
const frontmatter = parseFrontmatter(readFileSync(resolve(storePage, file), 'utf8'));
|
|
170
|
+
// Older shipped presets use Markdown without frontmatter. Keep those
|
|
171
|
+
// packages valid while validating frontmatter whenever it is authored.
|
|
172
|
+
const hasFrontmatter = /^---\r?\n/.test(readFileSync(resolve(storePage, file), 'utf8'));
|
|
173
|
+
if (hasFrontmatter && loader.hasSchema('store-page-frontmatter.schema.json')) {
|
|
174
|
+
errors.push(...schemaErrors(pkg, relativeFile, 'store-page-frontmatter.schema.json', loader, frontmatter));
|
|
175
|
+
}
|
|
176
|
+
if (frontmatter.slug !== undefined && frontmatter.slug !== pkg.dirName) {
|
|
177
|
+
add(relativeFile, 'slug', `must equal taskId '${pkg.dirName}' (got '${frontmatter.slug}')`);
|
|
178
|
+
}
|
|
179
|
+
if (frontmatter.locale !== undefined && frontmatter.locale !== locale) {
|
|
180
|
+
add(relativeFile, 'locale', `must equal file locale '${locale}' (got '${frontmatter.locale}')`);
|
|
181
|
+
}
|
|
182
|
+
if (!supported.includes(locale)) {
|
|
183
|
+
add(relativeFile, 'locale', `store page locale '${locale}' not in manifest supportedLocales`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const promptsRef = manifest.backend?.prompts;
|
|
188
|
+
if (typeof promptsRef !== 'string')
|
|
189
|
+
return errors;
|
|
190
|
+
const promptsPath = resolve(pkg.dir, promptsRef);
|
|
191
|
+
const prompts = readJson(promptsPath);
|
|
192
|
+
if (prompts.error || !prompts.value || typeof prompts.value !== 'object')
|
|
193
|
+
return errors;
|
|
194
|
+
const value = prompts.value;
|
|
195
|
+
const promptFile = relative(pkg.dir, promptsPath).replaceAll(sep, '/');
|
|
196
|
+
const references = new Set();
|
|
197
|
+
for (const reference of Object.values(value.partials ?? {})) {
|
|
198
|
+
if (typeof reference === 'string')
|
|
199
|
+
references.add(reference);
|
|
200
|
+
}
|
|
201
|
+
for (const prompt of Object.values(value.locales ?? {})) {
|
|
202
|
+
if (!prompt || typeof prompt !== 'object')
|
|
203
|
+
continue;
|
|
204
|
+
const localePrompt = prompt;
|
|
205
|
+
for (const field of ['systemTemplate', 'developerTemplate', 'userTemplate', 'outputSchema']) {
|
|
206
|
+
if (typeof localePrompt[field] === 'string')
|
|
207
|
+
references.add(localePrompt[field]);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
for (const entry of value.variants?.entries ?? []) {
|
|
211
|
+
for (const field of ['systemTemplate', 'userTemplate']) {
|
|
212
|
+
if (typeof entry?.[field] === 'string')
|
|
213
|
+
references.add(entry[field]);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
for (const field of ['systemTemplate', 'userTemplate']) {
|
|
217
|
+
if (typeof value.variants?.fallback?.[field] === 'string')
|
|
218
|
+
references.add(value.variants.fallback[field]);
|
|
219
|
+
}
|
|
220
|
+
for (const [command, locales] of Object.entries(value.commandSystemPrompts ?? {})) {
|
|
221
|
+
if (!command.trim() || !locales || typeof locales !== 'object' || Array.isArray(locales)) {
|
|
222
|
+
add(promptFile, `commandSystemPrompts.${command}`, 'command-specific prompt mapping must be a locale object');
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
for (const [locale, reference] of Object.entries(locales)) {
|
|
226
|
+
if (!locale.trim() || typeof reference !== 'string' || !reference.trim()) {
|
|
227
|
+
add(promptFile, `commandSystemPrompts.${command}.${locale}`, 'command-specific prompt template must be a non-empty path');
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
references.add(reference);
|
|
231
|
+
if (!supported.includes(locale)) {
|
|
232
|
+
add(promptFile, `commandSystemPrompts.${command}.${locale}`, `prompt locale '${locale}' not declared in manifest supportedLocales`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const promptDir = dirname(promptsPath);
|
|
238
|
+
for (const reference of references) {
|
|
239
|
+
const target = resolve(promptDir, reference);
|
|
240
|
+
if (target !== pkg.dir && !target.startsWith(pkg.dir + sep) || !existsSync(target)) {
|
|
241
|
+
add(promptFile, `template:${reference}`, 'prompt template file not found within package');
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
for (const locale of Array.isArray(value.supportedLocales) ? value.supportedLocales : []) {
|
|
245
|
+
if (!supported.includes(locale))
|
|
246
|
+
add(promptFile, 'supportedLocales', `prompt locale '${locale}' not declared in manifest.supportedLocales`);
|
|
247
|
+
}
|
|
248
|
+
for (const locale of Object.keys(value.locales ?? {})) {
|
|
249
|
+
if (!supported.includes(locale)) {
|
|
250
|
+
add(promptFile, `locales.${locale}`, `prompt locale '${locale}' not declared in manifest.supportedLocales`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return errors;
|
|
254
|
+
}
|
|
255
|
+
function validateContract(pkg, manifest, loader) {
|
|
256
|
+
const errors = [];
|
|
257
|
+
const add = (file, field, message) => errors.push(errorFor(pkg, file, field, message));
|
|
258
|
+
const declarations = [
|
|
259
|
+
['ui.panel', manifest.ui?.panel, false],
|
|
260
|
+
['ui.commands', manifest.ui?.commands, false],
|
|
261
|
+
['site.storePage', manifest.site?.storePage, true],
|
|
262
|
+
['backend.taskPreset', manifest.backend?.taskPreset, false],
|
|
263
|
+
['backend.prompts', manifest.backend?.prompts, false],
|
|
264
|
+
];
|
|
265
|
+
for (const [field, reference, directory] of declarations)
|
|
266
|
+
errors.push(...validatePath(pkg, 'manifest.json', field, reference, directory).errors);
|
|
267
|
+
for (const [locale, reference] of Object.entries(manifest.localization?.bundles ?? {})) {
|
|
268
|
+
errors.push(...validatePath(pkg, 'manifest.json', `localization.bundles.${locale}`, reference).errors);
|
|
269
|
+
}
|
|
270
|
+
const taskPresetRef = manifest.backend?.taskPreset;
|
|
271
|
+
if (typeof taskPresetRef !== 'string')
|
|
272
|
+
return errors;
|
|
273
|
+
const taskPresetPath = resolve(pkg.dir, taskPresetRef);
|
|
274
|
+
const parsed = readJson(taskPresetPath);
|
|
275
|
+
if (parsed.error || !parsed.value || typeof parsed.value !== 'object')
|
|
276
|
+
return errors;
|
|
277
|
+
const taskPreset = parsed.value;
|
|
278
|
+
for (const [kind, bucket] of Object.entries(taskPreset.targets ?? {})) {
|
|
279
|
+
const targetBucket = bucket;
|
|
280
|
+
if (!targetBucket || targetBucket.enabled !== true || !Array.isArray(targetBucket.selections))
|
|
281
|
+
continue;
|
|
282
|
+
for (const selection of targetBucket.selections) {
|
|
283
|
+
const source = selection?.scope?.source;
|
|
284
|
+
if (source !== undefined && !TARGET_SOURCES.has(source)) {
|
|
285
|
+
add(taskPresetRef, `targets.${kind}.selections[${selection?.id ?? '<unknown>'}].scope.source`, `selection '${selection?.id ?? '<unknown>'}' uses unsupported scope source ${JSON.stringify(source)}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
const execution = taskPreset.execution;
|
|
290
|
+
if (execution !== undefined) {
|
|
291
|
+
if (!execution || typeof execution !== 'object' || !/^1\./.test(execution.schemaVersion ?? '') || !['declarative', 'extension'].includes(execution.strategy)) {
|
|
292
|
+
add(taskPresetRef, 'execution', 'must declare schemaVersion 1.x and strategy declarative or extension');
|
|
293
|
+
}
|
|
294
|
+
else if (execution.strategy === 'extension' && typeof execution.extensionPoint !== 'string') {
|
|
295
|
+
add(taskPresetRef, 'execution.extensionPoint', 'is required for extension strategy');
|
|
296
|
+
}
|
|
297
|
+
else if (execution.strategy === 'declarative' && execution.extensionPoint !== undefined) {
|
|
298
|
+
add(taskPresetRef, 'execution.extensionPoint', 'must be omitted for declarative strategy');
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const inputs = Array.isArray(taskPreset.inputBindings) ? taskPreset.inputBindings : [];
|
|
302
|
+
const seenAliases = new Set();
|
|
303
|
+
for (const binding of inputs) {
|
|
304
|
+
const aliases = Array.isArray(binding?.aliases) ? binding.aliases : [];
|
|
305
|
+
if (aliases.includes(binding?.input))
|
|
306
|
+
add(taskPresetRef, `inputBindings.${binding?.input}.aliases`, 'must not contain its canonical input name');
|
|
307
|
+
for (const alias of aliases) {
|
|
308
|
+
if (seenAliases.has(alias))
|
|
309
|
+
add(taskPresetRef, `inputBindings.${binding?.input}.aliases`, `alias '${alias}' is declared more than once`);
|
|
310
|
+
seenAliases.add(alias);
|
|
311
|
+
}
|
|
312
|
+
if (binding?.transform === 'url-list' && !['url-list', 'multiple'].includes(binding?.valueType)) {
|
|
313
|
+
add(taskPresetRef, `inputBindings.${binding?.input}.valueType`, 'url-list transform requires url-list valueType');
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return errors;
|
|
317
|
+
}
|
|
318
|
+
export function validatePackage(pkg, targetRoot, packageRoot) {
|
|
319
|
+
const loader = createSchemaLoader(targetRoot, packageRoot);
|
|
320
|
+
const errors = [];
|
|
321
|
+
const manifestFile = resolve(pkg.dir, 'manifest.json');
|
|
322
|
+
const manifestResult = readJson(manifestFile);
|
|
323
|
+
if (manifestResult.error) {
|
|
324
|
+
errors.push(errorFor(pkg, 'manifest.json', 'parse', `invalid JSON: ${manifestResult.error}`));
|
|
325
|
+
return errors;
|
|
326
|
+
}
|
|
327
|
+
const manifest = manifestResult.value;
|
|
328
|
+
if (!manifest || typeof manifest !== 'object' || Array.isArray(manifest)) {
|
|
329
|
+
errors.push(errorFor(pkg, 'manifest.json', 'root', 'expected a JSON object'));
|
|
330
|
+
return errors;
|
|
331
|
+
}
|
|
332
|
+
if (typeof manifest.taskPresetId !== 'string' || !TASK_ID.test(manifest.taskPresetId)) {
|
|
333
|
+
errors.push(errorFor(pkg, 'manifest.json', 'taskPresetId', `must match ^[a-z0-9][a-z0-9-]*$ (got ${JSON.stringify(manifest.taskPresetId)})`));
|
|
334
|
+
}
|
|
335
|
+
else if (manifest.taskPresetId !== pkg.dirName) {
|
|
336
|
+
errors.push(errorFor(pkg, 'manifest.json', 'taskPresetId', `must equal directory name '${pkg.dirName}' (got '${manifest.taskPresetId}')`));
|
|
337
|
+
}
|
|
338
|
+
errors.push(...validateJsonDocuments(pkg, loader));
|
|
339
|
+
errors.push(...validateContract(pkg, manifest, loader));
|
|
340
|
+
errors.push(...validateCrossFile(pkg, manifest, loader));
|
|
341
|
+
return errors;
|
|
342
|
+
}
|
|
343
|
+
export function validateDiscoveredPackages(packages, targetRoot, packageRoot) {
|
|
344
|
+
const errors = [];
|
|
345
|
+
const ids = new Map();
|
|
346
|
+
for (const pkg of packages) {
|
|
347
|
+
const result = readJson(resolve(pkg.dir, 'manifest.json'));
|
|
348
|
+
if (!result.error && typeof result.value?.taskPresetId === 'string') {
|
|
349
|
+
const list = ids.get(result.value.taskPresetId) ?? [];
|
|
350
|
+
list.push(pkg.rel);
|
|
351
|
+
ids.set(result.value.taskPresetId, list);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
for (const pkg of packages)
|
|
355
|
+
errors.push(...validatePackage(pkg, targetRoot, packageRoot));
|
|
356
|
+
for (const [id, dirs] of ids) {
|
|
357
|
+
if (dirs.length < 2)
|
|
358
|
+
continue;
|
|
359
|
+
for (const dir of dirs) {
|
|
360
|
+
errors.push({
|
|
361
|
+
packageId: dir,
|
|
362
|
+
file: `${dir}/manifest.json`,
|
|
363
|
+
field: 'taskPresetId',
|
|
364
|
+
message: `duplicate canonical id '${id}' also used by ${dirs.filter((other) => other !== dir).join(', ')}`,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
packages: packages.map((pkg) => pkg.rel).sort(),
|
|
370
|
+
errors,
|
|
371
|
+
valid: errors.length === 0,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=package-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-validator.js","sourceRoot":"","sources":["../../src/validation/package-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ErrorObject } from 'ajv/dist/2020.js';
|
|
2
|
+
export interface SchemaLoader {
|
|
3
|
+
hasSchema(name: string): boolean;
|
|
4
|
+
validate(name: string, value: unknown): ErrorObject[];
|
|
5
|
+
resolveReference(reference: string): string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare function createSchemaLoader(targetRoot: string, packageRoot: string): SchemaLoader;
|
|
8
|
+
export declare function schemaErrorLocation(error: ErrorObject): string;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { basename, join, resolve } from 'node:path';
|
|
3
|
+
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
4
|
+
function schemaFileName(reference) {
|
|
5
|
+
const normalized = reference.replaceAll('\\', '/');
|
|
6
|
+
const marker = 'schemas/task-preset-plugin/';
|
|
7
|
+
const index = normalized.indexOf(marker);
|
|
8
|
+
return index >= 0 ? normalized.slice(index + marker.length) : basename(normalized);
|
|
9
|
+
}
|
|
10
|
+
export function createSchemaLoader(targetRoot, packageRoot) {
|
|
11
|
+
const roots = [
|
|
12
|
+
join(resolve(targetRoot), 'schemas', 'task-preset-plugin'),
|
|
13
|
+
join(resolve(packageRoot), 'schemas', 'task-preset-plugin'),
|
|
14
|
+
];
|
|
15
|
+
const schemaRoot = roots.find((root) => existsSync(root));
|
|
16
|
+
const validators = new Map();
|
|
17
|
+
const ajv = new Ajv2020({ strict: false, allErrors: true });
|
|
18
|
+
if (schemaRoot) {
|
|
19
|
+
for (const file of readdirSync(schemaRoot)) {
|
|
20
|
+
if (!file.endsWith('.json'))
|
|
21
|
+
continue;
|
|
22
|
+
try {
|
|
23
|
+
const schema = JSON.parse(readFileSync(join(schemaRoot, file), 'utf8'));
|
|
24
|
+
validators.set(file, ajv.compile(schema));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Broken schemas are reported as unavailable rather than crashing validation.
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
hasSchema(name) {
|
|
33
|
+
return validators.has(name);
|
|
34
|
+
},
|
|
35
|
+
resolveReference(reference) {
|
|
36
|
+
const name = schemaFileName(reference);
|
|
37
|
+
return validators.has(name) ? name : undefined;
|
|
38
|
+
},
|
|
39
|
+
validate(name, value) {
|
|
40
|
+
const validator = validators.get(name);
|
|
41
|
+
if (!validator)
|
|
42
|
+
return [];
|
|
43
|
+
return validator(value) ? [] : (validator.errors ?? []);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function schemaErrorLocation(error) {
|
|
48
|
+
return error.instancePath || '<root>';
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=schema-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-loader.js","sourceRoot":"","sources":["../../src/validation/schema-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAW,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,OAAO,EAA2C,MAAM,kBAAkB,CAAC;AAQpF,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,6BAA6B,CAAC;IAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,WAAmB;IACxE,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC;KAC5D,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBACxE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,8EAA8E;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,CAAC,IAAI;YACZ,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QACD,gBAAgB,CAAC,SAAS;YACxB,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;YACvC,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACjD,CAAC;QACD,QAAQ,CAAC,IAAI,EAAE,KAAK;YAClB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,OAAO,KAAK,CAAC,YAAY,IAAI,QAAQ,CAAC;AACxC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hagicode/hagitask",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Offline HagiTask package schemas, validation API, and CLI.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
15
|
+
},
|
|
16
|
+
"bin": {
|
|
17
|
+
"hagitask": "dist/cli.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"schemas",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=20"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -p tsconfig.json",
|
|
32
|
+
"test": "npm run build && node --test test/*.test.mjs",
|
|
33
|
+
"validate": "npm run build && node dist/cli.js validate .",
|
|
34
|
+
"clean": "rm -rf dist"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"ajv": "^8.17.1",
|
|
38
|
+
"commander": "^14.0.1"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^24.5.2",
|
|
42
|
+
"typescript": "^5.9.3"
|
|
43
|
+
}
|
|
44
|
+
}
|