blume 2.0.0 → 2.0.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.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +28 -0
- package/README.md +2 -2
- package/dist/cli/{chunk-f7t03s3g.js → chunk-27g6wdth.js} +2 -2
- package/dist/cli/{chunk-mnqj32sj.js → chunk-2hn4b8z7.js} +13 -13
- package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
- package/dist/cli/{chunk-by2290sx.js → chunk-5shv93fd.js} +2 -2
- package/dist/cli/{chunk-a9kptbw5.js → chunk-6crbhc3x.js} +3 -3
- package/dist/cli/{chunk-a9kptbw5.js.map → chunk-6crbhc3x.js.map} +1 -1
- package/dist/cli/{chunk-mwt1k8n7.js → chunk-6hsn950k.js} +20 -20
- package/dist/cli/chunk-6hsn950k.js.map +10 -0
- package/dist/cli/{chunk-11j0384y.js → chunk-6vm74dry.js} +13 -13
- package/dist/cli/{chunk-11j0384y.js.map → chunk-6vm74dry.js.map} +3 -3
- package/dist/cli/{chunk-j8mw0za6.js → chunk-79jhk4py.js} +8 -8
- package/dist/cli/{chunk-j8mw0za6.js.map → chunk-79jhk4py.js.map} +2 -2
- package/dist/cli/{chunk-nk3ts2xk.js → chunk-82bbrxdn.js} +2 -2
- package/dist/cli/{chunk-2q1dwty4.js → chunk-ah61y8py.js} +8 -8
- package/dist/cli/{chunk-2q1dwty4.js.map → chunk-ah61y8py.js.map} +4 -4
- package/dist/cli/{chunk-zxccj738.js → chunk-ce574jw2.js} +1 -1
- package/dist/cli/{chunk-y3e45rc8.js → chunk-ch6g3ar0.js} +3 -3
- package/dist/cli/{chunk-beat36xx.js → chunk-dh8cwk36.js} +5 -5
- package/dist/cli/{chunk-beat36xx.js.map → chunk-dh8cwk36.js.map} +2 -2
- package/dist/cli/{chunk-1w8dp3qb.js → chunk-epjnccmv.js} +13 -13
- package/dist/cli/{chunk-ernrthtr.js → chunk-f2z5v128.js} +13 -13
- package/dist/cli/{chunk-zg2gtj10.js → chunk-fs23ddbb.js} +2 -2
- package/dist/cli/{chunk-7ez8ny0t.js → chunk-fxypxtvm.js} +2 -2
- package/dist/cli/{chunk-tzne8qfq.js → chunk-fz5wtpmh.js} +13 -13
- package/dist/cli/{chunk-b5aj94ah.js → chunk-hdpx1tax.js} +4 -4
- package/dist/cli/{chunk-d80hr03s.js → chunk-jwyddg7y.js} +9 -9
- package/dist/cli/{chunk-d80hr03s.js.map → chunk-jwyddg7y.js.map} +2 -2
- package/dist/cli/{chunk-fh5hj5jt.js → chunk-kdp5q7ke.js} +15 -15
- package/dist/cli/{chunk-6k8vp3ta.js → chunk-kpf8rrjc.js} +9 -9
- package/dist/cli/{chunk-6k8vp3ta.js.map → chunk-kpf8rrjc.js.map} +3 -3
- package/dist/cli/{chunk-5a2z0198.js → chunk-m3vmjgmq.js} +9 -9
- package/dist/cli/{chunk-5a2z0198.js.map → chunk-m3vmjgmq.js.map} +2 -2
- package/dist/cli/{chunk-bctazmbk.js → chunk-mb2919y2.js} +4 -4
- package/dist/cli/{chunk-79njf86q.js → chunk-q5163e60.js} +13 -13
- package/dist/cli/{chunk-xaz13gwg.js → chunk-qkqwkpte.js} +196 -208
- package/dist/cli/{chunk-xaz13gwg.js.map → chunk-qkqwkpte.js.map} +48 -48
- package/dist/cli/{chunk-sqn5t4q0.js → chunk-qs4q5p4e.js} +3 -3
- package/dist/cli/{chunk-bw22s759.js → chunk-qwsrynx5.js} +1 -1
- package/dist/cli/{chunk-z01ze5c1.js → chunk-s1p84fyh.js} +15 -15
- package/dist/cli/{chunk-pnnvybbk.js → chunk-s6jhgk0q.js} +5 -5
- package/dist/cli/{chunk-pnnvybbk.js.map → chunk-s6jhgk0q.js.map} +2 -2
- package/dist/cli/{chunk-f2972sbt.js → chunk-vtk4a6dg.js} +1 -1
- package/dist/cli/{chunk-z1f5arsg.js → chunk-wgm7m9qk.js} +21 -21
- package/dist/cli/{chunk-z1f5arsg.js.map → chunk-wgm7m9qk.js.map} +4 -4
- package/dist/cli/{chunk-bnbmcwfb.js → chunk-wm7js3j9.js} +5 -5
- package/dist/cli/{chunk-bnbmcwfb.js.map → chunk-wm7js3j9.js.map} +3 -3
- package/dist/cli/{chunk-d1tadaw7.js → chunk-yt5n7ppj.js} +3 -3
- package/dist/cli/{chunk-pat2zzwc.js → chunk-yw7dm696.js} +1 -1
- package/dist/cli/{chunk-pat2zzwc.js.map → chunk-yw7dm696.js.map} +1 -1
- package/dist/cli/{chunk-88cpgt6h.js → chunk-zxcczpyx.js} +1 -1
- package/dist/cli/{chunk-41za066z.js → chunk-zxh4d9vy.js} +4 -4
- package/dist/cli/index.js +17 -17
- package/dist/types/ai/agent-readability.d.ts +1 -1
- package/dist/types/ai/api/paths.d.ts +1 -1
- package/dist/types/ai/ask-context.d.ts +7 -7
- package/dist/types/ai/ask.d.ts +43 -43
- package/dist/types/ai/index.d.ts +3 -3
- package/dist/types/ai/openapi-components.d.ts +1 -1
- package/dist/types/ai/serializers.d.ts +1 -1
- package/dist/types/ai/visibility.d.ts +1 -1
- package/dist/types/core/config-input.d.ts +17 -17
- package/dist/types/core/config.d.ts +3 -3
- package/dist/types/core/data.d.ts +3 -3
- package/dist/types/core/i18n-ui.d.ts +6 -8
- package/dist/types/core/schema.d.ts +5 -5
- package/dist/types/core/unrecognized-keys.d.ts +1 -1
- package/dist/types/search/documents.d.ts +1 -1
- package/dist/types/search/orama-index.d.ts +1 -1
- package/docs/02-deployment.mdx +4 -4
- package/docs/03-upgrading.mdx +22 -9
- package/docs/04-migrating.mdx +4 -4
- package/docs/08-faq.mdx +3 -3
- package/docs/advanced/custom-pages.mdx +2 -2
- package/docs/advanced/skills.mdx +1 -1
- package/docs/cli/audit.mdx +3 -3
- package/docs/cli/doctor.mdx +3 -3
- package/docs/cli/evals.mdx +7 -7
- package/docs/cli/index.mdx +2 -2
- package/docs/cli/translate.mdx +8 -8
- package/docs/configuration/{ask-ai.mdx → assistant.mdx} +19 -19
- package/docs/configuration/customization.mdx +2 -2
- package/docs/configuration/index.mdx +2 -2
- package/docs/configuration/meta.ts +1 -1
- package/docs/configuration/search.mdx +1 -1
- package/docs/content/i18n.mdx +2 -2
- package/docs/content/islands.mdx +1 -1
- package/docs/discoverability/agent-discovery.mdx +1 -1
- package/docs/discoverability/index.mdx +1 -1
- package/docs/index.mdx +2 -2
- package/package.json +1 -1
- package/skills/blume/SKILL.md +5 -5
- package/skills/blume-migrate/SKILL.md +2 -2
- package/src/ai/agent-readability.ts +4 -4
- package/src/ai/api/paths.ts +1 -1
- package/src/ai/ask-context.ts +7 -7
- package/src/ai/ask-data.ts +2 -2
- package/src/ai/ask.ts +84 -71
- package/src/ai/cors.ts +3 -3
- package/src/ai/index.ts +16 -16
- package/src/ai/openapi-components.ts +1 -1
- package/src/ai/serializers.ts +1 -1
- package/src/ai/visibility.ts +1 -1
- package/src/astro/generate.ts +19 -18
- package/src/astro/module-types.ts +1 -1
- package/src/astro/runtime-deps.ts +6 -6
- package/src/astro/templates.ts +26 -26
- package/src/blume-modules.d.ts +2 -2
- package/src/cli/commands/audit.ts +1 -1
- package/src/cli/commands/doctor.ts +7 -5
- package/src/cli/commands/eval.ts +3 -3
- package/src/cli/commands/migrate.ts +2 -2
- package/src/cli/commands/translate.ts +3 -3
- package/src/cli/commands/upgrade.ts +2 -2
- package/src/cli/required-secrets.ts +3 -3
- package/src/components/copy-feedback.ts +1 -1
- package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
- package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
- package/src/components/islands/hooks.ts +14 -12
- package/src/components/layout/Header.astro +10 -10
- package/src/components/layout/PageLayout.astro +6 -6
- package/src/components/layout/Pagination.astro +7 -7
- package/src/components/layout/ReferenceLayout.astro +1 -1
- package/src/components/layout/RootLayout.astro +6 -6
- package/src/components/layout/Search.astro +13 -13
- package/src/components/layout/analytics-client.ts +1 -1
- package/src/components/layout/drawer-inert.ts +1 -1
- package/src/components/openapi/description.ts +2 -2
- package/src/core/code-fences.ts +1 -1
- package/src/core/config-input.ts +19 -19
- package/src/core/config.ts +3 -3
- package/src/core/data.ts +3 -3
- package/src/core/i18n-ui.ts +35 -9
- package/src/core/request-body.ts +1 -1
- package/src/core/schema.ts +25 -20
- package/src/core/server-features.ts +2 -2
- package/src/core/ui-packs/ar.ts +4 -5
- package/src/core/ui-packs/bg.ts +4 -5
- package/src/core/ui-packs/bn.ts +4 -5
- package/src/core/ui-packs/ca.ts +4 -5
- package/src/core/ui-packs/cs.ts +4 -5
- package/src/core/ui-packs/da.ts +4 -5
- package/src/core/ui-packs/de.ts +4 -5
- package/src/core/ui-packs/el.ts +4 -5
- package/src/core/ui-packs/es.ts +4 -5
- package/src/core/ui-packs/fa.ts +4 -5
- package/src/core/ui-packs/fi.ts +4 -5
- package/src/core/ui-packs/fr.ts +4 -5
- package/src/core/ui-packs/he.ts +4 -5
- package/src/core/ui-packs/hi.ts +4 -5
- package/src/core/ui-packs/hr.ts +4 -5
- package/src/core/ui-packs/hu.ts +4 -5
- package/src/core/ui-packs/id.ts +4 -5
- package/src/core/ui-packs/it.ts +4 -5
- package/src/core/ui-packs/ja.ts +4 -5
- package/src/core/ui-packs/ko.ts +4 -5
- package/src/core/ui-packs/nl.ts +4 -5
- package/src/core/ui-packs/no.ts +4 -5
- package/src/core/ui-packs/pl.ts +4 -5
- package/src/core/ui-packs/pt-br.ts +4 -5
- package/src/core/ui-packs/pt.ts +4 -5
- package/src/core/ui-packs/ro.ts +4 -5
- package/src/core/ui-packs/ru.ts +4 -5
- package/src/core/ui-packs/sk.ts +4 -5
- package/src/core/ui-packs/sr.ts +4 -5
- package/src/core/ui-packs/sv.ts +4 -5
- package/src/core/ui-packs/th.ts +4 -5
- package/src/core/ui-packs/tr.ts +4 -5
- package/src/core/ui-packs/uk.ts +4 -5
- package/src/core/ui-packs/vi.ts +4 -5
- package/src/core/ui-packs/zh-tw.ts +4 -5
- package/src/core/ui-packs/zh.ts +4 -5
- package/src/core/unrecognized-keys.ts +1 -1
- package/src/registry/eject.ts +19 -18
- package/src/search/documents.ts +2 -2
- package/src/search/orama-index.ts +1 -1
- package/src/translate/report.ts +1 -1
- package/src/upgrade/upgrade.ts +1 -1
- package/dist/cli/chunk-mnqj32sj.js.map +0 -12
- package/dist/cli/chunk-mwt1k8n7.js.map +0 -10
- /package/dist/cli/{chunk-f7t03s3g.js.map → chunk-27g6wdth.js.map} +0 -0
- /package/dist/cli/{chunk-by2290sx.js.map → chunk-5shv93fd.js.map} +0 -0
- /package/dist/cli/{chunk-nk3ts2xk.js.map → chunk-82bbrxdn.js.map} +0 -0
- /package/dist/cli/{chunk-zxccj738.js.map → chunk-ce574jw2.js.map} +0 -0
- /package/dist/cli/{chunk-y3e45rc8.js.map → chunk-ch6g3ar0.js.map} +0 -0
- /package/dist/cli/{chunk-1w8dp3qb.js.map → chunk-epjnccmv.js.map} +0 -0
- /package/dist/cli/{chunk-ernrthtr.js.map → chunk-f2z5v128.js.map} +0 -0
- /package/dist/cli/{chunk-zg2gtj10.js.map → chunk-fs23ddbb.js.map} +0 -0
- /package/dist/cli/{chunk-7ez8ny0t.js.map → chunk-fxypxtvm.js.map} +0 -0
- /package/dist/cli/{chunk-tzne8qfq.js.map → chunk-fz5wtpmh.js.map} +0 -0
- /package/dist/cli/{chunk-b5aj94ah.js.map → chunk-hdpx1tax.js.map} +0 -0
- /package/dist/cli/{chunk-fh5hj5jt.js.map → chunk-kdp5q7ke.js.map} +0 -0
- /package/dist/cli/{chunk-bctazmbk.js.map → chunk-mb2919y2.js.map} +0 -0
- /package/dist/cli/{chunk-79njf86q.js.map → chunk-q5163e60.js.map} +0 -0
- /package/dist/cli/{chunk-sqn5t4q0.js.map → chunk-qs4q5p4e.js.map} +0 -0
- /package/dist/cli/{chunk-bw22s759.js.map → chunk-qwsrynx5.js.map} +0 -0
- /package/dist/cli/{chunk-z01ze5c1.js.map → chunk-s1p84fyh.js.map} +0 -0
- /package/dist/cli/{chunk-f2972sbt.js.map → chunk-vtk4a6dg.js.map} +0 -0
- /package/dist/cli/{chunk-d1tadaw7.js.map → chunk-yt5n7ppj.js.map} +0 -0
- /package/dist/cli/{chunk-88cpgt6h.js.map → chunk-zxcczpyx.js.map} +0 -0
- /package/dist/cli/{chunk-41za066z.js.map → chunk-zxh4d9vy.js.map} +0 -0
|
@@ -54,7 +54,7 @@ import {
|
|
|
54
54
|
createModuleLoader,
|
|
55
55
|
resolveProjectContext,
|
|
56
56
|
loadConfig
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-qkqwkpte.js";
|
|
58
58
|
import {
|
|
59
59
|
getBlumeVersion,
|
|
60
60
|
BlumeError,
|
|
@@ -3769,4 +3769,4 @@ var scanProject = async (root, options = {}) => {
|
|
|
3769
3769
|
export { validateSearchPopularIcons, validateNavTargets, contentIndexable, buildManifest, isWithin, scanProject };
|
|
3770
3770
|
|
|
3771
3771
|
//# debugId=EBFFBF92D39DE54464756E2164756E21
|
|
3772
|
-
//# sourceMappingURL=chunk-
|
|
3772
|
+
//# sourceMappingURL=chunk-fs23ddbb.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
packageSrc,
|
|
8
8
|
registry,
|
|
9
9
|
findItem
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-zxcczpyx.js";
|
|
11
11
|
|
|
12
12
|
// src/cli/commands/add.ts
|
|
13
13
|
import { existsSync } from "node:fs";
|
|
@@ -96,4 +96,4 @@ export {
|
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
//# debugId=B640E77C94BA0A0364756E2164756E21
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-fxypxtvm.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
resolveRuntimeDir,
|
|
4
4
|
resolveProjectContext,
|
|
5
5
|
loadConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-qkqwkpte.js";
|
|
7
7
|
import"./chunk-jts8mvcz.js";
|
|
8
8
|
import {
|
|
9
9
|
commandMeta,
|
|
@@ -11,20 +11,20 @@ import {
|
|
|
11
11
|
} from "./index.js";
|
|
12
12
|
import {
|
|
13
13
|
readDevLock
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import"./chunk-
|
|
16
|
-
import"./chunk-
|
|
17
|
-
import"./chunk-
|
|
18
|
-
import"./chunk-
|
|
14
|
+
} from "./chunk-27g6wdth.js";
|
|
15
|
+
import"./chunk-wgm7m9qk.js";
|
|
16
|
+
import"./chunk-6crbhc3x.js";
|
|
17
|
+
import"./chunk-fs23ddbb.js";
|
|
18
|
+
import"./chunk-vtk4a6dg.js";
|
|
19
19
|
import"./chunk-jq5n4avg.js";
|
|
20
|
-
import"./chunk-
|
|
21
|
-
import"./chunk-
|
|
22
|
-
import"./chunk-
|
|
23
|
-
import"./chunk-
|
|
20
|
+
import"./chunk-2hn4b8z7.js";
|
|
21
|
+
import"./chunk-zxcczpyx.js";
|
|
22
|
+
import"./chunk-wm7js3j9.js";
|
|
23
|
+
import"./chunk-82bbrxdn.js";
|
|
24
24
|
import {
|
|
25
25
|
prepareProject
|
|
26
|
-
} from "./chunk-
|
|
27
|
-
import"./chunk-
|
|
26
|
+
} from "./chunk-zxh4d9vy.js";
|
|
27
|
+
import"./chunk-ah61y8py.js";
|
|
28
28
|
|
|
29
29
|
// src/cli/commands/sync.ts
|
|
30
30
|
import { rm } from "node:fs/promises";
|
|
@@ -69,4 +69,4 @@ export {
|
|
|
69
69
|
};
|
|
70
70
|
|
|
71
71
|
//# debugId=A65A4348F141B1A664756E2164756E21
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
72
|
+
//# sourceMappingURL=chunk-fz5wtpmh.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
loadConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-qkqwkpte.js";
|
|
5
5
|
import"./chunk-jts8mvcz.js";
|
|
6
6
|
import {
|
|
7
7
|
commandMeta,
|
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
reportDiagnostics
|
|
12
12
|
} from "./index.js";
|
|
13
13
|
import"./chunk-jq5n4avg.js";
|
|
14
|
-
import"./chunk-
|
|
14
|
+
import"./chunk-fs23ddbb.js";
|
|
15
15
|
import {
|
|
16
16
|
CutError,
|
|
17
17
|
cutVersion
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-qs4q5p4e.js";
|
|
19
19
|
|
|
20
20
|
// src/cli/commands/version.ts
|
|
21
21
|
import { defineCommand } from "citty";
|
|
@@ -88,4 +88,4 @@ export {
|
|
|
88
88
|
};
|
|
89
89
|
|
|
90
90
|
//# debugId=86F69482E9E3E55264756E2164756E21
|
|
91
|
-
//# sourceMappingURL=chunk-
|
|
91
|
+
//# sourceMappingURL=chunk-hdpx1tax.js.map
|
|
@@ -11,17 +11,17 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
AGENTS,
|
|
13
13
|
launchAgent
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-qwsrynx5.js";
|
|
15
15
|
import {
|
|
16
16
|
YAML_SCHEMA
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-qkqwkpte.js";
|
|
18
18
|
import"./chunk-jts8mvcz.js";
|
|
19
19
|
import {
|
|
20
20
|
scanProject
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-fs23ddbb.js";
|
|
22
22
|
import {
|
|
23
23
|
buildMcpData
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-6crbhc3x.js";
|
|
25
25
|
import {
|
|
26
26
|
seconds,
|
|
27
27
|
money,
|
|
@@ -500,7 +500,7 @@ var passFraction = (result) => {
|
|
|
500
500
|
};
|
|
501
501
|
var parseFlags = (args) => {
|
|
502
502
|
if (!isAgentKind(args.agent)) {
|
|
503
|
-
logger.error(`Invalid --agent "${args.agent}" (use
|
|
503
|
+
logger.error(`Invalid --agent "${args.agent}" (use codex | claude).`);
|
|
504
504
|
process.exit(1);
|
|
505
505
|
}
|
|
506
506
|
if (args.action !== undefined && args.action !== "init") {
|
|
@@ -557,8 +557,8 @@ var evalCommand = defineCommand({
|
|
|
557
557
|
type: "positional"
|
|
558
558
|
},
|
|
559
559
|
agent: {
|
|
560
|
-
default: "
|
|
561
|
-
description: "Agent CLI that reads and grades the docs:
|
|
560
|
+
default: "codex",
|
|
561
|
+
description: "Agent CLI that reads and grades the docs: codex | claude.",
|
|
562
562
|
type: "string"
|
|
563
563
|
},
|
|
564
564
|
file: {
|
|
@@ -673,5 +673,5 @@ export {
|
|
|
673
673
|
passFraction
|
|
674
674
|
};
|
|
675
675
|
|
|
676
|
-
//# debugId=
|
|
677
|
-
//# sourceMappingURL=chunk-
|
|
676
|
+
//# debugId=7175171294EC3BBC64756E2164756E21
|
|
677
|
+
//# sourceMappingURL=chunk-jwyddg7y.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli/commands/eval.ts", "../src/eval/prompts.ts", "../src/eval/report.ts", "../src/eval/run.ts", "../src/eval/schema.ts", "../src/eval/findings.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { existsSync } from \"node:fs\";\n\nimport { defineCommand } from \"citty\";\nimport { join } from \"pathe\";\n\nimport { AGENTS, launchAgent } from \"../../audit/agent.ts\";\nimport type { AgentKind } from \"../../audit/agent.ts\";\nimport { BlumeError } from \"../../core/diagnostics.ts\";\nimport { scanProject } from \"../../core/project-graph.ts\";\nimport { evalFixPrompt, initPrompt } from \"../../eval/prompts.ts\";\nimport {\n evalReportJson,\n fixLines,\n headerLine,\n questionDetails,\n questionLine,\n startLine,\n summaryLine,\n warningLines,\n writeEvalReport,\n} from \"../../eval/report.ts\";\nimport { runEval } from \"../../eval/run.ts\";\nimport type { EvalResult } from \"../../eval/run.ts\";\nimport { EvalsFileError, loadEvalsFile } from \"../../eval/schema.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { reportInternalError } from \"../internal-error.ts\";\nimport { flushStdout, logger, reportDiagnostics } from \"../log.ts\";\n\nconst DEFAULT_FILE = \"evals.yaml\";\n\n/** Reader wall-clock ceiling per question, in seconds. */\nconst DEFAULT_TIMEOUT_S = 180;\n\nconst isAgentKind = (value: string): value is AgentKind => value in AGENTS;\n\n/**\n * Launch the interactive agent CLI, turning a missing executable into the\n * install hint. Only `ENOENT` means \"not installed\" — any other spawn failure\n * (`EACCES`, `EMFILE`, …) must surface as itself.\n */\nconst notInstalled = (agent: AgentKind): never => {\n const cli = AGENTS[agent];\n logger.error(\n `${cli.name} (\\`${cli.bin}\\`) was not found on PATH. Install it with \\`${cli.install}\\`.`\n );\n return process.exit(1);\n};\n\nconst launchAgentCode = async (\n agent: AgentKind,\n prompt: string\n): Promise<number> => {\n try {\n return await launchAgent(AGENTS[agent].bin, prompt);\n } catch (error) {\n // SAFETY: only the `code` tag is inspected; a spawn failure throws an\n // ErrnoException, and any other thrown value fails the comparison and\n // rethrows unchanged.\n if ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n throw error;\n }\n return notInstalled(agent);\n }\n};\n\n/** The fraction of run (non-skipped) questions that passed. */\nexport const passFraction = (result: EvalResult): number => {\n const ran = result.results.length - result.counts.skip;\n return ran === 0 ? 1 : result.counts.pass / ran;\n};\n\ninterface EvalFlags {\n action?: string;\n agent: string;\n file: string;\n fix?: boolean;\n json?: boolean;\n threshold?: string;\n timeout?: string;\n}\n\n/** Validate the flag surface, exiting with a message on the first offense. */\nconst parseFlags = (args: EvalFlags) => {\n if (!isAgentKind(args.agent)) {\n logger.error(`Invalid --agent \"${args.agent}\" (use
|
|
5
|
+
"import { existsSync } from \"node:fs\";\n\nimport { defineCommand } from \"citty\";\nimport { join } from \"pathe\";\n\nimport { AGENTS, launchAgent } from \"../../audit/agent.ts\";\nimport type { AgentKind } from \"../../audit/agent.ts\";\nimport { BlumeError } from \"../../core/diagnostics.ts\";\nimport { scanProject } from \"../../core/project-graph.ts\";\nimport { evalFixPrompt, initPrompt } from \"../../eval/prompts.ts\";\nimport {\n evalReportJson,\n fixLines,\n headerLine,\n questionDetails,\n questionLine,\n startLine,\n summaryLine,\n warningLines,\n writeEvalReport,\n} from \"../../eval/report.ts\";\nimport { runEval } from \"../../eval/run.ts\";\nimport type { EvalResult } from \"../../eval/run.ts\";\nimport { EvalsFileError, loadEvalsFile } from \"../../eval/schema.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { reportInternalError } from \"../internal-error.ts\";\nimport { flushStdout, logger, reportDiagnostics } from \"../log.ts\";\n\nconst DEFAULT_FILE = \"evals.yaml\";\n\n/** Reader wall-clock ceiling per question, in seconds. */\nconst DEFAULT_TIMEOUT_S = 180;\n\nconst isAgentKind = (value: string): value is AgentKind => value in AGENTS;\n\n/**\n * Launch the interactive agent CLI, turning a missing executable into the\n * install hint. Only `ENOENT` means \"not installed\" — any other spawn failure\n * (`EACCES`, `EMFILE`, …) must surface as itself.\n */\nconst notInstalled = (agent: AgentKind): never => {\n const cli = AGENTS[agent];\n logger.error(\n `${cli.name} (\\`${cli.bin}\\`) was not found on PATH. Install it with \\`${cli.install}\\`.`\n );\n return process.exit(1);\n};\n\nconst launchAgentCode = async (\n agent: AgentKind,\n prompt: string\n): Promise<number> => {\n try {\n return await launchAgent(AGENTS[agent].bin, prompt);\n } catch (error) {\n // SAFETY: only the `code` tag is inspected; a spawn failure throws an\n // ErrnoException, and any other thrown value fails the comparison and\n // rethrows unchanged.\n if ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n throw error;\n }\n return notInstalled(agent);\n }\n};\n\n/** The fraction of run (non-skipped) questions that passed. */\nexport const passFraction = (result: EvalResult): number => {\n const ran = result.results.length - result.counts.skip;\n return ran === 0 ? 1 : result.counts.pass / ran;\n};\n\ninterface EvalFlags {\n action?: string;\n agent: string;\n file: string;\n fix?: boolean;\n json?: boolean;\n threshold?: string;\n timeout?: string;\n}\n\n/** Validate the flag surface, exiting with a message on the first offense. */\nconst parseFlags = (args: EvalFlags) => {\n if (!isAgentKind(args.agent)) {\n logger.error(`Invalid --agent \"${args.agent}\" (use codex | claude).`);\n process.exit(1);\n }\n if (args.action !== undefined && args.action !== \"init\") {\n logger.error(`Unknown action \"${args.action}\" (did you mean \"init\"?).`);\n process.exit(1);\n }\n if (args.json && args.fix) {\n logger.error(\"--json and --fix are mutually exclusive.\");\n process.exit(1);\n }\n const threshold = args.threshold === undefined ? 1 : Number(args.threshold);\n if (!Number.isFinite(threshold) || threshold < 0 || threshold > 1) {\n logger.error(`Invalid --threshold \"${args.threshold}\" (use 0..1).`);\n process.exit(1);\n }\n const timeoutS =\n args.timeout === undefined ? DEFAULT_TIMEOUT_S : Number(args.timeout);\n if (!Number.isInteger(timeoutS) || timeoutS <= 0) {\n logger.error(`Invalid --timeout \"${args.timeout}\" (whole seconds).`);\n process.exit(1);\n }\n return { agent: args.agent, threshold, timeoutS };\n};\n\n/** `blume eval --fix`: hand the failing report to the interactive agent. */\nconst runFixHandoff = async (\n agent: AgentKind,\n result: EvalResult,\n root: string,\n threshold: number\n): Promise<void> => {\n const count = result.counts.fail + result.counts.error;\n if (count === 0) {\n return;\n }\n const cli = AGENTS[agent];\n const report = await writeEvalReport(result, root, threshold);\n process.stderr.write(\n ` Handing ${count} failed question${count === 1 ? \"\" : \"s\"} to ${cli.name}…\\n\\n`\n );\n const code = await launchAgentCode(agent, evalFixPrompt(report));\n if (code !== 0) {\n process.exit(code);\n }\n};\n\n/** `blume eval init`: draft a starter evals file via the interactive agent. */\nconst runInit = async (agent: AgentKind, file: string): Promise<void> => {\n const path = join(process.cwd(), file);\n if (existsSync(path)) {\n logger.error(\n `${file} already exists — edit it directly, or pass --file to draft elsewhere.`\n );\n process.exit(1);\n }\n const code = await launchAgentCode(agent, initPrompt(file));\n if (code !== 0) {\n process.exit(code);\n }\n};\n\nexport const evalCommand = defineCommand({\n args: {\n action: {\n description: 'Optional action: \"init\" drafts a starter evals file.',\n required: false,\n type: \"positional\",\n },\n agent: {\n default: \"codex\",\n description: \"Agent CLI that reads and grades the docs: codex | claude.\",\n type: \"string\",\n },\n file: {\n default: DEFAULT_FILE,\n description: \"The evals file to run.\",\n type: \"string\",\n },\n fix: {\n description:\n \"After a failing run, hand the report to the agent to fix the docs interactively.\",\n type: \"boolean\",\n },\n json: {\n description: \"Emit the report as JSON on stdout (for CI/editors).\",\n type: \"boolean\",\n },\n threshold: {\n description:\n \"Minimum passing fraction (0..1) before the run exits non-zero. Defaults to 1.\",\n type: \"string\",\n },\n timeout: {\n description: `Reader time limit per question, in seconds. Defaults to ${DEFAULT_TIMEOUT_S}.`,\n type: \"string\",\n },\n verbose: {\n description: \"Include the reader's full answer under each failure.\",\n type: \"boolean\",\n },\n },\n meta: commandMeta.eval,\n async run({ args }) {\n const root = process.cwd();\n const { agent, threshold, timeoutS } = parseFlags(args);\n if (args.action === \"init\") {\n await runInit(agent, args.file);\n return;\n }\n\n let result: EvalResult;\n try {\n // `scanProject`, not `prepareProject`: the eval reads the content tree\n // and never regenerates the runtime, so it doesn't contend with a\n // running dev server. Same reasoning as `blume audit`.\n const project = await scanProject(root, { mode: \"build\" });\n const evalsPath = join(root, args.file);\n const { evals, raw } = await loadEvalsFile(evalsPath);\n\n process.stderr.write(`${headerLine(evals.questions.length, agent)}\\n\\n`);\n result = await runEval({\n agent,\n evals,\n evalsPath,\n onProgress: (event) => {\n // Straight to stderr, not `logger.info` — consola drops info-level\n // lines in test and CI environments.\n if (event.kind === \"question-start\") {\n process.stderr.write(\n `${startLine(event.id, event.index, event.total)}\\n`\n );\n return;\n }\n const lines = [\n questionLine(event.result),\n ...questionDetails(event.result, Boolean(args.verbose)),\n ];\n process.stderr.write(`${lines.join(\"\\n\")}\\n`);\n },\n project,\n rawEvals: raw,\n readerTimeoutMs: timeoutS * 1000,\n });\n } catch (error) {\n if (error instanceof EvalsFileError) {\n logger.error(error.message);\n process.exit(1);\n }\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], root);\n process.exit(1);\n }\n // SAFETY: only the `code` tag is inspected; a spawn failure throws an\n // ErrnoException, and any other thrown value fails the comparison and\n // falls through to the internal-error report.\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n notInstalled(agent);\n }\n reportInternalError(error);\n process.exit(1);\n }\n\n const tail = [\n \"\",\n ...warningLines(result, root),\n ...fixLines(result, root),\n \"\",\n ` ${summaryLine(result)}`,\n \"\",\n ];\n process.stderr.write(tail.join(\"\\n\"));\n\n const failed = passFraction(result) < threshold;\n\n if (args.fix) {\n // The gate is a CI concern; a handoff run succeeds when the agent\n // session does, not when the docs already passed.\n await runFixHandoff(agent, result, root, threshold);\n return;\n }\n\n if (args.json) {\n process.stdout.write(evalReportJson(result, root, threshold));\n if (failed) {\n // `process.exit` doesn't flush a piped stdout — without this the JSON\n // is truncated mid-write in exactly the CI setups that consume it.\n await flushStdout();\n process.exit(1);\n }\n return;\n }\n\n if (failed) {\n process.exit(1);\n }\n },\n});\n",
|
|
6
6
|
"import type { EvalQuestion } from \"./schema.ts\";\n\n/**\n * The reader's instructions. The agent is spawned in an empty directory with\n * its file/shell/web tools disabled, so the prompt's job is to direct it at\n * the MCP docs tools and forbid the one escape hatch that remains: answering\n * from prior knowledge of the product.\n */\nexport const readerPrompt = (question: EvalQuestion): string =>\n `You are evaluating whether a product's documentation can answer a user's question.\n\nAnswer the question below using ONLY the connected documentation tools (search_docs, get_page, list_pages, get_navigation). Rules:\n- Do not use prior knowledge about the product. Do not guess.\n- Do not read files, run commands, or access the network.\n- Search first, then read the most relevant pages with get_page.\n- If the documentation does not contain the answer, say exactly what information is missing instead of inventing one.\n\nQuestion: ${question.question}\n\nReply with a concise answer containing the specific facts the documentation provides. Plain text only.`;\n\n/** The judge's instructions: grade the answer against the expected facts. */\nexport const judgePrompt = (question: EvalQuestion, answer: string): string => {\n const facts = question.expected.map((fact) => `- ${fact}`).join(\"\\n\");\n return `You are grading an answer against expected facts. Do not use any tools.\n\nQuestion: ${question.question}\n\nExpected facts — each must be present in substance (paraphrase is fine, contradiction is not):\n${facts}\n\nAnswer to grade:\n\"\"\"\n${answer}\n\"\"\"\n\nAn answer that states the documentation lacks the information FAILS.\n\nReply with ONLY this JSON object on a single line, no markdown fences:\n{\"pass\": true|false, \"score\": 0.0-1.0, \"missing\": [\"expected facts absent or contradicted\"], \"notes\": \"one sentence\"}`;\n};\n\n/** The `--fix` handoff prompt: where the report is and the ground rules. */\nexport const evalFixPrompt = (reportPath: string): string =>\n `Fix the documentation gaps found by \\`blume eval\\` in this project.\n\nThe full report is at ${reportPath}. It is JSON: each entry in \\`eval.results\\` with status \"fail\" is one question the documentation could not answer. Each carries the \\`question\\`, the \\`expected\\` facts, the judge's \\`missing\\` facts, and the reader agent's \\`answer\\` (what the docs currently convey). The matching \\`diagnostics\\` entry names the source \\`file\\` of the page that should answer it.\n\nWork through every failed question:\n1. Read the page named in the finding (or choose the best page when none is named).\n2. Edit the documentation so it states the missing facts explicitly. Add prose, not filler; keep the page's voice.\n3. Never delete questions from the evals file or weaken expected facts.\n\nWhen you are done, run \\`blume eval\\` to verify, and repeat until every question passes.`;\n\n/** The `eval init` prompt: draft a starter evals file from the docs. */\nexport const initPrompt = (evalsPath: string): string =>\n `Draft a starter evals file for \\`blume eval\\` in this documentation project.\n\nRead the documentation source pages in this project and write ${evalsPath} with about 10 high-value questions a real user would ask — installation, configuration, deployment, and the project's headline features. For each question, list the expected facts a correct answer must state, grounded in what the documentation actually promises (never invent facts the docs don't state).\n\nThe file format is YAML:\n\nquestions:\n - id: kebab-case-slug\n question: One user question?\n expected:\n - a fact the answer must contain\n - another required fact\n routes:\n - /route/of/the/page/that/answers/it\n\nRules:\n- Every \\`expected\\` fact must be verifiable in the docs today.\n- Prefer questions whose answers live on one page; set \\`routes\\` to that page.\n- Keep ids unique and questions short.\n\nWhen you are done, print the file and suggest running \\`blume eval\\` to try it.`;\n",
|
|
7
7
|
"import { mkdtemp, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\n\nimport { colors } from \"consola/utils\";\nimport type { ColorFunction } from \"consola/utils\";\nimport { join, relative } from \"pathe\";\n\nimport { AGENTS } from \"../audit/agent.ts\";\nimport { duration, money, seconds } from \"../cli/report-format.ts\";\nimport { countBySeverity } from \"../core/diagnostics.ts\";\nimport type { EvalResult, QuestionResult, QuestionStatus } from \"./run.ts\";\n\nconst GLYPH = {\n error: \"!\",\n fail: \"✖\",\n pass: \"✔\",\n skip: \"⊘\",\n} satisfies Record<QuestionStatus, string>;\n\nconst STATUS_COLOR = {\n error: colors.yellow,\n fail: colors.red,\n pass: colors.green,\n skip: colors.dim,\n} satisfies Record<QuestionStatus, ColorFunction>;\n\n/** Longest id gets the room; everything shorter aligns to it. */\nconst ID_PAD = 28;\n\n/** One question's progress/report line: glyph, id, status, score, time, cost. */\nexport const questionLine = (result: QuestionResult): string => {\n const color = STATUS_COLOR[result.status];\n const glyph = color(GLYPH[result.status]);\n const id = result.id.padEnd(ID_PAD);\n if (result.status === \"skip\") {\n return ` ${glyph} ${id} ${colors.dim(\"skipped\")}`;\n }\n const score = result.score === undefined ? \"\" : result.score.toFixed(2);\n const cost = money(result.costUsd);\n const cells = [\n color(result.status),\n score,\n colors.dim(seconds(result.durationMs)),\n cost === \"\" ? \"\" : colors.dim(cost),\n ]\n .filter((cell) => cell !== \"\")\n .join(\" \");\n return ` ${glyph} ${id} ${cells}`;\n};\n\n/** Indented context under a question's line: missing facts, error detail. */\nexport const questionDetails = (\n result: QuestionResult,\n verbose: boolean\n): string[] => {\n const lines: string[] = [];\n if (result.status === \"fail\") {\n for (const fact of result.missing) {\n lines.push(` ${colors.dim(`missing: ${fact}`)}`);\n }\n }\n if (result.status === \"error\" && result.detail) {\n lines.push(` ${colors.dim(result.detail)}`);\n }\n if (verbose && result.answer && result.status !== \"pass\") {\n lines.push(\n ...result.answer\n .split(\"\\n\")\n .map((line) => ` ${colors.dim(`> ${line}`)}`)\n );\n }\n return lines;\n};\n\n/** The one-line totals: `9 passed · 2 failed · 1 skipped · 1m 42s · $0.71`. */\nexport const summaryLine = (result: EvalResult): string => {\n const { counts } = result;\n const parts = [\n `${counts.pass} passed`,\n counts.fail > 0 ? `${counts.fail} failed` : \"\",\n counts.error > 0 ? `${counts.error} errored` : \"\",\n counts.skip > 0 ? `${counts.skip} skipped` : \"\",\n duration(result.durationMs),\n money(result.costUsd),\n ].filter((part) => part !== \"\");\n return parts.join(\" · \");\n};\n\n/** The header line the command prints before the first question runs. */\nexport const headerLine = (total: number, agent: EvalResult[\"agent\"]): string =>\n `${colors.bold(\"blume eval\")} ${total} question(s) · ${AGENTS[agent].name}`;\n\n/** The dim announce line while a question's agents run. */\nexport const startLine = (id: string, index: number, total: number): string =>\n ` ${colors.dim(`▸ ${id} (${index + 1}/${total})`)}`;\n\n/**\n * `fix:` pointers for failed questions, naming the file that resolves each. A\n * question whose agent run errored gets a `run failed:` line pointing at the\n * question instead: the run never graded the docs, so there's no page to fix.\n */\nexport const fixLines = (result: EvalResult, root: string): string[] =>\n result.diagnostics\n .filter((diagnostic) => diagnostic.code !== \"BLUME_EVAL_ROUTE_UNKNOWN\")\n .map((finding) => {\n const site = finding.file\n ? `${relative(root, finding.file)}${finding.line ? `:${finding.line}` : \"\"}`\n : \"\";\n const label =\n finding.code === \"BLUME_EVAL_QUESTION_ERROR\"\n ? colors.red(\"run failed:\")\n : colors.cyan(\"fix:\");\n return ` ${label} ${site} ${colors.dim(finding.message)}`;\n });\n\n/** Dim warnings for route hints that no longer match a page. */\nexport const warningLines = (result: EvalResult, root: string): string[] =>\n result.diagnostics\n .filter((diagnostic) => diagnostic.code === \"BLUME_EVAL_ROUTE_UNKNOWN\")\n .map((finding) => {\n const site = finding.file\n ? ` ${relative(root, finding.file)}${finding.line ? `:${finding.line}` : \"\"}`\n : \"\";\n return ` ${colors.yellow(\"⚠\")}${site} ${colors.dim(finding.message)}`;\n });\n\n/** The human report, written to stderr by the command. */\nexport const formatEvalReport = (\n result: EvalResult,\n root: string,\n options: { verbose?: boolean } = {}\n): string => {\n const lines: string[] = [headerLine(result.results.length, result.agent), \"\"];\n\n for (const question of result.results) {\n lines.push(\n questionLine(question),\n ...questionDetails(question, Boolean(options.verbose))\n );\n }\n lines.push(\"\");\n\n // The finding tells the author which file fixes which failure.\n const failures = fixLines(result, root);\n lines.push(...failures);\n if (failures.length > 0) {\n lines.push(\"\");\n }\n\n lines.push(` ${summaryLine(result)}`, \"\");\n return lines.join(\"\\n\");\n};\n\n/**\n * The machine-readable report. The `diagnostics` + `summary` shape matches\n * `blume validate --json` and `blume audit --json` exactly — anything parsing\n * those keeps working — with the eval run's own results alongside.\n */\nexport const evalReportJson = (\n result: EvalResult,\n root: string,\n threshold: number\n): string => {\n const diagnostics = result.diagnostics.map((diagnostic) =>\n diagnostic.file\n ? { ...diagnostic, file: relative(root, diagnostic.file) }\n : diagnostic\n );\n return `${JSON.stringify(\n {\n diagnostics,\n eval: {\n agent: result.agent,\n costUsd: result.costUsd,\n counts: result.counts,\n durationMs: result.durationMs,\n results: result.results,\n threshold,\n },\n summary: countBySeverity(result.diagnostics),\n },\n null,\n 2\n )}\\n`;\n};\n\n/**\n * Write the full JSON report where a `--fix` agent can read it — a file\n * rather than inline prompt text, because a long run's answers would exceed\n * the platform's argv limit.\n */\nexport const writeEvalReport = async (\n result: EvalResult,\n root: string,\n threshold: number\n): Promise<string> => {\n const dir = await mkdtemp(join(tmpdir(), \"blume-eval-\"));\n const path = join(dir, \"report.json\");\n await writeFile(path, evalReportJson(result, root, threshold));\n return path;\n};\n",
|
|
8
8
|
"import { mkdir, mkdtemp, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\n\nimport { join } from \"pathe\";\n\nimport { buildMcpData } from \"../ai/mcp/data.ts\";\nimport { AGENTS } from \"../audit/agent.ts\";\nimport type { AgentKind } from \"../audit/agent.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\nimport {\n agentArgs,\n parseVerdict,\n readAgentOutput,\n runAgentHeadless,\n writeMcpConfig,\n} from \"./agents.ts\";\nimport type { HeadlessRunner } from \"./agents.ts\";\nimport { questionFinding, routeFindings } from \"./findings.ts\";\nimport { judgePrompt, readerPrompt } from \"./prompts.ts\";\nimport type { EvalQuestion, EvalsFile } from \"./schema.ts\";\n\n/** Reader runs search and read several pages; the judge grades one answer. */\nconst DEFAULT_READER_TIMEOUT_MS = 180_000;\nconst DEFAULT_JUDGE_TIMEOUT_MS = 60_000;\n\nexport type QuestionStatus = \"error\" | \"fail\" | \"pass\" | \"skip\";\n\n/** One question's outcome, carrying everything the reports print. */\nexport interface QuestionResult {\n answer?: string;\n costUsd?: number;\n /** Why the run errored (timeout, agent failure, unparseable verdict). */\n detail?: string;\n durationMs: number;\n expected: string[];\n id: string;\n missing: string[];\n notes?: string;\n question: string;\n routes: string[];\n score?: number;\n status: QuestionStatus;\n}\n\nexport interface EvalResult {\n agent: AgentKind;\n /** Total spend, when the agent CLI reports it (claude does, codex doesn't). */\n costUsd?: number;\n counts: Record<QuestionStatus, number>;\n diagnostics: Diagnostic[];\n durationMs: number;\n results: QuestionResult[];\n}\n\nexport type EvalProgress =\n | {\n kind: \"question-end\";\n index: number;\n result: QuestionResult;\n total: number;\n }\n | { kind: \"question-start\"; id: string; index: number; total: number };\n\nexport interface EvalRunOptions {\n agent: AgentKind;\n evals: EvalsFile;\n /** Where the evals file lives, for findings with no usable route hint. */\n evalsPath: string;\n judgeTimeoutMs?: number;\n onProgress?: (event: EvalProgress) => void;\n project: BlumeProject;\n /** The evals file's raw text, for line-anchoring findings. */\n rawEvals: string;\n readerTimeoutMs?: number;\n /** The spawn function — injectable so tests never launch a real agent. */\n run?: HeadlessRunner;\n}\n\ninterface QuestionContext {\n bin: string;\n dir: string;\n judgeTimeoutMs: number;\n kind: AgentKind;\n mcp: Awaited<ReturnType<typeof writeMcpConfig>>;\n readerTimeoutMs: number;\n run: HeadlessRunner;\n}\n\nconst errored = (\n question: EvalQuestion,\n detail: string,\n durationMs: number\n): QuestionResult => ({\n detail,\n durationMs,\n expected: question.expected,\n id: question.id,\n missing: [],\n question: question.question,\n routes: question.routes,\n status: \"error\",\n});\n\n/** Run one question: a fresh empty cwd, the reader, then the judge. */\nconst runQuestion = async (\n question: EvalQuestion,\n index: number,\n context: QuestionContext\n): Promise<QuestionResult> => {\n const started = performance.now();\n const elapsed = () => Math.round(performance.now() - started);\n\n // An empty working directory per invocation is the fresh-eyes guardrail:\n // even if a tool restriction slips, there is nothing here to read.\n const workDir = join(context.dir, `work-${index}`);\n await mkdir(workDir, { recursive: true });\n\n const answerPath = join(workDir, \"answer.txt\");\n const reader = await context.run(\n context.bin,\n agentArgs(context.kind, { lastMessagePath: answerPath, mcp: context.mcp }),\n {\n cwd: workDir,\n prompt: readerPrompt(question),\n timeoutMs: context.readerTimeoutMs,\n }\n );\n const answer = await readAgentOutput(context.kind, reader, answerPath);\n if (answer.isError) {\n return {\n ...errored(question, `reader ${answer.detail ?? \"failed\"}`, elapsed()),\n costUsd: answer.costUsd,\n };\n }\n\n const verdictPath = join(workDir, \"verdict.txt\");\n const judge = await context.run(\n context.bin,\n agentArgs(context.kind, { lastMessagePath: verdictPath }),\n {\n cwd: workDir,\n prompt: judgePrompt(question, answer.text),\n timeoutMs: context.judgeTimeoutMs,\n }\n );\n const graded = await readAgentOutput(context.kind, judge, verdictPath);\n const costUsd =\n answer.costUsd === undefined && graded.costUsd === undefined\n ? undefined\n : (answer.costUsd ?? 0) + (graded.costUsd ?? 0);\n if (graded.isError) {\n return {\n ...errored(question, `judge ${graded.detail ?? \"failed\"}`, elapsed()),\n answer: answer.text,\n costUsd,\n };\n }\n\n const verdict = parseVerdict(graded.text);\n if (!verdict) {\n return {\n ...errored(question, \"judge returned no parseable verdict\", elapsed()),\n answer: answer.text,\n costUsd,\n };\n }\n\n return {\n answer: answer.text,\n costUsd,\n durationMs: elapsed(),\n expected: question.expected,\n id: question.id,\n missing: verdict.missing,\n notes: verdict.notes || undefined,\n question: question.question,\n routes: question.routes,\n score: verdict.score,\n status: verdict.pass ? \"pass\" : \"fail\",\n };\n};\n\n/**\n * Run every question through the reader/judge pair, sequentially: each\n * question is already two agent sessions, and a serial run keeps progress\n * output ordered and cost attribution obvious.\n */\nexport const runEval = async (options: EvalRunOptions): Promise<EvalResult> => {\n const started = performance.now();\n const kind = options.agent;\n const run = options.run ?? runAgentHeadless;\n const anchor = { path: options.evalsPath, raw: options.rawEvals };\n\n const dir = await mkdtemp(join(tmpdir(), \"blume-eval-\"));\n const snapshotPath = join(dir, \"mcp-data.json\");\n await writeFile(\n snapshotPath,\n JSON.stringify(await buildMcpData(options.project))\n );\n const mcp = await writeMcpConfig(dir, snapshotPath);\n\n const context: QuestionContext = {\n bin: AGENTS[kind].bin,\n dir,\n judgeTimeoutMs: options.judgeTimeoutMs ?? DEFAULT_JUDGE_TIMEOUT_MS,\n kind,\n mcp,\n readerTimeoutMs: options.readerTimeoutMs ?? DEFAULT_READER_TIMEOUT_MS,\n run,\n };\n\n const diagnostics: Diagnostic[] = [];\n const results: QuestionResult[] = [];\n const { questions } = options.evals;\n\n for (const [index, question] of questions.entries()) {\n diagnostics.push(...routeFindings(question, options.project, anchor));\n\n if (question.skip) {\n results.push({\n durationMs: 0,\n expected: question.expected,\n id: question.id,\n missing: [],\n question: question.question,\n routes: question.routes,\n status: \"skip\",\n });\n continue;\n }\n\n options.onProgress?.({\n id: question.id,\n index,\n kind: \"question-start\",\n total: questions.length,\n });\n // Sequential by design: each question is already two agent sessions, and\n // a serial run keeps progress output ordered and cost attribution obvious.\n // oxlint-disable-next-line no-await-in-loop\n const result = await runQuestion(question, index, context);\n results.push(result);\n if (result.status === \"fail\" || result.status === \"error\") {\n diagnostics.push(\n questionFinding(\n question,\n {\n detail: result.detail,\n missing: result.missing,\n status: result.status,\n },\n options.project,\n anchor\n )\n );\n }\n options.onProgress?.({\n index,\n kind: \"question-end\",\n result,\n total: questions.length,\n });\n }\n\n const counts = {\n error: 0,\n fail: 0,\n pass: 0,\n skip: 0,\n } satisfies Record<QuestionStatus, number>;\n for (const result of results) {\n counts[result.status] += 1;\n }\n const costs = results.flatMap((result) =>\n result.costUsd === undefined ? [] : [result.costUsd]\n );\n\n return {\n agent: kind,\n costUsd:\n costs.length > 0\n ? costs.reduce((total, cost) => total + cost, 0)\n : undefined,\n counts,\n diagnostics,\n durationMs: Math.round(performance.now() - started),\n results,\n };\n};\n",
|
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
"import type { BlumeProject } from \"../core/project-graph.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\nimport { locateQuestion } from \"./schema.ts\";\nimport type { EvalQuestion } from \"./schema.ts\";\n\nconst DOCS_URL = \"https://useblume.dev/docs/cli/evals\";\n\n/** Where a finding should anchor when no route hint matches a page. */\nexport interface EvalsAnchor {\n path: string;\n raw: string;\n}\n\n/** The manifest route a hint names, if any. */\nconst hintedRoute = (question: EvalQuestion, project: BlumeProject) => {\n for (const hint of question.routes) {\n const route = project.manifest.routes.find(\n (candidate) => candidate.path === hint\n );\n if (route) {\n return route;\n }\n }\n};\n\n/**\n * Warnings for route hints that name no manifest route — docs move, and a\n * finding that silently anchors to the evals file instead of the page it\n * used to name is a debugging session; a warning is a one-line fix.\n */\nexport const routeFindings = (\n question: EvalQuestion,\n project: BlumeProject,\n anchor: EvalsAnchor\n): Diagnostic[] => {\n const known = new Set(project.manifest.routes.map((route) => route.path));\n return question.routes\n .filter((hint) => !known.has(hint))\n .map((hint) => ({\n code: \"BLUME_EVAL_ROUTE_UNKNOWN\",\n docsUrl: DOCS_URL,\n file: anchor.path,\n line: locateQuestion(anchor.raw, question.id),\n message: `Question \"${question.id}\" hints at route \"${hint}\", which matches no page.`,\n severity: \"warning\" as const,\n suggestion:\n \"Update the question's `routes` to the page's current route, or remove the hint.\",\n }));\n};\n\n/** What the finding needs to know about how the question went. */\nexport interface QuestionOutcome {\n /** Why the run errored, when it did. */\n detail?: string;\n /** The expected facts the judge found absent or contradicted. */\n missing: string[];\n status: \"error\" | \"fail\";\n}\n\n/**\n * The diagnostic for a failed or errored question. A failure is anchored to\n * the page that should have answered it (via the first matching route hint)\n * or, failing that, to the question's line in the evals file. An errored run —\n * the agent crashed, timed out, or answered in a shape Blume couldn't read —\n * says nothing about the docs, so it always points at the question instead of\n * a page there's nothing to fix in.\n */\nexport const questionFinding = (\n question: EvalQuestion,\n outcome: QuestionOutcome,\n project: BlumeProject,\n anchor: EvalsAnchor\n): Diagnostic => {\n const questionSite = {\n file: anchor.path,\n line: locateQuestion(anchor.raw, question.id),\n };\n\n if (outcome.status === \"error\") {\n return {\n code: \"BLUME_EVAL_QUESTION_ERROR\",\n docsUrl: DOCS_URL,\n message: `The agent run failed for \"${question.question}\"${\n outcome.detail ? ` — ${outcome.detail}` : \"\"\n }, so the docs weren't graded.`,\n severity: question.severity,\n suggestion:\n \"Rerun `blume eval`; if it persists, check the agent CLI installation and the failure detail.\",\n ...questionSite,\n };\n }\n\n const route = hintedRoute(question, project);\n const site = route\n ? { file: route.sourcePath, url: route.path }\n : questionSite;\n\n const missing =\n outcome.missing.length > 0\n ? ` — missing: ${outcome.missing.join(\"; \")}`\n : \"\";\n return {\n code: \"BLUME_EVAL_QUESTION_FAILED\",\n docsUrl: DOCS_URL,\n message: `Docs could not answer: \"${question.question}\"${missing}`,\n severity: question.severity,\n suggestion:\n \"State the missing facts on this page, then rerun `blume eval`.\",\n ...site,\n };\n};\n"
|
|
11
11
|
],
|
|
12
12
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAEA;AACA,iBAAS;;;ACKF,IAAM,eAAe,CAAC,aAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAQU,SAAS;AAAA;AAAA;AAKd,IAAM,cAAc,CAAC,UAAwB,WAA2B;AAAA,EAC7E,MAAM,QAAQ,SAAS,SAAS,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,KAAK;AAAA,CAAI;AAAA,EACpE,OAAO;AAAA;AAAA,YAEG,SAAS;AAAA;AAAA;AAAA,EAGnB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUK,IAAM,gBAAgB,CAAC,eAC5B;AAAA;AAAA,wBAEsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUjB,IAAM,aAAa,CAAC,cACzB;AAAA;AAAA,gEAE8D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC3DhE;AACA;AAEA;AAEA;AAOA,IAAM,QAAQ;AAAA,EACZ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,eAAe;AAAA,EACnB,OAAO,OAAO;AAAA,EACd,MAAM,OAAO;AAAA,EACb,MAAM,OAAO;AAAA,EACb,MAAM,OAAO;AACf;AAGA,IAAM,SAAS;AAGR,IAAM,eAAe,CAAC,WAAmC;AAAA,EAC9D,MAAM,QAAQ,aAAa,OAAO;AAAA,EAClC,MAAM,QAAQ,MAAM,MAAM,OAAO,OAAO;AAAA,EACxC,MAAM,KAAK,OAAO,GAAG,OAAO,MAAM;AAAA,EAClC,IAAI,OAAO,WAAW,QAAQ;AAAA,IAC5B,OAAO,KAAK,SAAS,MAAM,OAAO,IAAI,SAAS;AAAA,EACjD;AAAA,EACA,MAAM,QAAQ,OAAO,UAAU,YAAY,KAAK,OAAO,MAAM,QAAQ,CAAC;AAAA,EACtE,MAAM,OAAO,MAAM,OAAO,OAAO;AAAA,EACjC,MAAM,QAAQ;AAAA,IACZ,MAAM,OAAO,MAAM;AAAA,IACnB;AAAA,IACA,OAAO,IAAI,QAAQ,OAAO,UAAU,CAAC;AAAA,IACrC,SAAS,KAAK,KAAK,OAAO,IAAI,IAAI;AAAA,EACpC,EACG,OAAO,CAAC,SAAS,SAAS,EAAE,EAC5B,KAAK,IAAI;AAAA,EACZ,OAAO,KAAK,SAAS,MAAM;AAAA;AAItB,IAAM,kBAAkB,CAC7B,QACA,YACa;AAAA,EACb,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,OAAO,WAAW,QAAQ;AAAA,IAC5B,WAAW,QAAQ,OAAO,SAAS;AAAA,MACjC,MAAM,KAAK,SAAS,OAAO,IAAI,YAAY,MAAM,GAAG;AAAA,IACtD;AAAA,EACF;AAAA,EACA,IAAI,OAAO,WAAW,WAAW,OAAO,QAAQ;AAAA,IAC9C,MAAM,KAAK,SAAS,OAAO,IAAI,OAAO,MAAM,GAAG;AAAA,EACjD;AAAA,EACA,IAAI,WAAW,OAAO,UAAU,OAAO,WAAW,QAAQ;AAAA,IACxD,MAAM,KACJ,GAAG,OAAO,OACP,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,SAAS,SAAS,OAAO,IAAI,KAAK,MAAM,GAAG,CACrD;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAIF,IAAM,cAAc,CAAC,WAA+B;AAAA,EACzD,QAAQ,WAAW;AAAA,EACnB,MAAM,QAAQ;AAAA,IACZ,GAAG,OAAO;AAAA,IACV,OAAO,OAAO,IAAI,GAAG,OAAO,gBAAgB;AAAA,IAC5C,OAAO,QAAQ,IAAI,GAAG,OAAO,kBAAkB;AAAA,IAC/C,OAAO,OAAO,IAAI,GAAG,OAAO,iBAAiB;AAAA,IAC7C,SAAS,OAAO,UAAU;AAAA,IAC1B,MAAM,OAAO,OAAO;AAAA,EACtB,EAAE,OAAO,CAAC,SAAS,SAAS,EAAE;AAAA,EAC9B,OAAO,MAAM,KAAK,KAAK;AAAA;AAIlB,IAAM,aAAa,CAAC,OAAe,UACxC,GAAG,OAAO,KAAK,YAAY,MAAM,uBAAuB,OAAO,OAAO;AAGjE,IAAM,YAAY,CAAC,IAAY,OAAe,UACnD,KAAK,OAAO,IAAI,KAAK,OAAO,QAAQ,KAAK,QAAQ;AAO5C,IAAM,WAAW,CAAC,QAAoB,SAC3C,OAAO,YACJ,OAAO,CAAC,eAAe,WAAW,SAAS,0BAA0B,EACrE,IAAI,CAAC,YAAY;AAAA,EAChB,MAAM,OAAO,QAAQ,OACjB,GAAG,SAAS,MAAM,QAAQ,IAAI,IAAI,QAAQ,OAAO,IAAI,QAAQ,SAAS,OACtE;AAAA,EACJ,MAAM,QACJ,QAAQ,SAAS,8BACb,OAAO,IAAI,aAAa,IACxB,OAAO,KAAK,MAAM;AAAA,EACxB,OAAO,KAAK,SAAS,QAAQ,OAAO,IAAI,QAAQ,OAAO;AAAA,CACxD;AAGE,IAAM,eAAe,CAAC,QAAoB,SAC/C,OAAO,YACJ,OAAO,CAAC,eAAe,WAAW,SAAS,0BAA0B,EACrE,IAAI,CAAC,YAAY;AAAA,EAChB,MAAM,OAAO,QAAQ,OACjB,IAAI,SAAS,MAAM,QAAQ,IAAI,IAAI,QAAQ,OAAO,IAAI,QAAQ,SAAS,OACvE;AAAA,EACJ,OAAO,KAAK,OAAO,OAAO,GAAG,IAAI,QAAQ,OAAO,IAAI,QAAQ,OAAO;AAAA,CACpE;AAkCE,IAAM,iBAAiB,CAC5B,QACA,MACA,cACW;AAAA,EACX,MAAM,cAAc,OAAO,YAAY,IAAI,CAAC,eAC1C,WAAW,OACP,KAAK,YAAY,MAAM,SAAS,MAAM,WAAW,IAAI,EAAE,IACvD,UACN;AAAA,EACA,OAAO,GAAG,KAAK,UACb;AAAA,IACE;AAAA,IACA,MAAM;AAAA,MACJ,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,IACA,SAAS,gBAAgB,OAAO,WAAW;AAAA,EAC7C,GACA,MACA,CACF;AAAA;AAAA;AAQK,IAAM,kBAAkB,OAC7B,QACA,MACA,cACoB;AAAA,EACpB,MAAM,MAAM,MAAM,QAAQ,KAAK,OAAO,GAAG,aAAa,CAAC;AAAA,EACvD,MAAM,OAAO,KAAK,KAAK,aAAa;AAAA,EACpC,MAAM,UAAU,MAAM,eAAe,QAAQ,MAAM,SAAS,CAAC;AAAA,EAC7D,OAAO;AAAA;;;ACvMT,2BAAgB,uBAAS;AACzB,mBAAS;AAET,iBAAS;;;ACHT;AAEA;AACA;AAKA,IAAM,aAAa;AAEnB,IAAM,iBAAiB,EAAE,aAAa;AAAA,EACpC,UAAU,EACP,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EACvB,IAAI,GAAG,sCAAsC;AAAA,EAChD,IAAI,EACD,OAAO,EACP,MAAM,YAAY,iDAAiD;AAAA,EACtE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,QAAQ,EACL,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EACvC,QAAQ,CAAC,CAAC,EACV,UAAU,CAAC,UAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAE;AAAA,EAChE,UAAU,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC,EAAE,QAAQ,OAAO;AAAA,EACtD,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACjC,CAAC;AAKD,IAAM,aAAa,EAAE,aAAa;AAAA,EAChC,WAAW,EAAE,MAAM,cAAc,EAAE,IAAI,CAAC;AAAA,EACxC,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;AACjC,CAAC;AAQM,IAAM,kBAAkB,WAAW,YAAY,CAAC,OAAO,YAAY;AAAA,EACxE,MAAM,OAAO,IAAI;AAAA,EACjB,WAAW,YAAY,MAAM,WAAW;AAAA,IACtC,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG;AAAA,MACzB,QAAQ,SAAS;AAAA,QACf,MAAM,EAAE,aAAa;AAAA,QACrB,SAAS,0BAA0B,SAAS;AAAA,QAC5C,MAAM,CAAC,WAAW;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,IACA,KAAK,IAAI,SAAS,EAAE;AAAA,EACtB;AAAA,CACD;AAAA;AAKM,MAAM,uBAAuB,MAAM;AAAA,EAC/B;AAAA,EAET,WAAW,CAAC,MAAc,SAAiB;AAAA,IACzC,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAEA,IAAM,iBAAiB,CAAC,UACtB,MAAM,OACH,IAAI,CAAC,UAAU;AAAA,EACd,MAAM,KAAK,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,KAAK,GAAG,MAAM;AAAA,EACnE,OAAO,GAAG,MAAM,UAAU;AAAA,CAC3B,EACA,KAAK,IAAI;AAMP,IAAM,gBAAgB,OAC3B,SAC+C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,MAAM,SAAS,MAAM,OAAO;AAAA,IAClC,MAAM;AAAA,IACN,MAAM,IAAI,eACR,MACA,0BAA0B,6CAC5B;AAAA;AAAA,EAGF,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,KAAK,KAAK,EAAE,QAAQ,YAAY,CAAC;AAAA,IAC1C,OAAO,OAAO;AAAA,IACd,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACpE,MAAM,IAAI,eAAe,MAAM,mBAAmB,SAAS,QAAQ;AAAA;AAAA,EAIrE,MAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,EAAE,WAAW,OAAO,IAAI;AAAA,EAClE,MAAM,SAAS,gBAAgB,UAAU,SAAS;AAAA,EAClD,IAAI,CAAC,OAAO,SAAS;AAAA,IACnB,MAAM,IAAI,eACR,MACA,yBAAyB,SAAS,eAAe,OAAO,KAAK,GAC/D;AAAA,EACF;AAAA,EACA,OAAO,EAAE,OAAO,OAAO,MAAM,IAAI;AAAA;AAO5B,IAAM,iBAAiB,CAAC,KAAa,OAAmC;AAAA,EAC7E,MAAM,UAAU,IAAI,OAAO,0BAA0B,gBAAgB,GAAG;AAAA,EACxE,MAAM,QAAQ,IAAI,MAAM;AAAA,CAAI;AAAA,EAC5B,YAAY,OAAO,SAAS,MAAM,QAAQ,GAAG;AAAA,IAC3C,IAAI,QAAQ,KAAK,IAAI,GAAG;AAAA,MACtB,OAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EACA;AAAA;;;ACvHF,IAAM,WAAW;AASjB,IAAM,cAAc,CAAC,UAAwB,YAA0B;AAAA,EACrE,WAAW,QAAQ,SAAS,QAAQ;AAAA,IAClC,MAAM,QAAQ,QAAQ,SAAS,OAAO,KACpC,CAAC,cAAc,UAAU,SAAS,IACpC;AAAA,IACA,IAAI,OAAO;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAQK,IAAM,gBAAgB,CAC3B,UACA,SACA,WACiB;AAAA,EACjB,MAAM,QAAQ,IAAI,IAAI,QAAQ,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAAA,EACxE,OAAO,SAAS,OACb,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,EACjC,IAAI,CAAC,UAAU;AAAA,IACd,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,OAAO;AAAA,IACb,MAAM,eAAe,OAAO,KAAK,SAAS,EAAE;AAAA,IAC5C,SAAS,aAAa,SAAS,uBAAuB;AAAA,IACtD,UAAU;AAAA,IACV,YACE;AAAA,EACJ,EAAE;AAAA;AAoBC,IAAM,kBAAkB,CAC7B,UACA,SACA,SACA,WACe;AAAA,EACf,MAAM,eAAe;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,MAAM,eAAe,OAAO,KAAK,SAAS,EAAE;AAAA,EAC9C;AAAA,EAEA,IAAI,QAAQ,WAAW,SAAS;AAAA,IAC9B,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,6BAA6B,SAAS,YAC7C,QAAQ,SAAS,MAAM,QAAQ,WAAW;AAAA,MAE5C,UAAU,SAAS;AAAA,MACnB,YACE;AAAA,SACC;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,YAAY,UAAU,OAAO;AAAA,EAC3C,MAAM,OAAO,QACT,EAAE,MAAM,MAAM,YAAY,KAAK,MAAM,KAAK,IAC1C;AAAA,EAEJ,MAAM,UACJ,QAAQ,QAAQ,SAAS,IACrB,eAAe,QAAQ,QAAQ,KAAK,IAAI,MACxC;AAAA,EACN,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,2BAA2B,SAAS,YAAY;AAAA,IACzD,UAAU,SAAS;AAAA,IACnB,YACE;AAAA,OACC;AAAA,EACL;AAAA;;;AFtFF,IAAM,4BAA4B;AAClC,IAAM,2BAA2B;AAiEjC,IAAM,UAAU,CACd,UACA,QACA,gBACoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,UAAU,SAAS;AAAA,EACnB,IAAI,SAAS;AAAA,EACb,SAAS,CAAC;AAAA,EACV,UAAU,SAAS;AAAA,EACnB,QAAQ,SAAS;AAAA,EACjB,QAAQ;AACV;AAGA,IAAM,cAAc,OAClB,UACA,OACA,YAC4B;AAAA,EAC5B,MAAM,UAAU,YAAY,IAAI;AAAA,EAChC,MAAM,UAAU,MAAM,KAAK,MAAM,YAAY,IAAI,IAAI,OAAO;AAAA,EAI5D,MAAM,UAAU,MAAK,QAAQ,KAAK,QAAQ,OAAO;AAAA,EACjD,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAExC,MAAM,aAAa,MAAK,SAAS,YAAY;AAAA,EAC7C,MAAM,SAAS,MAAM,QAAQ,IAC3B,QAAQ,KACR,UAAU,QAAQ,MAAM,EAAE,iBAAiB,YAAY,KAAK,QAAQ,IAAI,CAAC,GACzE;AAAA,IACE,KAAK;AAAA,IACL,QAAQ,aAAa,QAAQ;AAAA,IAC7B,WAAW,QAAQ;AAAA,EACrB,CACF;AAAA,EACA,MAAM,SAAS,MAAM,gBAAgB,QAAQ,MAAM,QAAQ,UAAU;AAAA,EACrE,IAAI,OAAO,SAAS;AAAA,IAClB,OAAO;AAAA,SACF,QAAQ,UAAU,UAAU,OAAO,UAAU,YAAY,QAAQ,CAAC;AAAA,MACrE,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,MAAK,SAAS,aAAa;AAAA,EAC/C,MAAM,QAAQ,MAAM,QAAQ,IAC1B,QAAQ,KACR,UAAU,QAAQ,MAAM,EAAE,iBAAiB,YAAY,CAAC,GACxD;AAAA,IACE,KAAK;AAAA,IACL,QAAQ,YAAY,UAAU,OAAO,IAAI;AAAA,IACzC,WAAW,QAAQ;AAAA,EACrB,CACF;AAAA,EACA,MAAM,SAAS,MAAM,gBAAgB,QAAQ,MAAM,OAAO,WAAW;AAAA,EACrE,MAAM,UACJ,OAAO,YAAY,aAAa,OAAO,YAAY,YAC/C,aACC,OAAO,WAAW,MAAM,OAAO,WAAW;AAAA,EACjD,IAAI,OAAO,SAAS;AAAA,IAClB,OAAO;AAAA,SACF,QAAQ,UAAU,SAAS,OAAO,UAAU,YAAY,QAAQ,CAAC;AAAA,MACpE,QAAQ,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,aAAa,OAAO,IAAI;AAAA,EACxC,IAAI,CAAC,SAAS;AAAA,IACZ,OAAO;AAAA,SACF,QAAQ,UAAU,uCAAuC,QAAQ,CAAC;AAAA,MACrE,QAAQ,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,UAAU,SAAS;AAAA,IACnB,IAAI,SAAS;AAAA,IACb,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ,SAAS;AAAA,IACxB,UAAU,SAAS;AAAA,IACnB,QAAQ,SAAS;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ,OAAO,SAAS;AAAA,EAClC;AAAA;AAQK,IAAM,UAAU,OAAO,YAAiD;AAAA,EAC7E,MAAM,UAAU,YAAY,IAAI;AAAA,EAChC,MAAM,OAAO,QAAQ;AAAA,EACrB,MAAM,MAAM,QAAQ,OAAO;AAAA,EAC3B,MAAM,SAAS,EAAE,MAAM,QAAQ,WAAW,KAAK,QAAQ,SAAS;AAAA,EAEhE,MAAM,MAAM,MAAM,SAAQ,MAAK,QAAO,GAAG,aAAa,CAAC;AAAA,EACvD,MAAM,eAAe,MAAK,KAAK,eAAe;AAAA,EAC9C,MAAM,WACJ,cACA,KAAK,UAAU,MAAM,aAAa,QAAQ,OAAO,CAAC,CACpD;AAAA,EACA,MAAM,MAAM,MAAM,eAAe,KAAK,YAAY;AAAA,EAElD,MAAM,UAA2B;AAAA,IAC/B,KAAK,OAAO,MAAM;AAAA,IAClB;AAAA,IACA,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,iBAAiB,QAAQ,mBAAmB;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,cAA4B,CAAC;AAAA,EACnC,MAAM,UAA4B,CAAC;AAAA,EACnC,QAAQ,cAAc,QAAQ;AAAA,EAE9B,YAAY,OAAO,aAAa,UAAU,QAAQ,GAAG;AAAA,IACnD,YAAY,KAAK,GAAG,cAAc,UAAU,QAAQ,SAAS,MAAM,CAAC;AAAA,IAEpE,IAAI,SAAS,MAAM;AAAA,MACjB,QAAQ,KAAK;AAAA,QACX,YAAY;AAAA,QACZ,UAAU,SAAS;AAAA,QACnB,IAAI,SAAS;AAAA,QACb,SAAS,CAAC;AAAA,QACV,UAAU,SAAS;AAAA,QACnB,QAAQ,SAAS;AAAA,QACjB,QAAQ;AAAA,MACV,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,QAAQ,aAAa;AAAA,MACnB,IAAI,SAAS;AAAA,MACb;AAAA,MACA,MAAM;AAAA,MACN,OAAO,UAAU;AAAA,IACnB,CAAC;AAAA,IAID,MAAM,SAAS,MAAM,YAAY,UAAU,OAAO,OAAO;AAAA,IACzD,QAAQ,KAAK,MAAM;AAAA,IACnB,IAAI,OAAO,WAAW,UAAU,OAAO,WAAW,SAAS;AAAA,MACzD,YAAY,KACV,gBACE,UACA;AAAA,QACE,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO;AAAA,QAChB,QAAQ,OAAO;AAAA,MACjB,GACA,QAAQ,SACR,MACF,CACF;AAAA,IACF;AAAA,IACA,QAAQ,aAAa;AAAA,MACnB;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,OAAO,UAAU;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,WAAW,UAAU,SAAS;AAAA,IAC5B,OAAO,OAAO,WAAW;AAAA,EAC3B;AAAA,EACA,MAAM,QAAQ,QAAQ,QAAQ,CAAC,WAC7B,OAAO,YAAY,YAAY,CAAC,IAAI,CAAC,OAAO,OAAO,CACrD;AAAA,EAEA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SACE,MAAM,SAAS,IACX,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,MAAM,CAAC,IAC7C;AAAA,IACN;AAAA,IACA;AAAA,IACA,YAAY,KAAK,MAAM,YAAY,IAAI,IAAI,OAAO;AAAA,IAClD;AAAA,EACF;AAAA;;;AHpQF,IAAM,eAAe;AAGrB,IAAM,oBAAoB;AAE1B,IAAM,cAAc,CAAC,WAAsC,SAAS;AAOpE,IAAM,eAAe,CAAC,UAA4B;AAAA,EAChD,MAAM,MAAM,OAAO;AAAA,EACnB,OAAO,MACL,GAAG,IAAI,WAAW,IAAI,mDAAmD,IAAI,YAC/E;AAAA,EACA,OAAO,QAAQ,KAAK,CAAC;AAAA;AAGvB,IAAM,kBAAkB,OACtB,OACA,WACoB;AAAA,EACpB,IAAI;AAAA,IACF,OAAO,MAAM,YAAY,OAAO,OAAO,KAAK,MAAM;AAAA,IAClD,OAAO,OAAO;AAAA,IAId,IAAK,OAAiC,SAAS,UAAU;AAAA,MACvD,MAAM;AAAA,IACR;AAAA,IACA,OAAO,aAAa,KAAK;AAAA;AAAA;AAKtB,IAAM,eAAe,CAAC,WAA+B;AAAA,EAC1D,MAAM,MAAM,OAAO,QAAQ,SAAS,OAAO,OAAO;AAAA,EAClD,OAAO,QAAQ,IAAI,IAAI,OAAO,OAAO,OAAO;AAAA;AAc9C,IAAM,aAAa,CAAC,SAAoB;AAAA,EACtC,IAAI,CAAC,YAAY,KAAK,KAAK,GAAG;AAAA,IAC5B,OAAO,MAAM,oBAAoB,KAAK,8BAA8B;AAAA,IACpE,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EACA,IAAI,KAAK,WAAW,aAAa,KAAK,WAAW,QAAQ;AAAA,IACvD,OAAO,MAAM,mBAAmB,KAAK,iCAAiC;AAAA,IACtE,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EACA,IAAI,KAAK,QAAQ,KAAK,KAAK;AAAA,IACzB,OAAO,MAAM,0CAA0C;AAAA,IACvD,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EACA,MAAM,YAAY,KAAK,cAAc,YAAY,IAAI,OAAO,KAAK,SAAS;AAAA,EAC1E,IAAI,CAAC,OAAO,SAAS,SAAS,KAAK,YAAY,KAAK,YAAY,GAAG;AAAA,IACjE,OAAO,MAAM,wBAAwB,KAAK,wBAAwB;AAAA,IAClE,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EACA,MAAM,WACJ,KAAK,YAAY,YAAY,oBAAoB,OAAO,KAAK,OAAO;AAAA,EACtE,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,YAAY,GAAG;AAAA,IAChD,OAAO,MAAM,sBAAsB,KAAK,2BAA2B;AAAA,IACnE,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EACA,OAAO,EAAE,OAAO,KAAK,OAAO,WAAW,SAAS;AAAA;AAIlD,IAAM,gBAAgB,OACpB,OACA,QACA,MACA,cACkB;AAAA,EAClB,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,EACjD,IAAI,UAAU,GAAG;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM,MAAM,OAAO;AAAA,EACnB,MAAM,SAAS,MAAM,gBAAgB,QAAQ,MAAM,SAAS;AAAA,EAC5D,QAAQ,OAAO,MACb,aAAa,wBAAwB,UAAU,IAAI,KAAK,UAAU,IAAI;AAAA;AAAA,CACxE;AAAA,EACA,MAAM,OAAO,MAAM,gBAAgB,OAAO,cAAc,MAAM,CAAC;AAAA,EAC/D,IAAI,SAAS,GAAG;AAAA,IACd,QAAQ,KAAK,IAAI;AAAA,EACnB;AAAA;AAIF,IAAM,UAAU,OAAO,OAAkB,SAAgC;AAAA,EACvE,MAAM,OAAO,MAAK,QAAQ,IAAI,GAAG,IAAI;AAAA,EACrC,IAAI,WAAW,IAAI,GAAG;AAAA,IACpB,OAAO,MACL,GAAG,4EACL;AAAA,IACA,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EACA,MAAM,OAAO,MAAM,gBAAgB,OAAO,WAAW,IAAI,CAAC;AAAA,EAC1D,IAAI,SAAS,GAAG;AAAA,IACd,QAAQ,KAAK,IAAI;AAAA,EACnB;AAAA;AAGK,IAAM,cAAc,cAAc;AAAA,EACvC,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM;AAAA,IACR;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACH,aACE;AAAA,MACF,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,WAAW;AAAA,MACT,aACE;AAAA,MACF,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,aAAa,2DAA2D;AAAA,MACxE,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,YAAY;AAAA,OACZ,IAAG,GAAG,QAAQ;AAAA,IAClB,MAAM,OAAO,QAAQ,IAAI;AAAA,IACzB,QAAQ,OAAO,WAAW,aAAa,WAAW,IAAI;AAAA,IACtD,IAAI,KAAK,WAAW,QAAQ;AAAA,MAC1B,MAAM,QAAQ,OAAO,KAAK,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MAIF,MAAM,UAAU,MAAM,YAAY,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,MACzD,MAAM,YAAY,MAAK,MAAM,KAAK,IAAI;AAAA,MACtC,QAAQ,OAAO,QAAQ,MAAM,cAAc,SAAS;AAAA,MAEpD,QAAQ,OAAO,MAAM,GAAG,WAAW,MAAM,UAAU,QAAQ,KAAK;AAAA;AAAA,CAAO;AAAA,MACvE,SAAS,MAAM,QAAQ;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,CAAC,UAAU;AAAA,UAGrB,IAAI,MAAM,SAAS,kBAAkB;AAAA,YACnC,QAAQ,OAAO,MACb,GAAG,UAAU,MAAM,IAAI,MAAM,OAAO,MAAM,KAAK;AAAA,CACjD;AAAA,YACA;AAAA,UACF;AAAA,UACA,MAAM,QAAQ;AAAA,YACZ,aAAa,MAAM,MAAM;AAAA,YACzB,GAAG,gBAAgB,MAAM,QAAQ,QAAQ,KAAK,OAAO,CAAC;AAAA,UACxD;AAAA,UACA,QAAQ,OAAO,MAAM,GAAG,MAAM,KAAK;AAAA,CAAI;AAAA,CAAK;AAAA;AAAA,QAE9C;AAAA,QACA,UAAU;AAAA,QACV,iBAAiB,WAAW;AAAA,MAC9B,CAAC;AAAA,MACD,OAAO,OAAO;AAAA,MACd,IAAI,iBAAiB,gBAAgB;AAAA,QACnC,OAAO,MAAM,MAAM,OAAO;AAAA,QAC1B,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MACA,IAAI,iBAAiB,YAAY;AAAA,QAC/B,kBAAkB,CAAC,MAAM,UAAU,GAAG,IAAI;AAAA,QAC1C,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MAIA,IAAK,OAAiC,SAAS,UAAU;AAAA,QACvD,aAAa,KAAK;AAAA,MACpB;AAAA,MACA,oBAAoB,KAAK;AAAA,MACzB,QAAQ,KAAK,CAAC;AAAA;AAAA,IAGhB,MAAM,OAAO;AAAA,MACX;AAAA,MACA,GAAG,aAAa,QAAQ,IAAI;AAAA,MAC5B,GAAG,SAAS,QAAQ,IAAI;AAAA,MACxB;AAAA,MACA,KAAK,YAAY,MAAM;AAAA,MACvB;AAAA,IACF;AAAA,IACA,QAAQ,OAAO,MAAM,KAAK,KAAK;AAAA,CAAI,CAAC;AAAA,IAEpC,MAAM,SAAS,aAAa,MAAM,IAAI;AAAA,IAEtC,IAAI,KAAK,KAAK;AAAA,MAGZ,MAAM,cAAc,OAAO,QAAQ,MAAM,SAAS;AAAA,MAClD;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,MAAM;AAAA,MACb,QAAQ,OAAO,MAAM,eAAe,QAAQ,MAAM,SAAS,CAAC;AAAA,MAC5D,IAAI,QAAQ;AAAA,QAGV,MAAM,YAAY;AAAA,QAClB,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ;AAAA,MACV,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA;AAEJ,CAAC;",
|
|
13
|
-
"debugId": "
|
|
13
|
+
"debugId": "7175171294EC3BBC64756E2164756E21",
|
|
14
14
|
"names": []
|
|
15
15
|
}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import"./chunk-jts8mvcz.js";
|
|
3
3
|
import {
|
|
4
4
|
resolveRuntimeDir
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-qkqwkpte.js";
|
|
6
6
|
import {
|
|
7
7
|
refreshBlumeContent,
|
|
8
8
|
showBlumeErrorOverlay,
|
|
9
9
|
generateRuntime
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-wgm7m9qk.js";
|
|
11
11
|
import {
|
|
12
12
|
commandMeta,
|
|
13
13
|
normalizeHost,
|
|
@@ -15,32 +15,32 @@ import {
|
|
|
15
15
|
logger,
|
|
16
16
|
reportDiagnostics
|
|
17
17
|
} from "./index.js";
|
|
18
|
-
import"./chunk-
|
|
18
|
+
import"./chunk-6crbhc3x.js";
|
|
19
19
|
import {
|
|
20
20
|
scanProject
|
|
21
|
-
} from "./chunk-
|
|
22
|
-
import"./chunk-
|
|
21
|
+
} from "./chunk-fs23ddbb.js";
|
|
22
|
+
import"./chunk-vtk4a6dg.js";
|
|
23
23
|
import"./chunk-jq5n4avg.js";
|
|
24
|
-
import"./chunk-
|
|
25
|
-
import"./chunk-
|
|
26
|
-
import"./chunk-
|
|
27
|
-
import"./chunk-
|
|
24
|
+
import"./chunk-2hn4b8z7.js";
|
|
25
|
+
import"./chunk-zxcczpyx.js";
|
|
26
|
+
import"./chunk-wm7js3j9.js";
|
|
27
|
+
import"./chunk-82bbrxdn.js";
|
|
28
28
|
import {
|
|
29
29
|
DevLockHeldError,
|
|
30
30
|
acquireDevLock,
|
|
31
31
|
updateDevLockPort,
|
|
32
32
|
describeDevLock
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-27g6wdth.js";
|
|
34
34
|
import {
|
|
35
35
|
refuseIfEjected
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-yt5n7ppj.js";
|
|
37
37
|
import {
|
|
38
38
|
prepareProject
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-zxh4d9vy.js";
|
|
40
40
|
import {
|
|
41
41
|
parsePort
|
|
42
|
-
} from "./chunk-
|
|
43
|
-
import"./chunk-
|
|
42
|
+
} from "./chunk-ce574jw2.js";
|
|
43
|
+
import"./chunk-ah61y8py.js";
|
|
44
44
|
|
|
45
45
|
// src/cli/commands/dev.ts
|
|
46
46
|
import { dev } from "astro";
|
|
@@ -185,4 +185,4 @@ export {
|
|
|
185
185
|
};
|
|
186
186
|
|
|
187
187
|
//# debugId=DAFEE5DB6B0E8A0164756E2164756E21
|
|
188
|
-
//# sourceMappingURL=chunk-
|
|
188
|
+
//# sourceMappingURL=chunk-kdp5q7ke.js.map
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./index.js";
|
|
11
11
|
import {
|
|
12
12
|
AGENTS
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-qwsrynx5.js";
|
|
14
14
|
import {
|
|
15
15
|
frontmatter_default,
|
|
16
16
|
i18nEnabled,
|
|
@@ -19,11 +19,11 @@ import {
|
|
|
19
19
|
folderMetaSchema,
|
|
20
20
|
scanBody,
|
|
21
21
|
createModuleLoader
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-qkqwkpte.js";
|
|
23
23
|
import"./chunk-jts8mvcz.js";
|
|
24
24
|
import {
|
|
25
25
|
scanProject
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-fs23ddbb.js";
|
|
27
27
|
import {
|
|
28
28
|
seconds,
|
|
29
29
|
money,
|
|
@@ -215,7 +215,7 @@ var driftDiagnostics = (workList) => driftRows(workList).map((row) => ({
|
|
|
215
215
|
file: row.file,
|
|
216
216
|
message: row.status === "missing" ? `${row.sourceRel} has no "${row.locale}" translation.` : `The "${row.locale}" translation of ${row.sourceRel} is stale: its source changed since it was translated.`,
|
|
217
217
|
severity: "error",
|
|
218
|
-
suggestion: "Run `blume translate --
|
|
218
|
+
suggestion: "Run `blume translate --codex` (or `--claude`) to bring the translations up to date."
|
|
219
219
|
}));
|
|
220
220
|
var checkLines = (workList) => [
|
|
221
221
|
...driftRows(workList).map((row) => ` ${colors.red("✖")} ${row.sourceRel} → ${row.locale} ${colors.dim(row.status)}`),
|
|
@@ -961,15 +961,15 @@ var MAX_CONCURRENCY = 16;
|
|
|
961
961
|
var parseFlags = (args) => {
|
|
962
962
|
const agents = Object.keys(AGENTS).filter((kind) => args[kind]);
|
|
963
963
|
if (agents.length > 1) {
|
|
964
|
-
logger.error("Pass exactly one of --
|
|
964
|
+
logger.error("Pass exactly one of --codex or --claude.");
|
|
965
965
|
process.exit(1);
|
|
966
966
|
}
|
|
967
967
|
if (args.check && agents.length > 0) {
|
|
968
|
-
logger.error("--check is read-only and never runs an agent; drop --claude
|
|
968
|
+
logger.error("--check is read-only and never runs an agent; drop --codex/--claude.");
|
|
969
969
|
process.exit(1);
|
|
970
970
|
}
|
|
971
971
|
if (!args.check && agents.length === 0) {
|
|
972
|
-
logger.error("Pass --
|
|
972
|
+
logger.error("Pass --codex or --claude to choose the agent CLI that translates.");
|
|
973
973
|
process.exit(1);
|
|
974
974
|
}
|
|
975
975
|
const timeoutS = args.timeout === undefined ? DEFAULT_TIMEOUT_S : Number(args.timeout);
|
|
@@ -1142,5 +1142,5 @@ export {
|
|
|
1142
1142
|
translateCommand
|
|
1143
1143
|
};
|
|
1144
1144
|
|
|
1145
|
-
//# debugId=
|
|
1146
|
-
//# sourceMappingURL=chunk-
|
|
1145
|
+
//# debugId=E056CB8AC06243D564756E2164756E21
|
|
1146
|
+
//# sourceMappingURL=chunk-kpf8rrjc.js.map
|