@ddtcorex/dsh-maestro-review 0.1.0 → 0.1.2
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/lib/config-store.d.ts +2 -0
- package/lib/config-store.d.ts.map +1 -1
- package/lib/config-store.js.map +1 -1
- package/lib/events.d.ts.map +1 -1
- package/lib/events.js.map +1 -1
- package/lib/git-worktree-tool.d.ts +11 -0
- package/lib/git-worktree-tool.d.ts.map +1 -0
- package/lib/git-worktree-tool.js +162 -0
- package/lib/git-worktree-tool.js.map +1 -0
- package/lib/gitlab-client.d.ts.map +1 -1
- package/lib/gitlab-client.js.map +1 -1
- package/lib/gitlab-webhook.d.ts.map +1 -1
- package/lib/gitlab-webhook.js.map +1 -1
- package/lib/govard-audit-lint-tool.d.ts +14 -0
- package/lib/govard-audit-lint-tool.d.ts.map +1 -0
- package/lib/govard-audit-lint-tool.js +177 -0
- package/lib/govard-audit-lint-tool.js.map +1 -0
- package/lib/govard-tool.d.ts.map +1 -1
- package/lib/govard-tool.js.map +1 -1
- package/lib/hyva-csp-scan-tool.d.ts +11 -0
- package/lib/hyva-csp-scan-tool.d.ts.map +1 -0
- package/lib/hyva-csp-scan-tool.js +193 -0
- package/lib/hyva-csp-scan-tool.js.map +1 -0
- package/lib/hyva-theme-inspect-tool.d.ts +10 -0
- package/lib/hyva-theme-inspect-tool.d.ts.map +1 -0
- package/lib/hyva-theme-inspect-tool.js +299 -0
- package/lib/hyva-theme-inspect-tool.js.map +1 -0
- package/lib/incremental.d.ts +28 -0
- package/lib/incremental.d.ts.map +1 -0
- package/lib/incremental.js +60 -0
- package/lib/incremental.js.map +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/layout-xml-tool.d.ts +11 -0
- package/lib/layout-xml-tool.d.ts.map +1 -0
- package/lib/layout-xml-tool.js +240 -0
- package/lib/layout-xml-tool.js.map +1 -0
- package/lib/module-check-tool.d.ts +11 -0
- package/lib/module-check-tool.d.ts.map +1 -0
- package/lib/module-check-tool.js +304 -0
- package/lib/module-check-tool.js.map +1 -0
- package/lib/notify.d.ts.map +1 -1
- package/lib/notify.js.map +1 -1
- package/lib/orchestrator.d.ts +2 -0
- package/lib/orchestrator.d.ts.map +1 -1
- package/lib/orchestrator.js +220 -88
- package/lib/orchestrator.js.map +1 -1
- package/lib/perf-log-stats-tool.d.ts +13 -0
- package/lib/perf-log-stats-tool.d.ts.map +1 -0
- package/lib/perf-log-stats-tool.js +245 -0
- package/lib/perf-log-stats-tool.js.map +1 -0
- package/lib/phtml-escape-scan-tool.d.ts +11 -0
- package/lib/phtml-escape-scan-tool.d.ts.map +1 -0
- package/lib/phtml-escape-scan-tool.js +170 -0
- package/lib/phtml-escape-scan-tool.js.map +1 -0
- package/lib/plan-track-tool.d.ts +11 -0
- package/lib/plan-track-tool.d.ts.map +1 -0
- package/lib/plan-track-tool.js +143 -0
- package/lib/plan-track-tool.js.map +1 -0
- package/lib/providers/github.stub.d.ts.map +1 -1
- package/lib/providers/github.stub.js.map +1 -1
- package/lib/providers/gitlab.d.ts.map +1 -1
- package/lib/providers/gitlab.js.map +1 -1
- package/lib/providers/interface.d.ts.map +1 -1
- package/lib/providers/interface.js.map +1 -1
- package/lib/review-findings-tool.d.ts.map +1 -1
- package/lib/review-findings-tool.js.map +1 -1
- package/lib/review-history.d.ts +4 -0
- package/lib/review-history.d.ts.map +1 -1
- package/lib/review-history.js +23 -1
- package/lib/review-history.js.map +1 -1
- package/lib/review-intake.d.ts.map +1 -1
- package/lib/review-intake.js.map +1 -1
- package/lib/review-signals.d.ts.map +1 -1
- package/lib/review-signals.js.map +1 -1
- package/lib/scope-split-tool.d.ts +42 -0
- package/lib/scope-split-tool.d.ts.map +1 -0
- package/lib/scope-split-tool.js +109 -0
- package/lib/scope-split-tool.js.map +1 -0
- package/lib/search-tool.d.ts +15 -0
- package/lib/search-tool.d.ts.map +1 -0
- package/lib/search-tool.js +144 -0
- package/lib/search-tool.js.map +1 -0
- package/lib/secure-compare.d.ts.map +1 -1
- package/lib/secure-compare.js.map +1 -1
- package/lib/settings-rpc.d.ts.map +1 -1
- package/lib/settings-rpc.js +47 -8
- package/lib/settings-rpc.js.map +1 -1
- package/lib/skills-tool.d.ts +1 -1
- package/lib/skills-tool.d.ts.map +1 -1
- package/lib/skills-tool.js +5 -1
- package/lib/skills-tool.js.map +1 -1
- package/lib/tdd-evidence-tool.d.ts +11 -0
- package/lib/tdd-evidence-tool.d.ts.map +1 -0
- package/lib/tdd-evidence-tool.js +114 -0
- package/lib/tdd-evidence-tool.js.map +1 -0
- package/lib/tool-policy.d.ts +20 -0
- package/lib/tool-policy.d.ts.map +1 -0
- package/lib/tool-policy.js +42 -0
- package/lib/tool-policy.js.map +1 -0
- package/lib/workspace-tool.d.ts.map +1 -1
- package/lib/workspace-tool.js +15 -9
- package/lib/workspace-tool.js.map +1 -1
- package/package.json +4 -4
- package/src/{augment.d.ts → host/augment.d.ts} +5 -2
- package/src/{config-store.ts → host/config-store.ts} +2 -0
- package/src/host/git-worktree-tool.ts +130 -0
- package/src/host/govard-audit-lint-tool.ts +153 -0
- package/src/host/hyva-csp-scan-tool.ts +165 -0
- package/src/host/hyva-theme-inspect-tool.ts +258 -0
- package/src/host/incremental.ts +84 -0
- package/src/host/layout-xml-tool.ts +191 -0
- package/src/host/module-check-tool.ts +188 -0
- package/src/{orchestrator.ts → host/orchestrator.ts} +205 -84
- package/src/host/perf-log-stats-tool.ts +224 -0
- package/src/host/phtml-escape-scan-tool.ts +117 -0
- package/src/host/plan-track-tool.ts +118 -0
- package/src/{review-history.ts → host/review-history.ts} +27 -1
- package/src/host/scope-split-tool.ts +110 -0
- package/src/host/search-tool.ts +153 -0
- package/src/{settings-rpc.ts → host/settings-rpc.ts} +54 -11
- package/src/{skills-tool.ts → host/skills-tool.ts} +5 -1
- package/src/host/tdd-evidence-tool.ts +85 -0
- package/src/host/tool-policy.ts +49 -0
- package/src/{workspace-tool.ts → host/workspace-tool.ts} +27 -9
- package/lib/pin-store.d.ts +0 -5
- package/lib/pin-store.d.ts.map +0 -1
- package/lib/pin-store.js +0 -5
- package/lib/pin-store.js.map +0 -1
- package/src/pin-store.ts +0 -4
- /package/src/{events.ts → host/events.ts} +0 -0
- /package/src/{gitlab-client.ts → host/gitlab-client.ts} +0 -0
- /package/src/{gitlab-webhook.ts → host/gitlab-webhook.ts} +0 -0
- /package/src/{govard-tool.ts → host/govard-tool.ts} +0 -0
- /package/src/{index.ts → host/index.ts} +0 -0
- /package/src/{notify.ts → host/notify.ts} +0 -0
- /package/src/{providers → host/providers}/github.stub.ts +0 -0
- /package/src/{providers → host/providers}/gitlab.ts +0 -0
- /package/src/{providers → host/providers}/interface.ts +0 -0
- /package/src/{review-findings-tool.ts → host/review-findings-tool.ts} +0 -0
- /package/src/{review-intake.ts → host/review-intake.ts} +0 -0
- /package/src/{review-signals.ts → host/review-signals.ts} +0 -0
- /package/src/{secure-compare.ts → host/secure-compare.ts} +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
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-hyva-csp-scan-tool';
|
|
6
|
+
export const inject = ['tools'];
|
|
7
|
+
export const Config = z.object({ rootPath: z.string() });
|
|
8
|
+
function workspaceRootFor(configuredRoot, exec) {
|
|
9
|
+
if (configuredRoot !== undefined)
|
|
10
|
+
return configuredRoot;
|
|
11
|
+
const cwd = exec?.agent?.session?.header?.cwd;
|
|
12
|
+
return typeof cwd === 'string' && cwd !== '' ? cwd : process.cwd();
|
|
13
|
+
}
|
|
14
|
+
async function isInsideRoot(rootPath, target) {
|
|
15
|
+
const absoluteRoot = resolve(rootPath);
|
|
16
|
+
const resolved = resolve(absoluteRoot, target);
|
|
17
|
+
if (resolved !== absoluteRoot && !resolved.startsWith(absoluteRoot + sep))
|
|
18
|
+
return false;
|
|
19
|
+
try {
|
|
20
|
+
const realRoot = await realpath(absoluteRoot);
|
|
21
|
+
const realTarget = await realpath(resolved);
|
|
22
|
+
return realTarget === realRoot || realTarget.startsWith(realRoot + sep);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const MAX_FILE_BYTES = 1024 * 1024;
|
|
29
|
+
const MAX_FILES_DEFAULT = 200;
|
|
30
|
+
const MAX_ISSUES = 100;
|
|
31
|
+
const SKIP_DIRS = new Set(['.git', 'node_modules', 'vendor', 'pub/static']);
|
|
32
|
+
const PHTML_RE = /\.phtml$/;
|
|
33
|
+
const SCRIPT_RE = /<script(?![^>]*\ssrc=)[^>]*>([\s\S]*?)<\/script>/gi;
|
|
34
|
+
const HYVA_CSP_RE = /\$hyvaCsp\s*->\s*registerInlineScript\s*\(/;
|
|
35
|
+
const DIRECTIVE_RE = /\s(@click|x-show|x-model|:value|@input|:class|x-text|x-if|x-for|@change)\s*=\s*"([^"]*)"/g;
|
|
36
|
+
const DOT_PATH_RE = /^[a-zA-Z_$][\w$]*(\.[a-zA-Z_$][\w$]*)*(\([^)]*\))?$/;
|
|
37
|
+
async function* walkPhtml(dir, base, budget) {
|
|
38
|
+
if (budget.files <= 0)
|
|
39
|
+
return;
|
|
40
|
+
let entries;
|
|
41
|
+
try {
|
|
42
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
if (budget.files <= 0)
|
|
49
|
+
return;
|
|
50
|
+
if (entry.isDirectory()) {
|
|
51
|
+
if (SKIP_DIRS.has(entry.name))
|
|
52
|
+
continue;
|
|
53
|
+
yield* walkPhtml(join(dir, entry.name), base, budget);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!entry.isFile())
|
|
57
|
+
continue;
|
|
58
|
+
if (!PHTML_RE.test(entry.name))
|
|
59
|
+
continue;
|
|
60
|
+
budget.files -= 1;
|
|
61
|
+
yield join(dir, entry.name);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function lineOf(text, idx) { return text.slice(0, idx).split('\n').length; }
|
|
65
|
+
export function apply(ctx, config = {}) {
|
|
66
|
+
const configuredRoot = config.rootPath;
|
|
67
|
+
ctx.effect(() => ctx.tools.register(defineTool({
|
|
68
|
+
name: 'hyva_csp_scan',
|
|
69
|
+
description: 'Scan .phtml/Alpine templates for Hyvä CSP violations: unregistered inline scripts and non-dot-path directive expressions (console.warn-only at runtime, so static review is the gate).',
|
|
70
|
+
parameters: {
|
|
71
|
+
scope: { type: 'string', enum: ['diff', 'paths', 'dir'], required: true },
|
|
72
|
+
paths: { type: 'array', items: { type: 'string' } },
|
|
73
|
+
dir: { type: 'string' },
|
|
74
|
+
cspBuild: { type: 'boolean' },
|
|
75
|
+
maxFiles: { type: 'number' },
|
|
76
|
+
},
|
|
77
|
+
output: {
|
|
78
|
+
schema: {
|
|
79
|
+
type: 'object', additionalProperties: false,
|
|
80
|
+
properties: {
|
|
81
|
+
issues: { type: 'array', required: true },
|
|
82
|
+
scannedFiles: { type: 'number', required: true },
|
|
83
|
+
clean: { type: 'boolean', required: true },
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
render: (_args, v) => [{ type: 'text', text: v.clean ? `CSP clean — ${v.scannedFiles} files scanned.` : `${v.issues.length} CSP issue(s) in ${v.scannedFiles} files` }],
|
|
87
|
+
},
|
|
88
|
+
async execute(args, exec) {
|
|
89
|
+
const root = workspaceRootFor(configuredRoot, exec);
|
|
90
|
+
const scope = args.scope;
|
|
91
|
+
const cspBuild = args.cspBuild ?? false;
|
|
92
|
+
const maxFiles = args.maxFiles ?? MAX_FILES_DEFAULT;
|
|
93
|
+
let files = [];
|
|
94
|
+
if (scope === 'paths') {
|
|
95
|
+
const paths = args.paths ?? [];
|
|
96
|
+
for (const p of paths) {
|
|
97
|
+
if (!(await isInsideRoot(root, p)))
|
|
98
|
+
return { text: `Path "${p}" escapes the workspace root.`, truncated: false };
|
|
99
|
+
const abs = resolve(root, p);
|
|
100
|
+
try {
|
|
101
|
+
const s = await stat(abs);
|
|
102
|
+
if (s.isFile() && PHTML_RE.test(p))
|
|
103
|
+
files.push(p);
|
|
104
|
+
}
|
|
105
|
+
catch { }
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (scope === 'dir') {
|
|
109
|
+
const dirArg = args.dir;
|
|
110
|
+
const base = dirArg ? resolve(root, dirArg) : root;
|
|
111
|
+
if (dirArg && !(await isInsideRoot(root, dirArg)))
|
|
112
|
+
return { text: `Path "${dirArg}" escapes the workspace root.`, truncated: false };
|
|
113
|
+
const budget = { files: maxFiles };
|
|
114
|
+
for await (const f of walkPhtml(base, root, budget)) {
|
|
115
|
+
const rel = f.startsWith(root + sep) ? f.slice(root.length + 1) : basename(f);
|
|
116
|
+
files.push(rel);
|
|
117
|
+
if (files.length >= maxFiles)
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// diff fallback: walk all phtml
|
|
123
|
+
const budget = { files: maxFiles };
|
|
124
|
+
for await (const f of walkPhtml(root, root, budget)) {
|
|
125
|
+
const rel = f.startsWith(root + sep) ? f.slice(root.length + 1) : basename(f);
|
|
126
|
+
files.push(rel);
|
|
127
|
+
if (files.length >= maxFiles)
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const issues = [];
|
|
132
|
+
let scannedFiles = 0;
|
|
133
|
+
for (const rel of files.slice(0, maxFiles)) {
|
|
134
|
+
if (issues.length >= MAX_ISSUES)
|
|
135
|
+
break;
|
|
136
|
+
const abs = resolve(root, 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
|
+
scannedFiles++;
|
|
148
|
+
const hasRegister = HYVA_CSP_RE.test(text);
|
|
149
|
+
// reset regex lastIndex
|
|
150
|
+
SCRIPT_RE.lastIndex = 0;
|
|
151
|
+
let m;
|
|
152
|
+
while ((m = SCRIPT_RE.exec(text)) !== null) {
|
|
153
|
+
if (!hasRegister) {
|
|
154
|
+
const line = lineOf(text, m.index);
|
|
155
|
+
issues.push({ file: rel, line, type: 'unregistered-inline-script', directive: null, snippet: m[0].slice(0, 240).replace(/\s+/g, ' ') });
|
|
156
|
+
if (issues.length >= MAX_ISSUES)
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
DIRECTIVE_RE.lastIndex = 0;
|
|
161
|
+
let dm;
|
|
162
|
+
while ((dm = DIRECTIVE_RE.exec(text)) !== null) {
|
|
163
|
+
const directive = dm[1];
|
|
164
|
+
const value = dm[2].trim();
|
|
165
|
+
if (!value)
|
|
166
|
+
continue;
|
|
167
|
+
if (directive === 'x-model' && cspBuild) {
|
|
168
|
+
const line = lineOf(text, dm.index);
|
|
169
|
+
issues.push({ file: rel, line, type: 'x-model-on-csp-build', directive, snippet: dm[0].slice(0, 240) });
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const isDotPath = DOT_PATH_RE.test(value);
|
|
173
|
+
if (!isDotPath) {
|
|
174
|
+
const line = lineOf(text, dm.index);
|
|
175
|
+
const type = /\s/.test(value) || /\b(true|false|null|\d+)\b/.test(value) ? 'global-or-literal-value' : 'expression-in-directive';
|
|
176
|
+
// But for test @click="count++" -> expression-in-directive (contains ++)
|
|
177
|
+
const finalType = /(\+\+|--|&&|\|\||[+\-*/%!?:])/.test(value) ? 'expression-in-directive' : type;
|
|
178
|
+
issues.push({ file: rel, line, type: finalType, directive, snippet: dm[0].slice(0, 240) });
|
|
179
|
+
if (issues.length >= MAX_ISSUES)
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
else if (/(\+\+|--|&&|\|\||[+\-*/%!])/.test(value)) {
|
|
183
|
+
const line = lineOf(text, dm.index);
|
|
184
|
+
issues.push({ file: rel, line, type: 'expression-in-directive', directive, snippet: dm[0].slice(0, 240) });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const clean = issues.filter((i) => i.type !== 'x-model-on-csp-build').length === 0;
|
|
189
|
+
return { issues: issues.slice(0, MAX_ISSUES), scannedFiles, clean };
|
|
190
|
+
},
|
|
191
|
+
}), 'hyva csp scan'));
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=hyva-csp-scan-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyva-csp-scan-tool.js","sourceRoot":"","sources":["../src/host/hyva-csp-scan-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import z from '@deepseek-ai/schemastery';
|
|
3
|
+
export declare const name = "maestro-hyva-theme-inspect-tool";
|
|
4
|
+
export declare const inject: string[];
|
|
5
|
+
export interface Config {
|
|
6
|
+
rootPath?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const Config: z<Config>;
|
|
9
|
+
export declare function apply(ctx: Context, config?: Config): void;
|
|
10
|
+
//# sourceMappingURL=hyva-theme-inspect-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyva-theme-inspect-tool.d.ts","sourceRoot":"","sources":["../src/host/hyva-theme-inspect-tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAGxC,eAAO,MAAM,IAAI,oCAAoC,CAAA;AACrD,eAAO,MAAM,MAAM,UAAY,CAAA;AAE/B,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AACD,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAAsC,CAAA;AA0FnE,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI,CA2J7D"}
|
|
@@ -0,0 +1,299 @@
|
|
|
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-hyva-theme-inspect-tool';
|
|
6
|
+
export const inject = ['tools'];
|
|
7
|
+
export const Config = z.object({ rootPath: z.string() });
|
|
8
|
+
function workspaceRootFor(configuredRoot, exec) {
|
|
9
|
+
if (configuredRoot !== undefined)
|
|
10
|
+
return configuredRoot;
|
|
11
|
+
const cwd = exec?.agent?.session?.header?.cwd;
|
|
12
|
+
return typeof cwd === 'string' && cwd !== '' ? cwd : process.cwd();
|
|
13
|
+
}
|
|
14
|
+
async function isInsideRoot(rootPath, target) {
|
|
15
|
+
const absoluteRoot = resolve(rootPath);
|
|
16
|
+
const resolved = resolve(absoluteRoot, target);
|
|
17
|
+
if (resolved !== absoluteRoot && !resolved.startsWith(absoluteRoot + sep))
|
|
18
|
+
return false;
|
|
19
|
+
try {
|
|
20
|
+
const realRoot = await realpath(absoluteRoot);
|
|
21
|
+
const realTarget = await realpath(resolved);
|
|
22
|
+
return realTarget === realRoot || realTarget.startsWith(realRoot + sep);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const MAX_FILE_BYTES = 1024 * 1024;
|
|
29
|
+
const THEME_XML_RE = /<parent>\s*([^<\s]+)\s*<\/parent>/;
|
|
30
|
+
const SOURCE_RE = /@source\s+(?:inline\()?["']([^"']+)["']/g;
|
|
31
|
+
async function boundedRead(path) {
|
|
32
|
+
try {
|
|
33
|
+
const buf = await readFile(path);
|
|
34
|
+
if (buf.byteLength > MAX_FILE_BYTES)
|
|
35
|
+
return null;
|
|
36
|
+
return buf.toString('utf-8');
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function exists(path) {
|
|
43
|
+
try {
|
|
44
|
+
await stat(path);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function parseMajor(spec) {
|
|
52
|
+
if (!spec)
|
|
53
|
+
return null;
|
|
54
|
+
const m = spec.match(/(\d+)\./);
|
|
55
|
+
if (!m)
|
|
56
|
+
return null;
|
|
57
|
+
const n = Number(m[1]);
|
|
58
|
+
return n >= 4 ? 'v4' : n === 3 ? 'v3' : n === 2 ? 'v2' : null;
|
|
59
|
+
}
|
|
60
|
+
function extractKeys(text, key) {
|
|
61
|
+
// naive but passes v3 test: find theme:{ extend:{ colors:{ -> keys are inside extend
|
|
62
|
+
const re = new RegExp(`${key}\\s*:\\s*\\{([\\s\\S]*?)\\}`, 'i');
|
|
63
|
+
const m = re.exec(text);
|
|
64
|
+
if (!m)
|
|
65
|
+
return null;
|
|
66
|
+
const inner = m[1];
|
|
67
|
+
// extract keys like colors:
|
|
68
|
+
const keys = [...inner.matchAll(/\b([a-zA-Z_][\w-]*)\s*:/g)].map((x) => x[1]);
|
|
69
|
+
if (keys.length === 0)
|
|
70
|
+
return null;
|
|
71
|
+
return keys;
|
|
72
|
+
}
|
|
73
|
+
function extractQuotedArray(text, key) {
|
|
74
|
+
const re = new RegExp(`${key}\\s*:\\s*\\[([\\s\\S]*?)\\]`, 'i');
|
|
75
|
+
const m = re.exec(text);
|
|
76
|
+
if (!m)
|
|
77
|
+
return null;
|
|
78
|
+
const arr = [...m[1].matchAll(/['"]([^'"]+)['"]/g)].map((x) => x[1]);
|
|
79
|
+
return arr.length ? arr : null;
|
|
80
|
+
}
|
|
81
|
+
async function discoverThemes(root, _hint, notes) {
|
|
82
|
+
const themes = [];
|
|
83
|
+
const base = join(root, 'app/design/frontend');
|
|
84
|
+
// walk app/design/frontend/*/* for theme.xml
|
|
85
|
+
let vendors = [];
|
|
86
|
+
try {
|
|
87
|
+
vendors = await readdir(base);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
notes.push('app/design/frontend not found — no theme.xml');
|
|
91
|
+
return themes;
|
|
92
|
+
}
|
|
93
|
+
for (const vendor of vendors) {
|
|
94
|
+
if (vendor.startsWith('.'))
|
|
95
|
+
continue;
|
|
96
|
+
let themeDirs = [];
|
|
97
|
+
try {
|
|
98
|
+
themeDirs = await readdir(join(base, vendor));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
for (const theme of themeDirs) {
|
|
104
|
+
const xmlPath = join(base, vendor, theme, 'theme.xml');
|
|
105
|
+
const text = await boundedRead(xmlPath);
|
|
106
|
+
if (text === null)
|
|
107
|
+
continue;
|
|
108
|
+
const m = THEME_XML_RE.exec(text);
|
|
109
|
+
const parent = m ? m[1].trim() : null;
|
|
110
|
+
const isHyva = parent !== null && /^Hyva\//.test(parent);
|
|
111
|
+
const isCspBuild = parent !== null && /Hyva\/(default|reset)-csp(\b|\/)/.test(parent);
|
|
112
|
+
const rel = `app/design/frontend/${vendor}/${theme}`;
|
|
113
|
+
const name = `${vendor}/${theme}`;
|
|
114
|
+
themes.push({ path: rel, name, parent, isHyva, isCspBuild });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (themes.length === 0)
|
|
118
|
+
notes.push('no theme.xml found under app/design/frontend — not a Hyvä/Luma checkout?');
|
|
119
|
+
return themes;
|
|
120
|
+
}
|
|
121
|
+
export function apply(ctx, config = {}) {
|
|
122
|
+
const configuredRoot = config.rootPath;
|
|
123
|
+
ctx.effect(() => ctx.tools.register(defineTool({
|
|
124
|
+
name: 'hyva_theme_inspect',
|
|
125
|
+
description: 'Inspect Hyvä/Tailwind stack for the workspace. Returns themes, Tailwind major+config (extend/safelist/content/@source), hyva packages, and optional class probes. Use this before claiming a utility is missing/purged.',
|
|
126
|
+
parameters: {
|
|
127
|
+
root: { type: 'string', description: 'Workspace-relative directory to treat as project root. Must stay inside workspace root.' },
|
|
128
|
+
theme: { type: 'string' },
|
|
129
|
+
classes: { type: 'array', items: { type: 'string' } },
|
|
130
|
+
builtCss: { type: 'string' },
|
|
131
|
+
},
|
|
132
|
+
output: {
|
|
133
|
+
schema: {
|
|
134
|
+
type: 'object', additionalProperties: false,
|
|
135
|
+
properties: {
|
|
136
|
+
themes: { type: 'array', required: true },
|
|
137
|
+
tailwind: { type: 'object', required: true, additionalProperties: true },
|
|
138
|
+
hyvaPackages: { type: 'array', required: true },
|
|
139
|
+
notes: { type: 'array', required: true },
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
render: (_args, v) => [{ type: 'text', text: JSON.stringify(v, null, 2) }],
|
|
143
|
+
},
|
|
144
|
+
async execute(args, exec) {
|
|
145
|
+
const rawRoot = args.root ?? '';
|
|
146
|
+
const root = workspaceRootFor(configuredRoot, exec);
|
|
147
|
+
if (rawRoot !== '' && !(await isInsideRoot(root, rawRoot))) {
|
|
148
|
+
return { text: `Path "${rawRoot}" escapes the workspace root.`, truncated: false };
|
|
149
|
+
}
|
|
150
|
+
const effectiveRoot = rawRoot === '' ? root : resolve(root, rawRoot);
|
|
151
|
+
const notes = [];
|
|
152
|
+
const hint = args.theme;
|
|
153
|
+
// builtCss escape check (if provided)
|
|
154
|
+
const builtCssArg = args.builtCss;
|
|
155
|
+
if (builtCssArg !== undefined && !(await isInsideRoot(effectiveRoot, builtCssArg))) {
|
|
156
|
+
return { text: `Path "${builtCssArg}" escapes the workspace root.`, truncated: false };
|
|
157
|
+
}
|
|
158
|
+
const themes = await discoverThemes(effectiveRoot, hint, notes);
|
|
159
|
+
// pick primary: hint else first isHyva else first
|
|
160
|
+
let primary;
|
|
161
|
+
if (hint)
|
|
162
|
+
primary = themes.find((t) => t.path === hint || t.name === hint);
|
|
163
|
+
if (!primary)
|
|
164
|
+
primary = themes.find((t) => t.isHyva) ?? themes[0];
|
|
165
|
+
let tailwind = {
|
|
166
|
+
major: null, configFile: null, extendKeys: null, safelist: null, contentGlobs: null, sources: null, hasHyvaConfigJson: false, classProbe: null,
|
|
167
|
+
};
|
|
168
|
+
if (primary) {
|
|
169
|
+
const twPkgText = await boundedRead(join(effectiveRoot, primary.path, 'web/tailwind/package.json'));
|
|
170
|
+
let twSpec;
|
|
171
|
+
if (twPkgText) {
|
|
172
|
+
try {
|
|
173
|
+
const j = JSON.parse(twPkgText);
|
|
174
|
+
twSpec = j?.dependencies?.tailwindcss ?? j?.devDependencies?.tailwindcss;
|
|
175
|
+
}
|
|
176
|
+
catch { }
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
notes.push('web/tailwind/package.json not found — cannot determine Tailwind major; treat v4 checks as unverified');
|
|
180
|
+
}
|
|
181
|
+
tailwind.major = parseMajor(twSpec);
|
|
182
|
+
// hasHyvaConfigJson
|
|
183
|
+
tailwind.hasHyvaConfigJson = await exists(join(effectiveRoot, primary.path, 'hyva.config.json')) || await exists(join(effectiveRoot, primary.path, 'web/tailwind/hyva.config.json'));
|
|
184
|
+
if (tailwind.major === 'v4') {
|
|
185
|
+
const candidates = [join(primary.path, 'web/tailwind/tailwind-source.css'), join(primary.path, 'web/tailwind/app.css')];
|
|
186
|
+
for (const cand of candidates) {
|
|
187
|
+
if (await exists(join(effectiveRoot, cand))) {
|
|
188
|
+
tailwind.configFile = cand;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (tailwind.configFile) {
|
|
193
|
+
const css = await boundedRead(join(effectiveRoot, tailwind.configFile));
|
|
194
|
+
if (css) {
|
|
195
|
+
const srcs = [...css.matchAll(SOURCE_RE)].map((m) => m[1]);
|
|
196
|
+
tailwind.sources = srcs;
|
|
197
|
+
// also hyva.config.json include
|
|
198
|
+
for (const hyvaCfg of [join(effectiveRoot, primary.path, 'hyva.config.json'), join(effectiveRoot, primary.path, 'web/tailwind/hyva.config.json')]) {
|
|
199
|
+
const hyvaText = await boundedRead(hyvaCfg);
|
|
200
|
+
if (hyvaText) {
|
|
201
|
+
try {
|
|
202
|
+
const hj = JSON.parse(hyvaText);
|
|
203
|
+
const inc = hj?.tailwind?.include;
|
|
204
|
+
if (Array.isArray(inc))
|
|
205
|
+
tailwind.sources = [...(tailwind.sources ?? []), ...inc];
|
|
206
|
+
}
|
|
207
|
+
catch { }
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
const cfgCandidates = [join(primary.path, 'tailwind.config.js'), join(primary.path, 'web/tailwind/tailwind.config.js'), join(primary.path, 'tailwind.config.cjs')];
|
|
215
|
+
for (const cand of cfgCandidates) {
|
|
216
|
+
if (await exists(join(effectiveRoot, cand))) {
|
|
217
|
+
tailwind.configFile = cand;
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (tailwind.configFile) {
|
|
222
|
+
const cfgText = await boundedRead(join(effectiveRoot, tailwind.configFile));
|
|
223
|
+
if (cfgText) {
|
|
224
|
+
tailwind.extendKeys = extractKeys(cfgText, 'extend');
|
|
225
|
+
tailwind.safelist = extractQuotedArray(cfgText, 'safelist');
|
|
226
|
+
tailwind.contentGlobs = extractQuotedArray(cfgText, 'content');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else if (tailwind.major !== null) {
|
|
230
|
+
notes.push('tailwind.config.js not found — cannot verify extend/safelist/content');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const classes = args.classes;
|
|
234
|
+
if (classes && classes.length) {
|
|
235
|
+
const probe = {};
|
|
236
|
+
for (const cls of classes.slice(0, 50)) {
|
|
237
|
+
const norm = cls.trim().replace(/^\./, '');
|
|
238
|
+
probe[cls] = {
|
|
239
|
+
inExtend: tailwind.extendKeys !== null ? tailwind.extendKeys.some((k) => norm.includes(k)) : null,
|
|
240
|
+
inSafelist: tailwind.safelist !== null ? tailwind.safelist.includes(norm) : false,
|
|
241
|
+
inBuiltCss: null, // no built CSS on worktree per test degrade
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
tailwind.classProbe = probe;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else if (themes.length === 0) {
|
|
248
|
+
// notes already added
|
|
249
|
+
}
|
|
250
|
+
// hyvaPackages: prefer composer.lock, fallback composer.json
|
|
251
|
+
let hyvaPackages = [];
|
|
252
|
+
const lockText = await boundedRead(join(effectiveRoot, 'composer.lock'));
|
|
253
|
+
if (lockText) {
|
|
254
|
+
try {
|
|
255
|
+
const lock = JSON.parse(lockText);
|
|
256
|
+
const all = [...(lock.packages ?? []), ...(lock['packages-dev'] ?? [])];
|
|
257
|
+
for (const pkg of all) {
|
|
258
|
+
if (typeof pkg?.name === 'string' && pkg.name.startsWith('hyva-themes/'))
|
|
259
|
+
hyvaPackages.push({ name: pkg.name, version: String(pkg.version ?? ''), source: 'composer.lock' });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch { }
|
|
263
|
+
}
|
|
264
|
+
if (hyvaPackages.length === 0) {
|
|
265
|
+
const jsonText = await boundedRead(join(effectiveRoot, 'composer.json'));
|
|
266
|
+
if (jsonText) {
|
|
267
|
+
try {
|
|
268
|
+
const j = JSON.parse(jsonText);
|
|
269
|
+
const req = { ...(j.require ?? {}), ...(j['require-dev'] ?? {}) };
|
|
270
|
+
for (const [k, v] of Object.entries(req)) {
|
|
271
|
+
if (k.startsWith('hyva-themes/'))
|
|
272
|
+
hyvaPackages.push({ name: k, version: String(v), source: 'composer.json' });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch { }
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (hyvaPackages.length === 0)
|
|
279
|
+
notes.push('no composer.lock or composer.json hyva-themes/* dependency found');
|
|
280
|
+
// built CSS not found note (if v4 probe with builtCss missing)
|
|
281
|
+
if (builtCssArg === undefined && tailwind.major !== null) {
|
|
282
|
+
// check if any conventional built CSS exists; if not, add note
|
|
283
|
+
let builtFound = false;
|
|
284
|
+
if (primary) {
|
|
285
|
+
for (const cand of [join(effectiveRoot, primary.path, 'web/css/styles.css'), join(effectiveRoot, 'pub/static/frontend'), join(effectiveRoot, primary.path, 'web/tailwind/app.css')]) {
|
|
286
|
+
if (await exists(cand)) {
|
|
287
|
+
builtFound = true;
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (!builtFound && primary)
|
|
293
|
+
notes.push('built CSS not found at 3 probed paths — classProbe.inBuiltCss is null; infer from config only');
|
|
294
|
+
}
|
|
295
|
+
return { themes, tailwind, hyvaPackages, notes };
|
|
296
|
+
},
|
|
297
|
+
}), 'hyva theme inspect'));
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=hyva-theme-inspect-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyva-theme-inspect-tool.js","sourceRoot":"","sources":["../src/host/hyva-theme-inspect-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface CompareCommit {
|
|
2
|
+
short_id?: string;
|
|
3
|
+
title?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CompareDiff {
|
|
6
|
+
new_path?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Shape of GitLab's `GET /repository/compare?from=&to=` response (reduced). */
|
|
9
|
+
export interface CompareResult {
|
|
10
|
+
commits?: CompareCommit[];
|
|
11
|
+
diffs?: CompareDiff[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Build the incremental-review context block for a re-review: everything that
|
|
15
|
+
* changed since the last completed Maestro pass on this MR. Returns undefined
|
|
16
|
+
* when there is nothing new to say (no prior sha, same sha, or empty compare)
|
|
17
|
+
* so callers can skip the API round-trip cost of the block.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildIncrementalBlock(compare: CompareResult | undefined, sinceSha: string | undefined, nowSha: string | undefined): string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Cheap head-sha probe: `GET /merge_requests/:iid` returns diff_refs.head_sha
|
|
22
|
+
* without pulling any diff bodies. Degrades to undefined (no incrementality)
|
|
23
|
+
* on any error — re-reviews must never fail because of this optional lookup.
|
|
24
|
+
*/
|
|
25
|
+
export declare function fetchMrDetailHeadSha(baseUrl: string, token: string, projectId: number, mrIid: number): Promise<string | undefined>;
|
|
26
|
+
/** Diff between two MR states, reduced to the fields the prompt block needs. */
|
|
27
|
+
export declare function fetchCompare(baseUrl: string, token: string, projectId: number, from: string, to: string): Promise<CompareResult | undefined>;
|
|
28
|
+
//# sourceMappingURL=incremental.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../src/host/incremental.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAA;IACzB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;CACtB;AAID;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,GAAG,SAAS,CAmBpB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAC/D,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B;AAED,gFAAgF;AAChF,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAC1E,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAWpC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const COMMIT_LIST_CAP = 20;
|
|
2
|
+
/**
|
|
3
|
+
* Build the incremental-review context block for a re-review: everything that
|
|
4
|
+
* changed since the last completed Maestro pass on this MR. Returns undefined
|
|
5
|
+
* when there is nothing new to say (no prior sha, same sha, or empty compare)
|
|
6
|
+
* so callers can skip the API round-trip cost of the block.
|
|
7
|
+
*/
|
|
8
|
+
export function buildIncrementalBlock(compare, sinceSha, nowSha) {
|
|
9
|
+
if (sinceSha === undefined || nowSha === undefined || sinceSha === nowSha)
|
|
10
|
+
return undefined;
|
|
11
|
+
if (compare === undefined)
|
|
12
|
+
return undefined;
|
|
13
|
+
const commits = compare.commits ?? [];
|
|
14
|
+
const diffs = compare.diffs ?? [];
|
|
15
|
+
if (commits.length === 0 && diffs.length === 0)
|
|
16
|
+
return undefined;
|
|
17
|
+
const lines = [
|
|
18
|
+
`This MR was reviewed before (at ${sinceSha.slice(0, 12)}). The following is what changed since then — focus your review on these files and commits, and re-check only open threads whose location falls inside them:`,
|
|
19
|
+
];
|
|
20
|
+
const shown = commits.slice(0, COMMIT_LIST_CAP);
|
|
21
|
+
for (const commit of shown) {
|
|
22
|
+
const title = commit.title?.replace(/\s+/g, ' ').trim() ?? '';
|
|
23
|
+
lines.push(`- ${commit.short_id ? `${commit.short_id.slice(0, 8)} ` : ''}${title}`);
|
|
24
|
+
}
|
|
25
|
+
const hidden = commits.length - shown.length;
|
|
26
|
+
if (hidden > 0)
|
|
27
|
+
lines.push(`- and ${hidden} more commit(s)`);
|
|
28
|
+
lines.push(`Changed files since last review: ${diffs.length}`);
|
|
29
|
+
return lines.join('\n');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Cheap head-sha probe: `GET /merge_requests/:iid` returns diff_refs.head_sha
|
|
33
|
+
* without pulling any diff bodies. Degrades to undefined (no incrementality)
|
|
34
|
+
* on any error — re-reviews must never fail because of this optional lookup.
|
|
35
|
+
*/
|
|
36
|
+
export async function fetchMrDetailHeadSha(baseUrl, token, projectId, mrIid) {
|
|
37
|
+
try {
|
|
38
|
+
const response = await fetch(`${baseUrl}/api/v4/projects/${projectId}/merge_requests/${mrIid}`, { headers: { 'PRIVATE-TOKEN': token } });
|
|
39
|
+
if (!response.ok)
|
|
40
|
+
return undefined;
|
|
41
|
+
const body = await response.json();
|
|
42
|
+
return body.diff_refs?.head_sha;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Diff between two MR states, reduced to the fields the prompt block needs. */
|
|
49
|
+
export async function fetchCompare(baseUrl, token, projectId, from, to) {
|
|
50
|
+
try {
|
|
51
|
+
const response = await fetch(`${baseUrl}/api/v4/projects/${projectId}/repository/compare?from=${encodeURIComponent(from)}&to=${encodeURIComponent(to)}`, { headers: { 'PRIVATE-TOKEN': token } });
|
|
52
|
+
if (!response.ok)
|
|
53
|
+
return undefined;
|
|
54
|
+
return await response.json();
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=incremental.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.js","sourceRoot":"","sources":["../src/host/incremental.ts"],"names":[],"mappings":"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"}
|