@hagicode/hagitask 0.1.0-dev.10

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 (38) hide show
  1. package/README.md +260 -0
  2. package/dist/cli.d.ts +4 -0
  3. package/dist/cli.js +50 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/new-command.d.ts +14 -0
  6. package/dist/commands/new-command.js +78 -0
  7. package/dist/commands/new-command.js.map +1 -0
  8. package/dist/commands/validate-command.d.ts +4 -0
  9. package/dist/commands/validate-command.js +14 -0
  10. package/dist/commands/validate-command.js.map +1 -0
  11. package/dist/index.d.ts +15 -0
  12. package/dist/index.js +42 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/templates/new-package.d.ts +9 -0
  15. package/dist/templates/new-package.js +281 -0
  16. package/dist/templates/new-package.js.map +1 -0
  17. package/dist/validation/diagnostics.d.ts +13 -0
  18. package/dist/validation/diagnostics.js +16 -0
  19. package/dist/validation/diagnostics.js.map +1 -0
  20. package/dist/validation/package-discovery.d.ts +10 -0
  21. package/dist/validation/package-discovery.js +45 -0
  22. package/dist/validation/package-discovery.js.map +1 -0
  23. package/dist/validation/package-validator.d.ts +4 -0
  24. package/dist/validation/package-validator.js +374 -0
  25. package/dist/validation/package-validator.js.map +1 -0
  26. package/dist/validation/schema-loader.d.ts +8 -0
  27. package/dist/validation/schema-loader.js +50 -0
  28. package/dist/validation/schema-loader.js.map +1 -0
  29. package/package.json +52 -0
  30. package/schemas/community-index-v1.schema.json +159 -0
  31. package/schemas/community-task-detail-v1.schema.json +182 -0
  32. package/schemas/task-preset-plugin/commands.schema.json +122 -0
  33. package/schemas/task-preset-plugin/locales.schema.json +24 -0
  34. package/schemas/task-preset-plugin/manifest.schema.json +225 -0
  35. package/schemas/task-preset-plugin/panel.schema.json +190 -0
  36. package/schemas/task-preset-plugin/prompt-package.schema.json +262 -0
  37. package/schemas/task-preset-plugin/store-page-frontmatter.schema.json +73 -0
  38. package/schemas/task-preset-plugin/task-preset.schema.json +153 -0
