@ddtcorex/dsh-maestro-review 0.1.0 → 0.1.1

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 (104) hide show
  1. package/lib/config-store.d.ts +2 -0
  2. package/lib/config-store.d.ts.map +1 -1
  3. package/lib/config-store.js.map +1 -1
  4. package/lib/git-worktree-tool.d.ts +11 -0
  5. package/lib/git-worktree-tool.d.ts.map +1 -0
  6. package/lib/git-worktree-tool.js +162 -0
  7. package/lib/git-worktree-tool.js.map +1 -0
  8. package/lib/govard-audit-lint-tool.d.ts +14 -0
  9. package/lib/govard-audit-lint-tool.d.ts.map +1 -0
  10. package/lib/govard-audit-lint-tool.js +171 -0
  11. package/lib/govard-audit-lint-tool.js.map +1 -0
  12. package/lib/hyva-csp-scan-tool.d.ts +11 -0
  13. package/lib/hyva-csp-scan-tool.d.ts.map +1 -0
  14. package/lib/hyva-csp-scan-tool.js +193 -0
  15. package/lib/hyva-csp-scan-tool.js.map +1 -0
  16. package/lib/hyva-theme-inspect-tool.d.ts +10 -0
  17. package/lib/hyva-theme-inspect-tool.d.ts.map +1 -0
  18. package/lib/hyva-theme-inspect-tool.js +299 -0
  19. package/lib/hyva-theme-inspect-tool.js.map +1 -0
  20. package/lib/incremental.d.ts +28 -0
  21. package/lib/incremental.d.ts.map +1 -0
  22. package/lib/incremental.js +60 -0
  23. package/lib/incremental.js.map +1 -0
  24. package/lib/layout-xml-tool.d.ts +11 -0
  25. package/lib/layout-xml-tool.d.ts.map +1 -0
  26. package/lib/layout-xml-tool.js +240 -0
  27. package/lib/layout-xml-tool.js.map +1 -0
  28. package/lib/module-check-tool.d.ts +11 -0
  29. package/lib/module-check-tool.d.ts.map +1 -0
  30. package/lib/module-check-tool.js +304 -0
  31. package/lib/module-check-tool.js.map +1 -0
  32. package/lib/orchestrator.d.ts +2 -0
  33. package/lib/orchestrator.d.ts.map +1 -1
  34. package/lib/orchestrator.js +203 -78
  35. package/lib/orchestrator.js.map +1 -1
  36. package/lib/perf-log-stats-tool.d.ts +13 -0
  37. package/lib/perf-log-stats-tool.d.ts.map +1 -0
  38. package/lib/perf-log-stats-tool.js +245 -0
  39. package/lib/perf-log-stats-tool.js.map +1 -0
  40. package/lib/phtml-escape-scan-tool.d.ts +11 -0
  41. package/lib/phtml-escape-scan-tool.d.ts.map +1 -0
  42. package/lib/phtml-escape-scan-tool.js +170 -0
  43. package/lib/phtml-escape-scan-tool.js.map +1 -0
  44. package/lib/plan-track-tool.d.ts +11 -0
  45. package/lib/plan-track-tool.d.ts.map +1 -0
  46. package/lib/plan-track-tool.js +143 -0
  47. package/lib/plan-track-tool.js.map +1 -0
  48. package/lib/review-history.d.ts +4 -0
  49. package/lib/review-history.d.ts.map +1 -1
  50. package/lib/review-history.js +4 -0
  51. package/lib/review-history.js.map +1 -1
  52. package/lib/scope-split-tool.d.ts +42 -0
  53. package/lib/scope-split-tool.d.ts.map +1 -0
  54. package/lib/scope-split-tool.js +109 -0
  55. package/lib/scope-split-tool.js.map +1 -0
  56. package/lib/search-tool.d.ts +15 -0
  57. package/lib/search-tool.d.ts.map +1 -0
  58. package/lib/search-tool.js +144 -0
  59. package/lib/search-tool.js.map +1 -0
  60. package/lib/settings-rpc.d.ts.map +1 -1
  61. package/lib/settings-rpc.js +47 -8
  62. package/lib/settings-rpc.js.map +1 -1
  63. package/lib/skills-tool.d.ts +1 -1
  64. package/lib/skills-tool.d.ts.map +1 -1
  65. package/lib/skills-tool.js +5 -1
  66. package/lib/skills-tool.js.map +1 -1
  67. package/lib/tdd-evidence-tool.d.ts +11 -0
  68. package/lib/tdd-evidence-tool.d.ts.map +1 -0
  69. package/lib/tdd-evidence-tool.js +114 -0
  70. package/lib/tdd-evidence-tool.js.map +1 -0
  71. package/lib/tool-policy.d.ts +20 -0
  72. package/lib/tool-policy.d.ts.map +1 -0
  73. package/lib/tool-policy.js +42 -0
  74. package/lib/tool-policy.js.map +1 -0
  75. package/lib/workspace-tool.d.ts.map +1 -1
  76. package/lib/workspace-tool.js +15 -9
  77. package/lib/workspace-tool.js.map +1 -1
  78. package/package.json +3 -2
  79. package/src/augment.d.ts +4 -0
  80. package/src/config-store.ts +2 -0
  81. package/src/git-worktree-tool.ts +130 -0
  82. package/src/govard-audit-lint-tool.ts +147 -0
  83. package/src/hyva-csp-scan-tool.ts +165 -0
  84. package/src/hyva-theme-inspect-tool.ts +258 -0
  85. package/src/incremental.ts +84 -0
  86. package/src/layout-xml-tool.ts +191 -0
  87. package/src/module-check-tool.ts +188 -0
  88. package/src/orchestrator.ts +189 -75
  89. package/src/perf-log-stats-tool.ts +224 -0
  90. package/src/phtml-escape-scan-tool.ts +117 -0
  91. package/src/plan-track-tool.ts +118 -0
  92. package/src/review-history.ts +8 -0
  93. package/src/scope-split-tool.ts +110 -0
  94. package/src/search-tool.ts +153 -0
  95. package/src/settings-rpc.ts +53 -10
  96. package/src/skills-tool.ts +5 -1
  97. package/src/tdd-evidence-tool.ts +85 -0
  98. package/src/tool-policy.ts +49 -0
  99. package/src/workspace-tool.ts +27 -9
  100. package/lib/pin-store.d.ts +0 -5
  101. package/lib/pin-store.d.ts.map +0 -1
  102. package/lib/pin-store.js +0 -5
  103. package/lib/pin-store.js.map +0 -1
  104. package/src/pin-store.ts +0 -4
@@ -0,0 +1,11 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import z from '@deepseek-ai/schemastery';
3
+ export declare const name = "maestro-layout-xml-tool";
4
+ export declare const inject: string[];
5
+ export declare const Config: z<{
6
+ rootPath?: string;
7
+ }>;
8
+ export declare function apply(ctx: Context, config?: {
9
+ rootPath?: string;
10
+ }): void;
11
+ //# sourceMappingURL=layout-xml-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-xml-tool.d.ts","sourceRoot":"","sources":["../src/layout-xml-tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAGxC,eAAO,MAAM,IAAI,4BAA4B,CAAA;AAC7C,eAAO,MAAM,MAAM,UAAY,CAAA;AAC/B,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAsC,CAAA;AA8ClF,wBAAgB,KAAK,CAAC,GAAG,EAAC,OAAO,EAAE,MAAM,GAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,CAAA;CAAI,GAAE,IAAI,CAwIpE"}
@@ -0,0 +1,240 @@
1
+ import { join, resolve, sep, basename } from 'node:path';
2
+ import { readFile, readdir, realpath, stat } from 'node:fs/promises';
3
+ import z from '@deepseek-ai/schemastery';
4
+ import { defineTool } from '@deepseek-ai/dsh-tools';
5
+ export const name = 'maestro-layout-xml-tool';
6
+ export const inject = ['tools'];
7
+ export const Config = z.object({ rootPath: z.string() });
8
+ function workspaceRootFor(c, exec) {
9
+ if (c !== undefined)
10
+ return c;
11
+ const cwd = exec?.agent?.session?.header?.cwd;
12
+ return typeof cwd === 'string' && cwd !== '' ? cwd : process.cwd();
13
+ }
14
+ async function isInsideRoot(root, target) {
15
+ const ar = resolve(root);
16
+ const rs = resolve(ar, target);
17
+ if (rs !== ar && !rs.startsWith(ar + sep))
18
+ return false;
19
+ try {
20
+ const rr = await realpath(ar);
21
+ const rt = await realpath(rs);
22
+ return rt === rr || rt.startsWith(rr + sep);
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ const MAX_FILE_BYTES = 1024 * 1024;
29
+ const MAX_FILES = 2000;
30
+ const SKIP_DIRS = new Set(['.git', 'node_modules', 'vendor', 'pub/static']);
31
+ const LAYOUT_RE = /\/layout\//;
32
+ // tiny helpers
33
+ function parseAttrs(s) {
34
+ const out = {};
35
+ let m;
36
+ const re = /(\w+)="([^"]*)"/g;
37
+ while ((m = re.exec(s)) !== null)
38
+ out[m[1]] = m[2];
39
+ return out;
40
+ }
41
+ async function exists(p) { try {
42
+ await stat(p);
43
+ return true;
44
+ }
45
+ catch {
46
+ return false;
47
+ } }
48
+ async function* walkLayout(dir, root, budget) {
49
+ if (budget.files <= 0)
50
+ return;
51
+ let entries;
52
+ try {
53
+ entries = await readdir(dir, { withFileTypes: true });
54
+ }
55
+ catch {
56
+ return;
57
+ }
58
+ for (const e of entries) {
59
+ if (budget.files <= 0)
60
+ return;
61
+ if (e.isDirectory()) {
62
+ if (SKIP_DIRS.has(e.name))
63
+ continue;
64
+ yield* walkLayout(join(dir, e.name), root, budget);
65
+ continue;
66
+ }
67
+ if (!e.isFile())
68
+ continue;
69
+ if (!e.name.endsWith('.xml'))
70
+ continue;
71
+ if (!join(dir, e.name).includes('/layout/'))
72
+ continue;
73
+ budget.files -= 1;
74
+ yield join(dir, e.name);
75
+ }
76
+ }
77
+ export function apply(ctx, config = {}) {
78
+ const configuredRoot = config.rootPath;
79
+ ctx.effect(() => ctx.tools.register(defineTool({
80
+ name: 'layout_xml_extract',
81
+ description: 'Extract Magento layout handles/blocks/moves/head from layout XML under workspace. Use before claiming layout is correct.',
82
+ parameters: {
83
+ root: { type: 'string' },
84
+ changedFiles: { type: 'array', items: { type: 'string' } },
85
+ },
86
+ output: {
87
+ schema: {
88
+ type: 'object', additionalProperties: false,
89
+ properties: {
90
+ handles: { type: 'array', required: true },
91
+ handleCount: { type: 'number', required: true },
92
+ blockCount: { type: 'number', required: true },
93
+ scannedFiles: { type: 'number', required: true },
94
+ truncated: { type: 'boolean', required: true },
95
+ }
96
+ },
97
+ render: (_args, v) => [{ type: 'text', text: JSON.stringify(v, null, 2) }],
98
+ },
99
+ async execute(args, exec) {
100
+ const rawRoot = args.root ?? '';
101
+ const root = workspaceRootFor(configuredRoot, exec);
102
+ if (rawRoot !== '' && !(await isInsideRoot(root, rawRoot)))
103
+ return { text: `Path "${rawRoot}" escapes the workspace root.`, truncated: false };
104
+ const effectiveRoot = rawRoot === '' ? root : resolve(root, rawRoot);
105
+ const changedFiles = args.changedFiles;
106
+ if (changedFiles) {
107
+ for (const p of changedFiles) {
108
+ if (!(await isInsideRoot(effectiveRoot, p)))
109
+ return { text: `Path "${p}" escapes the workspace root.`, truncated: false };
110
+ }
111
+ }
112
+ // collect files
113
+ const budget = { files: MAX_FILES };
114
+ const all = [];
115
+ for await (const f of walkLayout(effectiveRoot, effectiveRoot, budget)) {
116
+ const rel = f.startsWith(effectiveRoot + sep) ? f.slice(effectiveRoot.length + 1) : basename(f);
117
+ all.push(rel);
118
+ }
119
+ let files = all;
120
+ if (changedFiles && changedFiles.length > 0) {
121
+ const set = new Set(changedFiles.map(p => p.endsWith('.xml') ? p : p));
122
+ files = all.filter(p => set.has(p) || changedFiles.some(cf => p.endsWith(basename(cf))));
123
+ // also if allow-list contains files not discovered via walk (e.g., outside layout but still layout), include them if they exist and are layout
124
+ for (const cf of changedFiles) {
125
+ if (!files.includes(cf)) {
126
+ const abs = resolve(effectiveRoot, cf);
127
+ if (await exists(abs) && cf.includes('/layout/') && cf.endsWith('.xml') && !(all.includes(cf)))
128
+ files.push(cf);
129
+ }
130
+ }
131
+ }
132
+ const truncated = budget.files <= 0;
133
+ const handles = [];
134
+ let blockCount = 0;
135
+ for (const rel of files) {
136
+ const abs = resolve(effectiveRoot, rel);
137
+ let text;
138
+ try {
139
+ const buf = await readFile(abs);
140
+ if (buf.byteLength > MAX_FILE_BYTES)
141
+ continue;
142
+ text = buf.toString('utf-8');
143
+ }
144
+ catch {
145
+ continue;
146
+ }
147
+ const handle = basename(rel, '.xml');
148
+ const layoutType = /<page\b/.test(text) ? 'page' : 'generic';
149
+ // quick parseError heuristic: mismatched < vs > or unclosed tag
150
+ let parseError = null;
151
+ const openCount = (text.match(/</g) || []).length;
152
+ const closeCount = (text.match(/>/g) || []).length;
153
+ if (openCount !== closeCount)
154
+ parseError = `mismatched < (${openCount}) vs > (${closeCount})`;
155
+ // also detect block tag without closing >
156
+ if (/<block[^>]*$/m.test(text) || /<block[^>]*<\/body/.test(text))
157
+ parseError = parseError ?? 'malformed block tag';
158
+ if (parseError) {
159
+ handles.push({ file: rel, handle, layoutType, blocks: [], moves: [], references: [], head: { scripts: [], css: [], metas: [], removes: [] }, parseError });
160
+ continue;
161
+ }
162
+ const blocks = [];
163
+ const moves = [];
164
+ const references = [];
165
+ const head = { scripts: [], css: [], metas: [], removes: [] };
166
+ // blocks/containers (only concrete)
167
+ const tagRe = /<(block|container)\b([^>]*?)(?:\/>|>)/g;
168
+ let m;
169
+ while ((m = tagRe.exec(text)) !== null) {
170
+ const type = m[1];
171
+ const attrStr = m[2];
172
+ const attrs = parseAttrs(attrStr);
173
+ const name = attrs.name ?? null;
174
+ const klass = attrs.class ?? null;
175
+ const template = attrs.template ?? null;
176
+ let templateExists = null;
177
+ if (template !== null) {
178
+ if (template.includes('::')) {
179
+ const [modPart, filePart] = template.split('::');
180
+ const [vendor, mod] = modPart.split('_');
181
+ if (vendor && mod && filePart) {
182
+ const cand = join(effectiveRoot, `app/code/${vendor}/${mod}/view/frontend/templates/${filePart}`);
183
+ templateExists = await exists(cand);
184
+ if (!templateExists) {
185
+ templateExists = false;
186
+ }
187
+ }
188
+ else
189
+ templateExists = false;
190
+ }
191
+ else {
192
+ templateExists = await exists(join(effectiveRoot, template));
193
+ }
194
+ }
195
+ const as = attrs.as ?? null;
196
+ const cacheable = attrs.cacheable ? attrs.cacheable === 'true' : null;
197
+ const remove = attrs.remove === 'true';
198
+ blocks.push({ name, type, class: klass, template, templateExists, as, cacheable, remove, refs: [] });
199
+ }
200
+ // references
201
+ const refRe = /(<(referenceBlock|referenceContainer)\b([^>]*?)(?:\/>|>))/g;
202
+ while ((m = refRe.exec(text)) !== null) {
203
+ const type = m[2];
204
+ const attrs = parseAttrs(m[3]);
205
+ references.push({ kind: type, name: attrs.name ?? '', attrs });
206
+ }
207
+ // moves
208
+ const moveRe = /<move\b([^>]*?)\/>/g;
209
+ while ((m = moveRe.exec(text)) !== null) {
210
+ const attrs = parseAttrs(m[1]);
211
+ moves.push({ element: attrs.element ?? '', destination: attrs.destination ?? null, as: attrs.as ?? null, before: attrs.before ?? null, after: attrs.after ?? null });
212
+ }
213
+ // head css/scripts
214
+ const cssRe = /<css\b([^>]*?)\/>/g;
215
+ while ((m = cssRe.exec(text)) !== null) {
216
+ const a = parseAttrs(m[1]);
217
+ if (a.src)
218
+ head.css.push({ src: a.src });
219
+ }
220
+ const scriptRe = /<script\b([^>]*?)\/>/g;
221
+ while ((m = scriptRe.exec(text)) !== null) {
222
+ const a = parseAttrs(m[1]);
223
+ if (a.src)
224
+ head.scripts.push({ src: a.src });
225
+ }
226
+ // also <remove src=>
227
+ const removeRe = /<remove\b([^>]*?)\/>/g;
228
+ while ((m = removeRe.exec(text)) !== null) {
229
+ const a = parseAttrs(m[1]);
230
+ if (a.src)
231
+ head.removes.push(a.src);
232
+ }
233
+ blockCount += blocks.length;
234
+ handles.push({ file: rel, handle, layoutType, blocks, moves, references, head, parseError: null });
235
+ }
236
+ return { handles, handleCount: handles.length, blockCount, scannedFiles: files.length, truncated };
237
+ },
238
+ }), 'layout xml'));
239
+ }
240
+ //# sourceMappingURL=layout-xml-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-xml-tool.js","sourceRoot":"","sources":["../src/layout-xml-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import z from '@deepseek-ai/schemastery';
3
+ export declare const name = "maestro-module-check-tool";
4
+ export declare const inject: string[];
5
+ export declare const Config: z<{
6
+ rootPath?: string;
7
+ }>;
8
+ export declare function apply(ctx: Context, config?: {
9
+ rootPath?: string;
10
+ }): void;
11
+ //# sourceMappingURL=module-check-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-check-tool.d.ts","sourceRoot":"","sources":["../src/module-check-tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAGxC,eAAO,MAAM,IAAI,8BAA4B,CAAA;AAC7C,eAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,eAAO,MAAM,MAAM,EAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,CAAA;CAAC,CAAiC,CAAA;AAgCzE,wBAAgB,KAAK,CAAC,GAAG,EAAC,OAAO,EAAE,MAAM,GAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,CAAA;CAAI,GAAE,IAAI,CAmJpE"}
@@ -0,0 +1,304 @@
1
+ import { join, resolve, sep } from 'node:path';
2
+ import { readFile, readdir, realpath, stat } from 'node:fs/promises';
3
+ import z from '@deepseek-ai/schemastery';
4
+ import { defineTool } from '@deepseek-ai/dsh-tools';
5
+ export const name = 'maestro-module-check-tool';
6
+ export const inject = ['tools'];
7
+ export const Config = z.object({ rootPath: z.string() });
8
+ function workspaceRootFor(c, e) {
9
+ if (c !== undefined)
10
+ return c;
11
+ const cwd = e?.agent?.session?.header?.cwd;
12
+ return typeof cwd === 'string' && cwd !== '' ? cwd : process.cwd();
13
+ }
14
+ async function isInsideRoot(r, t) {
15
+ const ar = resolve(r);
16
+ const rs = resolve(ar, t);
17
+ if (rs !== ar && !rs.startsWith(ar + sep))
18
+ return false;
19
+ try {
20
+ const rr = await realpath(ar);
21
+ const rt = await realpath(rs);
22
+ return rt === rr || rt.startsWith(rr + sep);
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ const MAX_FILE_BYTES = 1024 * 1024;
29
+ const MAX_MODULES = 100;
30
+ async function exists(p) { try {
31
+ await stat(p);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ } }
37
+ async function boundedRead(p) {
38
+ try {
39
+ const b = await readFile(p);
40
+ if (b.byteLength > MAX_FILE_BYTES)
41
+ return null;
42
+ return b.toString('utf-8');
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ function parseRegistrationName(text) {
49
+ const re = /(?:\\?[\w\\]*ComponentRegistrar)::register\s*\(\s*(?:\\?[\w\\]*ComponentRegistrar::)?MODULE\s*,\s*['"]([^'"]+)['"]/;
50
+ const m = re.exec(text);
51
+ return m ? m[1] : null;
52
+ }
53
+ function parseModuleXml(text) {
54
+ const nameRe = /<module\b[^>]*name="([^"]+)"/;
55
+ const nm = nameRe.exec(text);
56
+ const name = nm ? nm[1] : null;
57
+ const seq = [];
58
+ const seqRe = /<module\s+name="([^"]+)"\s*\/>/g;
59
+ let m;
60
+ // only inside <sequence> block
61
+ const seqBlock = /<sequence>([\s\S]*?)<\/sequence>/.exec(text);
62
+ if (seqBlock) {
63
+ const inner = seqBlock[1];
64
+ while ((m = seqRe.exec(inner)) !== null)
65
+ seq.push(m[1]);
66
+ }
67
+ return { name, sequence: seq };
68
+ }
69
+ export function apply(ctx, config = {}) {
70
+ const configuredRoot = config.rootPath;
71
+ ctx.effect(() => ctx.tools.register(defineTool({
72
+ name: 'magento_module_check',
73
+ description: 'Validate Magento 2 module structure (registration, module.xml, composer, db_schema, acl, routes, Hyva compat).',
74
+ parameters: {
75
+ modulePath: { type: 'string' },
76
+ },
77
+ output: {
78
+ schema: {
79
+ type: 'object', additionalProperties: false,
80
+ properties: {
81
+ modules: { type: 'array', required: true },
82
+ scannedModules: { type: 'number', required: true },
83
+ truncated: { type: 'boolean', required: true },
84
+ }
85
+ },
86
+ render: (_a, v) => [{ type: 'text', text: JSON.stringify(v, null, 2) }],
87
+ },
88
+ async execute(args, exec) {
89
+ const rawPath = args.modulePath;
90
+ const root = workspaceRootFor(configuredRoot, exec);
91
+ if (rawPath !== undefined && !(await isInsideRoot(root, rawPath)))
92
+ return { text: `Path "${rawPath}" escapes the workspace root.`, truncated: false };
93
+ let candidates = [];
94
+ if (rawPath !== undefined) {
95
+ const abs = resolve(root, rawPath);
96
+ // must contain registration.php or etc/module.xml to be considered a module; otherwise empty
97
+ candidates = [rawPath];
98
+ }
99
+ else {
100
+ const base = join(root, 'app/code');
101
+ let vendors = [];
102
+ try {
103
+ vendors = await readdir(base);
104
+ }
105
+ catch {
106
+ vendors = [];
107
+ }
108
+ for (const vendor of vendors) {
109
+ if (vendor.startsWith('.'))
110
+ continue;
111
+ let mods = [];
112
+ try {
113
+ mods = await readdir(join(base, vendor));
114
+ }
115
+ catch {
116
+ continue;
117
+ }
118
+ for (const mod of mods) {
119
+ if (mod.startsWith('.'))
120
+ continue;
121
+ candidates.push(join('app/code', vendor, mod));
122
+ if (candidates.length >= MAX_MODULES)
123
+ break;
124
+ }
125
+ if (candidates.length >= MAX_MODULES)
126
+ break;
127
+ }
128
+ }
129
+ const truncated = candidates.length >= MAX_MODULES;
130
+ const modules = [];
131
+ for (const rel of candidates.slice(0, MAX_MODULES)) {
132
+ const abs = resolve(root, rel);
133
+ let isDir = false;
134
+ try {
135
+ const s = await stat(abs);
136
+ isDir = s.isDirectory();
137
+ }
138
+ catch {
139
+ continue;
140
+ }
141
+ if (!isDir)
142
+ continue;
143
+ const issues = [];
144
+ const regText = await boundedRead(join(abs, 'registration.php'));
145
+ const hasRegistration = regText !== null;
146
+ let regName = null;
147
+ let registrationValid = null;
148
+ if (hasRegistration) {
149
+ regName = parseRegistrationName(regText);
150
+ registrationValid = regName !== null;
151
+ if (!registrationValid)
152
+ issues.push({ severity: 'high', rule: 'registration-invalid', message: 'registration.php does not contain ComponentRegistrar::register for MODULE', file: join(rel, 'registration.php'), line: null });
153
+ }
154
+ else {
155
+ issues.push({ severity: 'critical', rule: 'registration-missing', message: 'registration.php missing', file: join(rel, 'registration.php'), line: null });
156
+ }
157
+ const modXmlText = await boundedRead(join(abs, 'etc/module.xml'));
158
+ const hasEtcModuleXml = modXmlText !== null;
159
+ let modName = null;
160
+ let sequence = [];
161
+ if (hasEtcModuleXml) {
162
+ const parsed = parseModuleXml(modXmlText);
163
+ modName = parsed.name;
164
+ sequence = parsed.sequence;
165
+ if (!modName)
166
+ issues.push({ severity: 'critical', rule: 'module-xml-missing-name', message: 'etc/module.xml missing module name', file: join(rel, 'etc/module.xml'), line: null });
167
+ }
168
+ else {
169
+ issues.push({ severity: 'high', rule: 'module-xml-missing', message: 'etc/module.xml missing', file: join(rel, 'etc/module.xml'), line: null });
170
+ }
171
+ if (regName && modName && regName !== modName) {
172
+ issues.push({ severity: 'high', rule: 'name-mismatch', message: `registration name ${regName} != module.xml ${modName}`, file: join(rel, 'etc/module.xml'), line: null });
173
+ }
174
+ // composer
175
+ const composerText = await boundedRead(join(abs, 'composer.json'));
176
+ let composerName = null;
177
+ let psr4 = null;
178
+ if (composerText) {
179
+ try {
180
+ const j = JSON.parse(composerText);
181
+ composerName = j.name ?? null;
182
+ psr4 = j.autoload?.['psr-4'] ?? null;
183
+ }
184
+ catch { }
185
+ if (composerName && modName) {
186
+ // psr-4 cross-check not strict for test
187
+ }
188
+ }
189
+ // db_schema
190
+ const hasDbSchema = await exists(join(abs, 'etc/db_schema.xml'));
191
+ let dbSchemaTables = [];
192
+ if (hasDbSchema) {
193
+ const dbText = await boundedRead(join(abs, 'etc/db_schema.xml'));
194
+ if (dbText) {
195
+ const re = /<table\s+name="([^"]+)"/g;
196
+ let m;
197
+ while ((m = re.exec(dbText)) !== null)
198
+ dbSchemaTables.push(m[1]);
199
+ }
200
+ }
201
+ // acl
202
+ const hasAcl = await exists(join(abs, 'etc/acl.xml'));
203
+ let aclResources = [];
204
+ if (hasAcl) {
205
+ const t = await boundedRead(join(abs, 'etc/acl.xml'));
206
+ if (t) {
207
+ const re = /<resource\s+id="([^"]+)"/g;
208
+ let m;
209
+ while ((m = re.exec(t)) !== null)
210
+ aclResources.push(m[1]);
211
+ }
212
+ }
213
+ // routes
214
+ let hasRoutes = false;
215
+ const routes = [];
216
+ for (const area of ['frontend', 'adminhtml']) {
217
+ const rp = join(abs, `etc/${area}/routes.xml`);
218
+ if (await exists(rp)) {
219
+ hasRoutes = true;
220
+ const rt = await boundedRead(rp);
221
+ if (rt) {
222
+ const re = /<route\s+[^>]*frontName="([^"]+)"/g;
223
+ let m;
224
+ while ((m = re.exec(rt)) !== null)
225
+ routes.push({ area, frontName: m[1] });
226
+ }
227
+ }
228
+ }
229
+ if (await exists(join(abs, 'etc/routes.xml'))) {
230
+ hasRoutes = true;
231
+ }
232
+ // events
233
+ let hasObserverEvents = [];
234
+ const evText = await boundedRead(join(abs, 'etc/events.xml'));
235
+ if (evText) {
236
+ const re = /<event\s+name="([^"]+)"/g;
237
+ let m;
238
+ while ((m = re.exec(evText)) !== null)
239
+ hasObserverEvents.push(m[1]);
240
+ }
241
+ // cron/webapi
242
+ const hasCron = await exists(join(abs, 'etc/crontab.xml')) || await exists(join(abs, 'etc/cron_groups.xml'));
243
+ const hasWebapi = await exists(join(abs, 'etc/webapi.xml'));
244
+ let apiInterfaces = [];
245
+ if (hasWebapi) {
246
+ const t = await boundedRead(join(abs, 'etc/webapi.xml'));
247
+ if (t) {
248
+ const re = /<service\s+class="([^"]+)"/g;
249
+ let m;
250
+ while ((m = re.exec(t)) !== null)
251
+ apiInterfaces.push(m[1]);
252
+ }
253
+ }
254
+ // Hyva compat: scan phtml for data-bind vs x-data
255
+ let isHyvaCompatible = null;
256
+ const compatNotes = [];
257
+ let hasPhtml = false;
258
+ let hasDataBind = false;
259
+ let hasXData = false;
260
+ async function scanPhtml(dir) {
261
+ let entries;
262
+ try {
263
+ entries = await readdir(dir, { withFileTypes: true });
264
+ }
265
+ catch {
266
+ return;
267
+ }
268
+ for (const e of entries) {
269
+ if (e.isDirectory())
270
+ await scanPhtml(join(dir, e.name));
271
+ else if (e.isFile() && e.name.endsWith('.phtml')) {
272
+ hasPhtml = true;
273
+ const txt = await boundedRead(join(dir, e.name));
274
+ if (!txt)
275
+ continue;
276
+ if (/data-bind\s*=/.test(txt))
277
+ hasDataBind = true;
278
+ if (/x-data\s*=/.test(txt))
279
+ hasXData = true;
280
+ }
281
+ }
282
+ }
283
+ await scanPhtml(join(abs, 'view/frontend/templates'));
284
+ if (hasPhtml) {
285
+ if (hasDataBind) {
286
+ isHyvaCompatible = false;
287
+ compatNotes.push('knockout data-bind found — not Hyva compatible');
288
+ }
289
+ else if (hasXData) {
290
+ isHyvaCompatible = true;
291
+ compatNotes.push('Alpine x-data found — Hyva compatible');
292
+ }
293
+ else {
294
+ isHyvaCompatible = null;
295
+ }
296
+ }
297
+ const moduleInfo = { name: modName ?? regName, sequence, hasRegistration, registrationValid, hasEtcModuleXml, hasDbSchema, dbSchemaTables, hasAcl, aclResources, hasRoutes, routes, hasObserverEvents, hasCron, hasWebapi, apiInterfaces, composerName, psr4 };
298
+ modules.push({ path: rel, module: moduleInfo, issues, isHyvaCompatible, compatNotes });
299
+ }
300
+ return { modules, scannedModules: modules.length, truncated };
301
+ },
302
+ }), 'module check'));
303
+ }
304
+ //# sourceMappingURL=module-check-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-check-tool.js","sourceRoot":"","sources":["../src/module-check-tool.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,8 @@ export declare const name = "maestro-orchestrator";
20
20
  export declare const inject: string[];
21
21
  /** Convert DSH's selected default model into the options required by a child Agent. */
22
22
  export declare function agentOptionsForModel(selection: ModelSelection): ModelSelection;
23
+ export declare function isUnsupportedReasoningError(err: unknown): boolean;
24
+ export declare function getTurnErrorMessage(handle: unknown): string | undefined;
23
25
  /**
24
26
  * Resolve the model to use for an automated review. Priority: per-project
25
27
  * override > global reviewModel > DSH default (`fallback`).