@@ -0,0 +1,281 @@
1
+ function json(value) {
2
+ return `${JSON.stringify(value, null, 2)}\n`;
3
+ }
4
+ export function createNewPackageFiles(context) {
5
+ const { packageName, repositories } = context;
6
+ const localized = (key) => ({ key });
7
+ const repositoryOptions = repositories.map((value) => ({
8
+ value,
9
+ label: localized(`repositories.${value}`),
10
+ }));
11
+ return [
12
+ {
13
+ path: 'manifest.json',
14
+ contents: json({
15
+ $schema: '../../schemas/task-preset-plugin/manifest.schema.json',
16
+ schemaVersion: '1.0',
17
+ taskPresetId: packageName,
18
+ version: '1.0.0',
19
+ icon: 'sparkles',
20
+ displayName: localized('taskPreset.displayName'),
21
+ description: localized('taskPreset.description'),
22
+ kind: 'custom-executor',
23
+ status: 'experimental',
24
+ owner: 'HagiTask',
25
+ activation: { defaultState: 'passive' },
26
+ localization: {
27
+ strategy: 'plugin-bundles',
28
+ namespace: packageName,
29
+ defaultLocale: 'en-US',
30
+ supportedLocales: ['en-US', 'zh-CN'],
31
+ bundles: {
32
+ 'en-US': './locales/en-US.json',
33
+ 'zh-CN': './locales/zh-CN.json',
34
+ },
35
+ },
36
+ capabilities: { supportsCommandCatalog: true },
37
+ ui: {
38
+ panel: './frontend/panel.json',
39
+ commands: './frontend/commands.json',
40
+ },
41
+ site: { storePage: './store-page/' },
42
+ backend: {
43
+ taskPreset: './backend/task-preset.json',
44
+ prompts: './backend/prompts.json',
45
+ },
46
+ }),
47
+ },
48
+ {
49
+ path: 'frontend/panel.json',
50
+ contents: json({
51
+ $schema: '../../../schemas/task-preset-plugin/panel.schema.json',
52
+ surface: 'drawer',
53
+ title: localized('taskPreset.title'),
54
+ description: localized('taskPreset.description'),
55
+ defaultTitle: localized('taskPreset.defaultTitle'),
56
+ submitLabel: localized('taskPreset.submit'),
57
+ submittingLabel: localized('taskPreset.submitting'),
58
+ sections: [{
59
+ id: 'context',
60
+ layout: 'stack',
61
+ fields: [{
62
+ id: 'targetRepositories',
63
+ renderer: 'repository-access-selector',
64
+ label: localized('panel.repositoryLabel'),
65
+ hint: localized('panel.repositoryHint'),
66
+ required: true,
67
+ output: 'targetRepositories',
68
+ selectionMode: 'multiple',
69
+ componentProps: {
70
+ targetSelectionId: 'targetRepositories',
71
+ emptyTextKey: 'panel.repositoryEmpty',
72
+ options: repositoryOptions,
73
+ },
74
+ }],
75
+ }],
76
+ }),
77
+ },
78
+ {
79
+ path: 'frontend/commands.json',
80
+ contents: json({
81
+ $schema: '../../../schemas/task-preset-plugin/commands.schema.json',
82
+ schemaVersion: '1.1',
83
+ selectionMode: 'multiple',
84
+ groups: [{
85
+ id: 'repository-analysis',
86
+ title: localized('commands.groupTitle'),
87
+ description: localized('commands.groupDescription'),
88
+ }],
89
+ commands: [
90
+ {
91
+ id: 'what-is-this',
92
+ groupId: 'repository-analysis',
93
+ label: 'what is this',
94
+ description: localized('commands.whatIsThisDescription'),
95
+ docsSlug: 'what-is-this',
96
+ },
97
+ {
98
+ id: 'what-is-next',
99
+ groupId: 'repository-analysis',
100
+ label: 'what is next',
101
+ description: localized('commands.whatIsNextDescription'),
102
+ docsSlug: 'what-is-next',
103
+ },
104
+ ],
105
+ }),
106
+ },
107
+ {
108
+ path: 'backend/task-preset.json',
109
+ contents: json({
110
+ $schema: '../../../schemas/task-preset-plugin/task-preset.schema.json',
111
+ taskKey: `${packageName}.repositoryAnalysis`,
112
+ scriptKey: `hagitask.${packageName}`,
113
+ defaultTargetType: 'repository',
114
+ execution: { schemaVersion: '1.0', strategy: 'extension', extensionPoint: 'hagitask.command-analysis' },
115
+ requirements: [{ type: 'agent', name: 'any' }],
116
+ targets: {
117
+ repositories: {
118
+ enabled: true,
119
+ selections: [{
120
+ id: 'targetRepositories',
121
+ selectionMode: 'multiple',
122
+ allowedAccessTypes: ['read'],
123
+ output: 'targetRepositories',
124
+ required: true,
125
+ scope: { source: 'owner-project-repositories' },
126
+ }],
127
+ },
128
+ vaults: { enabled: false },
129
+ projects: { enabled: false },
130
+ },
131
+ inputBindings: [
132
+ {
133
+ input: 'targetRepositories',
134
+ promptParameter: 'targetRepositories',
135
+ metadataKey: 'targetRepositories',
136
+ valueType: 'multiple',
137
+ transform: 'string-list',
138
+ required: true,
139
+ producer: 'field-output',
140
+ },
141
+ ],
142
+ }),
143
+ },
144
+ {
145
+ path: 'backend/prompts.json',
146
+ contents: json({
147
+ $schema: '../../../schemas/task-preset-plugin/prompt-package.schema.json',
148
+ version: '1.0.0',
149
+ templateEngine: 'handlebars',
150
+ defaultLocale: 'en-US',
151
+ supportedLocales: ['en-US', 'zh-CN'],
152
+ inputs: [
153
+ {
154
+ name: 'targetRepositories',
155
+ source: 'task-preset-input',
156
+ required: true,
157
+ description: 'One or more explicitly selected repository identifiers.',
158
+ },
159
+ ],
160
+ rendering: { strictVariables: true, trimBlocks: true },
161
+ locales: {
162
+ 'en-US': {
163
+ systemTemplate: './templates/en-US/system.md',
164
+ userTemplate: './templates/en-US/user.hbs',
165
+ },
166
+ 'zh-CN': {
167
+ systemTemplate: './templates/zh-CN/system.md',
168
+ userTemplate: './templates/zh-CN/user.hbs',
169
+ },
170
+ },
171
+ commandSystemPrompts: {
172
+ 'what-is-this': {
173
+ 'en-US': './templates/en-US/commands/what-is-this.md',
174
+ 'zh-CN': './templates/zh-CN/commands/what-is-this.md',
175
+ },
176
+ 'what-is-next': {
177
+ 'en-US': './templates/en-US/commands/what-is-next.md',
178
+ 'zh-CN': './templates/zh-CN/commands/what-is-next.md',
179
+ },
180
+ },
181
+ }),
182
+ },
183
+ {
184
+ path: 'locales/en-US.json',
185
+ contents: json({
186
+ $schema: '../../../schemas/task-preset-plugin/locales.schema.json',
187
+ taskPreset: {
188
+ displayName: packageName,
189
+ title: `Create ${packageName}`,
190
+ description: 'Analyze explicitly selected repositories.',
191
+ defaultTitle: packageName,
192
+ submit: 'Run analysis',
193
+ submitting: 'Running analysis...',
194
+ },
195
+ panel: {
196
+ repositoryLabel: 'Repositories',
197
+ repositoryHint: 'Select one or more repositories. Analysis never chooses an implicit target.',
198
+ repositoryEmpty: 'Select a repository before running an analysis.',
199
+ },
200
+ commands: {
201
+ groupTitle: 'Repository analysis',
202
+ groupDescription: 'Understand the selected repository and plan improvements.',
203
+ whatIsThisDescription: 'Explain the purpose and structure of the selected repository.',
204
+ whatIsNextDescription: 'Recommend actionable next improvements for the selected repository.',
205
+ },
206
+ repositories: Object.fromEntries(repositories.map((value) => [value, value])),
207
+ }),
208
+ },
209
+ {
210
+ path: 'locales/zh-CN.json',
211
+ contents: json({
212
+ $schema: '../../../schemas/task-preset-plugin/locales.schema.json',
213
+ taskPreset: {
214
+ displayName: packageName,
215
+ title: `创建 ${packageName}`,
216
+ description: '分析明确选择的仓库。',
217
+ defaultTitle: packageName,
218
+ submit: '运行分析',
219
+ submitting: '正在运行分析……',
220
+ },
221
+ panel: {
222
+ repositoryLabel: '仓库',
223
+ repositoryHint: '选择一个或多个仓库。分析不会隐式选择目标。',
224
+ repositoryEmpty: '运行分析前请先选择仓库。',
225
+ },
226
+ commands: {
227
+ groupTitle: '仓库分析',
228
+ groupDescription: '了解选定仓库并规划改进。',
229
+ whatIsThisDescription: '说明选定仓库的用途和结构。',
230
+ whatIsNextDescription: '为选定仓库推荐可执行的后续改进。',
231
+ },
232
+ repositories: Object.fromEntries(repositories.map((value) => [value, value])),
233
+ }),
234
+ },
235
+ {
236
+ path: 'backend/templates/en-US/system.md',
237
+ contents: 'You analyze only the repositories listed in {{targetRepositories}}.\n',
238
+ },
239
+ {
240
+ path: 'backend/templates/en-US/user.hbs',
241
+ contents: 'Use the selected repository context to answer the requested analysis.\n',
242
+ },
243
+ {
244
+ path: 'backend/templates/en-US/commands/what-is-this.md',
245
+ contents: 'Describe what the selected repository does, its main structure, and key entry points.\n',
246
+ },
247
+ {
248
+ path: 'backend/templates/en-US/commands/what-is-next.md',
249
+ contents: 'Recommend prioritized, actionable improvements for the selected repository.\n',
250
+ },
251
+ {
252
+ path: 'backend/templates/zh-CN/system.md',
253
+ contents: '你只能分析 {{targetRepositories}} 中明确选择的仓库。\n',
254
+ },
255
+ {
256
+ path: 'backend/templates/zh-CN/user.hbs',
257
+ contents: '使用选定仓库上下文回答请求的分析问题。\n',
258
+ },
259
+ {
260
+ path: 'backend/templates/zh-CN/commands/what-is-this.md',
261
+ contents: '说明选定仓库的用途、主要结构和关键入口。\n',
262
+ },
263
+ {
264
+ path: 'backend/templates/zh-CN/commands/what-is-next.md',
265
+ contents: '为选定仓库推荐有优先级且可执行的改进方向。\n',
266
+ },
267
+ {
268
+ path: 'store-page/index.en-US.md',
269
+ contents: `# ${packageName}\n\nA scaffold for repository analysis.\n`,
270
+ },
271
+ {
272
+ path: 'store-page/index.zh-CN.md',
273
+ contents: `# ${packageName}\n\n用于仓库分析的脚手架包。\n`,
274
+ },
275
+ {
276
+ path: 'commands/README.md',
277
+ contents: '# Command extensions\n\n`what is this` explains a selected repository. `what is next` recommends improvements. Add new command IDs to `frontend/commands.json` and matching prompt files under `backend/templates/<locale>/commands/`.\n',
278
+ },
279
+ ];
280
+ }
281
+ //# sourceMappingURL=new-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-package.js","sourceRoot":"","sources":["../../src/templates/new-package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface ValidationError {
2
+ packageId: string;
3
+ file: string;
4
+ field: string;
5
+ message: string;
6
+ }
7
+ export interface ValidationResult {
8
+ packages: string[];
9
+ errors: ValidationError[];
10
+ valid: boolean;
11
+ }
12
+ export declare function formatValidationError(error: ValidationError): string;
13
+ export declare function formatValidationText(result: ValidationResult): string;
@@ -0,0 +1,16 @@
1
+ export function formatValidationError(error) {
2
+ return `${error.packageId}: ${error.file}: ${error.field}: ${error.message}`;
3
+ }
4
+ export function formatValidationText(result) {
5
+ const lines = [
6
+ `HagiTask package validation ${result.valid ? 'passed' : 'failed'}`,
7
+ `Packages discovered: ${result.packages.length}`,
8
+ `Packages: ${result.packages.join(', ') || '(none)'}`,
9
+ `Errors: ${result.errors.length}`,
10
+ ];
11
+ if (result.errors.length > 0) {
12
+ lines.push('', ...result.errors.map((error) => `- ${formatValidationError(error)}`));
13
+ }
14
+ return lines.join('\n');
15
+ }
16
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/validation/diagnostics.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,qBAAqB,CAAC,KAAsB;IAC1D,OAAO,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAwB;IAC3D,MAAM,KAAK,GAAG;QACZ,+BAA+B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;QACnE,wBAAwB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;QAChD,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;QACrD,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;KAClC,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface DiscoveredPackage {
2
+ dirName: string;
3
+ dir: string;
4
+ rel: string;
5
+ }
6
+ export interface DiscoveryResult {
7
+ packages: DiscoveredPackage[];
8
+ errors: string[];
9
+ }
10
+ export declare function discoverPackages(targetPath: string): DiscoveryResult;
@@ -0,0 +1,45 @@
1
+ import { existsSync, readdirSync, statSync } from 'node:fs';
2
+ import { basename, join, resolve } from 'node:path';
3
+ function packageInDir(dir, rel) {
4
+ if (!statSync(dir, { throwIfNoEntry: false })?.isDirectory())
5
+ return undefined;
6
+ if (!existsSync(join(dir, 'manifest.json')))
7
+ return undefined;
8
+ return { dirName: basename(dir), dir, rel };
9
+ }
10
+ export function discoverPackages(targetPath) {
11
+ const root = resolve(targetPath);
12
+ if (!existsSync(root)) {
13
+ return { packages: [], errors: [`target path does not exist: ${root}`] };
14
+ }
15
+ if (!statSync(root).isDirectory()) {
16
+ return { packages: [], errors: [`target path is not a directory: ${root}`] };
17
+ }
18
+ const direct = packageInDir(root, basename(root));
19
+ if (direct)
20
+ return { packages: [direct], errors: [] };
21
+ const layouts = ['presets', 'data'].filter((name) => {
22
+ const path = join(root, name);
23
+ return existsSync(path) && statSync(path).isDirectory();
24
+ });
25
+ if (layouts.length === 0) {
26
+ return {
27
+ packages: [],
28
+ errors: [`unsupported package layout at ${root}; expected presets/<taskId>/, data/<taskId>/, or a package directory containing manifest.json`],
29
+ };
30
+ }
31
+ const packages = [];
32
+ for (const layout of layouts) {
33
+ const layoutDir = join(root, layout);
34
+ for (const entry of readdirSync(layoutDir, { withFileTypes: true })) {
35
+ if (!entry.isDirectory())
36
+ continue;
37
+ const pkg = packageInDir(join(layoutDir, entry.name), `${layout}/${entry.name}`);
38
+ if (pkg)
39
+ packages.push(pkg);
40
+ }
41
+ }
42
+ packages.sort((a, b) => a.rel.localeCompare(b.rel));
43
+ return { packages, errors: [] };
44
+ }
45
+ //# sourceMappingURL=package-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-discovery.js","sourceRoot":"","sources":["../../src/validation/package-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAY,OAAO,EAAE,MAAM,WAAW,CAAC;AAa9D,SAAS,YAAY,CAAC,GAAW,EAAE,GAAW;IAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE;QAAE,OAAO,SAAS,CAAC;IAC/E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,+BAA+B,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAClC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,mCAAmC,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,IAAI,MAAM;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEtD,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,CAAC,iCAAiC,IAAI,+FAA+F,CAAC;SAC/I,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACjF,IAAI,GAAG;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DiscoveredPackage } from './package-discovery.js';
2
+ import type { ValidationError, ValidationResult } from './diagnostics.js';
3
+ export declare function validatePackage(pkg: DiscoveredPackage, targetRoot: string, packageRoot: string): ValidationError[];
4
+ export declare function validateDiscoveredPackages(packages: DiscoveredPackage[], targetRoot: string, packageRoot: string): ValidationResult;