designmaker-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +26 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/import.d.ts +1 -0
- package/dist/commands/import.js +45 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/rebuild.d.ts +1 -0
- package/dist/commands/rebuild.js +32 -0
- package/dist/commands/rebuild.js.map +1 -0
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.js +103 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/ai/build-annotation-prompt.d.ts +6 -0
- package/dist/lib/ai/build-annotation-prompt.js +40 -0
- package/dist/lib/ai/build-annotation-prompt.js.map +1 -0
- package/dist/lib/ai/providers/index.d.ts +10 -0
- package/dist/lib/ai/providers/index.js +27 -0
- package/dist/lib/ai/providers/index.js.map +1 -0
- package/dist/lib/ai/providers/openai.d.ts +9 -0
- package/dist/lib/ai/providers/openai.js +77 -0
- package/dist/lib/ai/providers/openai.js.map +1 -0
- package/dist/lib/ai/providers/response-schema.d.ts +159 -0
- package/dist/lib/ai/providers/response-schema.js +21 -0
- package/dist/lib/ai/providers/response-schema.js.map +1 -0
- package/dist/lib/annotations/annotation-generator.d.ts +9 -0
- package/dist/lib/annotations/annotation-generator.js +90 -0
- package/dist/lib/annotations/annotation-generator.js.map +1 -0
- package/dist/lib/annotations/run-annotation-generation.d.ts +13 -0
- package/dist/lib/annotations/run-annotation-generation.js +52 -0
- package/dist/lib/annotations/run-annotation-generation.js.map +1 -0
- package/dist/lib/bundle/annotated-bundle.d.ts +15 -0
- package/dist/lib/bundle/annotated-bundle.js +63 -0
- package/dist/lib/bundle/annotated-bundle.js.map +1 -0
- package/dist/lib/bundle/shell-dist.d.ts +1 -0
- package/dist/lib/bundle/shell-dist.js +29 -0
- package/dist/lib/bundle/shell-dist.js.map +1 -0
- package/dist/lib/config.d.ts +13 -0
- package/dist/lib/config.js +84 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/doctor/doctor-checks.d.ts +12 -0
- package/dist/lib/doctor/doctor-checks.js +98 -0
- package/dist/lib/doctor/doctor-checks.js.map +1 -0
- package/dist/lib/env.d.ts +1 -0
- package/dist/lib/env.js +5 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/logger.d.ts +6 -0
- package/dist/lib/logger.js +15 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/project/detect-artifacts.d.ts +1 -0
- package/dist/lib/project/detect-artifacts.js +10 -0
- package/dist/lib/project/detect-artifacts.js.map +1 -0
- package/dist/lib/project/detect-framework.d.ts +3 -0
- package/dist/lib/project/detect-framework.js +14 -0
- package/dist/lib/project/detect-framework.js.map +1 -0
- package/dist/lib/project/detect-package-manager.d.ts +3 -0
- package/dist/lib/project/detect-package-manager.js +33 -0
- package/dist/lib/project/detect-package-manager.js.map +1 -0
- package/dist/lib/project/detect-scripts.d.ts +6 -0
- package/dist/lib/project/detect-scripts.js +8 -0
- package/dist/lib/project/detect-scripts.js.map +1 -0
- package/dist/lib/project/package-json.d.ts +23 -0
- package/dist/lib/project/package-json.js +20 -0
- package/dist/lib/project/package-json.js.map +1 -0
- package/dist/lib/project/project-scan.d.ts +2 -0
- package/dist/lib/project/project-scan.js +35 -0
- package/dist/lib/project/project-scan.js.map +1 -0
- package/dist/lib/prompt/is-tty.d.ts +1 -0
- package/dist/lib/prompt/is-tty.js +5 -0
- package/dist/lib/prompt/is-tty.js.map +1 -0
- package/dist/lib/prototype/browser.d.ts +2 -0
- package/dist/lib/prototype/browser.js +5 -0
- package/dist/lib/prototype/browser.js.map +1 -0
- package/dist/lib/prototype/capture-all-pages.d.ts +13 -0
- package/dist/lib/prototype/capture-all-pages.js +22 -0
- package/dist/lib/prototype/capture-all-pages.js.map +1 -0
- package/dist/lib/prototype/dom-summary.d.ts +3 -0
- package/dist/lib/prototype/dom-summary.js +56 -0
- package/dist/lib/prototype/dom-summary.js.map +1 -0
- package/dist/lib/prototype/page-capture.d.ts +6 -0
- package/dist/lib/prototype/page-capture.js +36 -0
- package/dist/lib/prototype/page-capture.js.map +1 -0
- package/dist/lib/prototype/page-metadata.d.ts +7 -0
- package/dist/lib/prototype/page-metadata.js +9 -0
- package/dist/lib/prototype/page-metadata.js.map +1 -0
- package/dist/lib/prototype/prototype-session.d.ts +22 -0
- package/dist/lib/prototype/prototype-session.js +82 -0
- package/dist/lib/prototype/prototype-session.js.map +1 -0
- package/dist/lib/prototype/run-package-script.d.ts +2 -0
- package/dist/lib/prototype/run-package-script.js +21 -0
- package/dist/lib/prototype/run-package-script.js.map +1 -0
- package/dist/lib/prototype/start-static-preview.d.ts +5 -0
- package/dist/lib/prototype/start-static-preview.js +74 -0
- package/dist/lib/prototype/start-static-preview.js.map +1 -0
- package/dist/lib/prototype/startup-strategy.d.ts +7 -0
- package/dist/lib/prototype/startup-strategy.js +32 -0
- package/dist/lib/prototype/startup-strategy.js.map +1 -0
- package/dist/lib/prototype/visible-text.d.ts +2 -0
- package/dist/lib/prototype/visible-text.js +5 -0
- package/dist/lib/prototype/visible-text.js.map +1 -0
- package/dist/lib/prototype/wait-for-url.d.ts +1 -0
- package/dist/lib/prototype/wait-for-url.js +16 -0
- package/dist/lib/prototype/wait-for-url.js.map +1 -0
- package/dist/lib/requirements/parse-file.d.ts +1 -0
- package/dist/lib/requirements/parse-file.js +7 -0
- package/dist/lib/requirements/parse-file.js.map +1 -0
- package/dist/lib/requirements/parse-text.d.ts +1 -0
- package/dist/lib/requirements/parse-text.js +4 -0
- package/dist/lib/requirements/parse-text.js.map +1 -0
- package/dist/lib/requirements/requirements-discovery.d.ts +2 -0
- package/dist/lib/requirements/requirements-discovery.js +62 -0
- package/dist/lib/requirements/requirements-discovery.js.map +1 -0
- package/dist/lib/requirements/requirements-ranking.d.ts +1 -0
- package/dist/lib/requirements/requirements-ranking.js +41 -0
- package/dist/lib/requirements/requirements-ranking.js.map +1 -0
- package/dist/lib/routes/confirm-ai-routes.d.ts +10 -0
- package/dist/lib/routes/confirm-ai-routes.js +70 -0
- package/dist/lib/routes/confirm-ai-routes.js.map +1 -0
- package/dist/lib/routes/crawl-internal-links.d.ts +4 -0
- package/dist/lib/routes/crawl-internal-links.js +42 -0
- package/dist/lib/routes/crawl-internal-links.js.map +1 -0
- package/dist/lib/routes/normalize-route-path.d.ts +5 -0
- package/dist/lib/routes/normalize-route-path.js +52 -0
- package/dist/lib/routes/normalize-route-path.js.map +1 -0
- package/dist/lib/routes/resolve-capture-routes.d.ts +18 -0
- package/dist/lib/routes/resolve-capture-routes.js +47 -0
- package/dist/lib/routes/resolve-capture-routes.js.map +1 -0
- package/dist/lib/routes/routes-config.d.ts +21 -0
- package/dist/lib/routes/routes-config.js +31 -0
- package/dist/lib/routes/routes-config.js.map +1 -0
- package/dist/lib/workspace/paths.d.ts +8 -0
- package/dist/lib/workspace/paths.js +19 -0
- package/dist/lib/workspace/paths.js.map +1 -0
- package/dist/lib/workspace/read-json.d.ts +2 -0
- package/dist/lib/workspace/read-json.js +26 -0
- package/dist/lib/workspace/read-json.js.map +1 -0
- package/dist/lib/workspace/schema.d.ts +355 -0
- package/dist/lib/workspace/schema.js +71 -0
- package/dist/lib/workspace/schema.js.map +1 -0
- package/dist/lib/workspace/types.d.ts +81 -0
- package/dist/lib/workspace/types.js +2 -0
- package/dist/lib/workspace/types.js.map +1 -0
- package/dist/lib/workspace/workspace-store.d.ts +27 -0
- package/dist/lib/workspace/workspace-store.js +75 -0
- package/dist/lib/workspace/workspace-store.js.map +1 -0
- package/dist/lib/workspace/write-json.d.ts +1 -0
- package/dist/lib/workspace/write-json.js +10 -0
- package/dist/lib/workspace/write-json.js.map +1 -0
- package/package.json +34 -0
- package/templates/vercel.json +5 -0
- package/vendor/annotation-shell/annotation-shell.css +1 -0
- package/vendor/annotation-shell/annotation-shell.js +379 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const aiAnnotationDraftSchema: z.ZodObject<{
|
|
3
|
+
title: z.ZodString;
|
|
4
|
+
description: z.ZodString;
|
|
5
|
+
business_rule: z.ZodString;
|
|
6
|
+
validation_rule: z.ZodString;
|
|
7
|
+
acceptance_criteria: z.ZodString;
|
|
8
|
+
anchor_hint: z.ZodObject<{
|
|
9
|
+
selector_hint: z.ZodOptional<z.ZodString>;
|
|
10
|
+
text_signature: z.ZodOptional<z.ZodString>;
|
|
11
|
+
anchor_x: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
anchor_y: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
anchor_w: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
anchor_h: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
selector_hint?: string | undefined;
|
|
17
|
+
text_signature?: string | undefined;
|
|
18
|
+
anchor_x?: number | undefined;
|
|
19
|
+
anchor_y?: number | undefined;
|
|
20
|
+
anchor_w?: number | undefined;
|
|
21
|
+
anchor_h?: number | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
selector_hint?: string | undefined;
|
|
24
|
+
text_signature?: string | undefined;
|
|
25
|
+
anchor_x?: number | undefined;
|
|
26
|
+
anchor_y?: number | undefined;
|
|
27
|
+
anchor_w?: number | undefined;
|
|
28
|
+
anchor_h?: number | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
confidence: z.ZodNumber;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
title: string;
|
|
33
|
+
description: string;
|
|
34
|
+
business_rule: string;
|
|
35
|
+
validation_rule: string;
|
|
36
|
+
acceptance_criteria: string;
|
|
37
|
+
confidence: number;
|
|
38
|
+
anchor_hint: {
|
|
39
|
+
selector_hint?: string | undefined;
|
|
40
|
+
text_signature?: string | undefined;
|
|
41
|
+
anchor_x?: number | undefined;
|
|
42
|
+
anchor_y?: number | undefined;
|
|
43
|
+
anchor_w?: number | undefined;
|
|
44
|
+
anchor_h?: number | undefined;
|
|
45
|
+
};
|
|
46
|
+
}, {
|
|
47
|
+
title: string;
|
|
48
|
+
description: string;
|
|
49
|
+
business_rule: string;
|
|
50
|
+
validation_rule: string;
|
|
51
|
+
acceptance_criteria: string;
|
|
52
|
+
confidence: number;
|
|
53
|
+
anchor_hint: {
|
|
54
|
+
selector_hint?: string | undefined;
|
|
55
|
+
text_signature?: string | undefined;
|
|
56
|
+
anchor_x?: number | undefined;
|
|
57
|
+
anchor_y?: number | undefined;
|
|
58
|
+
anchor_w?: number | undefined;
|
|
59
|
+
anchor_h?: number | undefined;
|
|
60
|
+
};
|
|
61
|
+
}>;
|
|
62
|
+
export declare const aiAnnotationResponseSchema: z.ZodObject<{
|
|
63
|
+
annotations: z.ZodArray<z.ZodObject<{
|
|
64
|
+
title: z.ZodString;
|
|
65
|
+
description: z.ZodString;
|
|
66
|
+
business_rule: z.ZodString;
|
|
67
|
+
validation_rule: z.ZodString;
|
|
68
|
+
acceptance_criteria: z.ZodString;
|
|
69
|
+
anchor_hint: z.ZodObject<{
|
|
70
|
+
selector_hint: z.ZodOptional<z.ZodString>;
|
|
71
|
+
text_signature: z.ZodOptional<z.ZodString>;
|
|
72
|
+
anchor_x: z.ZodOptional<z.ZodNumber>;
|
|
73
|
+
anchor_y: z.ZodOptional<z.ZodNumber>;
|
|
74
|
+
anchor_w: z.ZodOptional<z.ZodNumber>;
|
|
75
|
+
anchor_h: z.ZodOptional<z.ZodNumber>;
|
|
76
|
+
}, "strip", z.ZodTypeAny, {
|
|
77
|
+
selector_hint?: string | undefined;
|
|
78
|
+
text_signature?: string | undefined;
|
|
79
|
+
anchor_x?: number | undefined;
|
|
80
|
+
anchor_y?: number | undefined;
|
|
81
|
+
anchor_w?: number | undefined;
|
|
82
|
+
anchor_h?: number | undefined;
|
|
83
|
+
}, {
|
|
84
|
+
selector_hint?: string | undefined;
|
|
85
|
+
text_signature?: string | undefined;
|
|
86
|
+
anchor_x?: number | undefined;
|
|
87
|
+
anchor_y?: number | undefined;
|
|
88
|
+
anchor_w?: number | undefined;
|
|
89
|
+
anchor_h?: number | undefined;
|
|
90
|
+
}>;
|
|
91
|
+
confidence: z.ZodNumber;
|
|
92
|
+
}, "strip", z.ZodTypeAny, {
|
|
93
|
+
title: string;
|
|
94
|
+
description: string;
|
|
95
|
+
business_rule: string;
|
|
96
|
+
validation_rule: string;
|
|
97
|
+
acceptance_criteria: string;
|
|
98
|
+
confidence: number;
|
|
99
|
+
anchor_hint: {
|
|
100
|
+
selector_hint?: string | undefined;
|
|
101
|
+
text_signature?: string | undefined;
|
|
102
|
+
anchor_x?: number | undefined;
|
|
103
|
+
anchor_y?: number | undefined;
|
|
104
|
+
anchor_w?: number | undefined;
|
|
105
|
+
anchor_h?: number | undefined;
|
|
106
|
+
};
|
|
107
|
+
}, {
|
|
108
|
+
title: string;
|
|
109
|
+
description: string;
|
|
110
|
+
business_rule: string;
|
|
111
|
+
validation_rule: string;
|
|
112
|
+
acceptance_criteria: string;
|
|
113
|
+
confidence: number;
|
|
114
|
+
anchor_hint: {
|
|
115
|
+
selector_hint?: string | undefined;
|
|
116
|
+
text_signature?: string | undefined;
|
|
117
|
+
anchor_x?: number | undefined;
|
|
118
|
+
anchor_y?: number | undefined;
|
|
119
|
+
anchor_w?: number | undefined;
|
|
120
|
+
anchor_h?: number | undefined;
|
|
121
|
+
};
|
|
122
|
+
}>, "many">;
|
|
123
|
+
}, "strip", z.ZodTypeAny, {
|
|
124
|
+
annotations: {
|
|
125
|
+
title: string;
|
|
126
|
+
description: string;
|
|
127
|
+
business_rule: string;
|
|
128
|
+
validation_rule: string;
|
|
129
|
+
acceptance_criteria: string;
|
|
130
|
+
confidence: number;
|
|
131
|
+
anchor_hint: {
|
|
132
|
+
selector_hint?: string | undefined;
|
|
133
|
+
text_signature?: string | undefined;
|
|
134
|
+
anchor_x?: number | undefined;
|
|
135
|
+
anchor_y?: number | undefined;
|
|
136
|
+
anchor_w?: number | undefined;
|
|
137
|
+
anchor_h?: number | undefined;
|
|
138
|
+
};
|
|
139
|
+
}[];
|
|
140
|
+
}, {
|
|
141
|
+
annotations: {
|
|
142
|
+
title: string;
|
|
143
|
+
description: string;
|
|
144
|
+
business_rule: string;
|
|
145
|
+
validation_rule: string;
|
|
146
|
+
acceptance_criteria: string;
|
|
147
|
+
confidence: number;
|
|
148
|
+
anchor_hint: {
|
|
149
|
+
selector_hint?: string | undefined;
|
|
150
|
+
text_signature?: string | undefined;
|
|
151
|
+
anchor_x?: number | undefined;
|
|
152
|
+
anchor_y?: number | undefined;
|
|
153
|
+
anchor_w?: number | undefined;
|
|
154
|
+
anchor_h?: number | undefined;
|
|
155
|
+
};
|
|
156
|
+
}[];
|
|
157
|
+
}>;
|
|
158
|
+
export type AiAnnotationDraft = z.infer<typeof aiAnnotationDraftSchema>;
|
|
159
|
+
export type AiAnnotationResponse = z.infer<typeof aiAnnotationResponseSchema>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const aiAnnotationDraftSchema = z.object({
|
|
3
|
+
title: z.string().min(1),
|
|
4
|
+
description: z.string(),
|
|
5
|
+
business_rule: z.string(),
|
|
6
|
+
validation_rule: z.string(),
|
|
7
|
+
acceptance_criteria: z.string(),
|
|
8
|
+
anchor_hint: z.object({
|
|
9
|
+
selector_hint: z.string().optional(),
|
|
10
|
+
text_signature: z.string().optional(),
|
|
11
|
+
anchor_x: z.number().optional(),
|
|
12
|
+
anchor_y: z.number().optional(),
|
|
13
|
+
anchor_w: z.number().optional(),
|
|
14
|
+
anchor_h: z.number().optional(),
|
|
15
|
+
}),
|
|
16
|
+
confidence: z.number().min(0).max(1),
|
|
17
|
+
});
|
|
18
|
+
export const aiAnnotationResponseSchema = z.object({
|
|
19
|
+
annotations: z.array(aiAnnotationDraftSchema),
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=response-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-schema.js","sourceRoot":"","sources":["../../../../src/lib/ai/providers/response-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACpC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC;IACF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC9C,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AnnotationsSeed, PageSnapshot, RequirementsContext } from '../workspace/types.js';
|
|
2
|
+
interface GenerateHeuristicAnnotationsOptions {
|
|
3
|
+
snapshot: PageSnapshot;
|
|
4
|
+
requirements: RequirementsContext;
|
|
5
|
+
maxAnnotations?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function createEmptyAnnotationsSeed(): AnnotationsSeed;
|
|
8
|
+
export declare function generateHeuristicAnnotations(options: GenerateHeuristicAnnotationsOptions): AnnotationsSeed;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function createEmptyAnnotationsSeed() {
|
|
3
|
+
return { annotations: [] };
|
|
4
|
+
}
|
|
5
|
+
export function generateHeuristicAnnotations(options) {
|
|
6
|
+
const maxAnnotations = options.maxAnnotations ?? 8;
|
|
7
|
+
const candidates = options.snapshot.dom_summary
|
|
8
|
+
.filter(isUsefulCandidate)
|
|
9
|
+
.sort((left, right) => scoreCandidate(right) - scoreCandidate(left))
|
|
10
|
+
.slice(0, maxAnnotations);
|
|
11
|
+
return {
|
|
12
|
+
annotations: candidates.map((item, index) => createDraftAnnotation(options.snapshot, options.requirements, item, index)),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function createDraftAnnotation(snapshot, requirements, item, index) {
|
|
16
|
+
const text = normalizeText(item.text);
|
|
17
|
+
const title = text || fallbackTitle(item, index);
|
|
18
|
+
return {
|
|
19
|
+
id: createAnnotationId(snapshot.page_key, item.selector_hint, text, index),
|
|
20
|
+
page_key: snapshot.page_key,
|
|
21
|
+
title,
|
|
22
|
+
description: buildDescription(title, requirements),
|
|
23
|
+
business_rule: buildBusinessRule(title, requirements),
|
|
24
|
+
validation_rule: '请根据实际 PRD 补充该元素的输入、点击或状态校验规则。',
|
|
25
|
+
acceptance_criteria: `用户查看页面时,可以理解「${title}」对应的业务含义与交互结果。`,
|
|
26
|
+
source: 'ai',
|
|
27
|
+
confidence: 0.45,
|
|
28
|
+
selector_hint: item.selector_hint,
|
|
29
|
+
text_signature: text,
|
|
30
|
+
anchor_x: item.bounding_box.x,
|
|
31
|
+
anchor_y: item.bounding_box.y,
|
|
32
|
+
anchor_w: item.bounding_box.width,
|
|
33
|
+
anchor_h: item.bounding_box.height,
|
|
34
|
+
hidden: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function isUsefulCandidate(item) {
|
|
38
|
+
const text = normalizeText(item.text);
|
|
39
|
+
if (!text)
|
|
40
|
+
return false;
|
|
41
|
+
if (item.bounding_box.width <= 0 || item.bounding_box.height <= 0)
|
|
42
|
+
return false;
|
|
43
|
+
return scoreCandidate(item) > 0;
|
|
44
|
+
}
|
|
45
|
+
function scoreCandidate(item) {
|
|
46
|
+
const tag = item.tag.toLowerCase();
|
|
47
|
+
const role = item.role?.toLowerCase() ?? '';
|
|
48
|
+
if (tag === 'button' || role === 'button')
|
|
49
|
+
return 100;
|
|
50
|
+
if (tag === 'input' || tag === 'select' || tag === 'textarea')
|
|
51
|
+
return 90;
|
|
52
|
+
if (tag === 'label')
|
|
53
|
+
return 70;
|
|
54
|
+
if (tag === 'h1' || tag === 'h2' || tag === 'h3')
|
|
55
|
+
return 50;
|
|
56
|
+
if (item.selector_hint.includes('.card'))
|
|
57
|
+
return 40;
|
|
58
|
+
return 10;
|
|
59
|
+
}
|
|
60
|
+
function buildDescription(title, requirements) {
|
|
61
|
+
const summary = summarizeRequirements(requirements);
|
|
62
|
+
if (!summary)
|
|
63
|
+
return `围绕「${title}」补充页面标注说明。`;
|
|
64
|
+
return `围绕「${title}」补充页面标注说明。需求摘要:${summary}`;
|
|
65
|
+
}
|
|
66
|
+
function buildBusinessRule(title, requirements) {
|
|
67
|
+
const summary = summarizeRequirements(requirements);
|
|
68
|
+
if (!summary)
|
|
69
|
+
return `「${title}」的业务规则待 PM 根据 PRD 确认。`;
|
|
70
|
+
return `「${title}」应符合已发现需求文档中的规则:${summary}`;
|
|
71
|
+
}
|
|
72
|
+
function summarizeRequirements(requirements) {
|
|
73
|
+
return normalizeText(requirements.combined_text
|
|
74
|
+
.replace(/<!--[\s\S]*?-->/g, ' ')
|
|
75
|
+
.replace(/^#{1,6}\s+/gm, '')).slice(0, 80);
|
|
76
|
+
}
|
|
77
|
+
function fallbackTitle(item, index) {
|
|
78
|
+
return `${item.tag.toUpperCase()} 标注 ${index + 1}`;
|
|
79
|
+
}
|
|
80
|
+
function normalizeText(text) {
|
|
81
|
+
return text.trim().replace(/\s+/g, ' ');
|
|
82
|
+
}
|
|
83
|
+
function createAnnotationId(pageKey, selectorHint, text, index) {
|
|
84
|
+
const hash = createHash('sha1')
|
|
85
|
+
.update(`${pageKey}|${selectorHint}|${text}|${index}`)
|
|
86
|
+
.digest('hex')
|
|
87
|
+
.slice(0, 12);
|
|
88
|
+
return `ann_${hash}`;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=annotation-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotation-generator.js","sourceRoot":"","sources":["../../../src/lib/annotations/annotation-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AnnotationsSeed, PageSnapshot, RequirementsContext } from '../workspace/types.js';
|
|
2
|
+
interface RunAnnotationGenerationOptions {
|
|
3
|
+
noAi: boolean;
|
|
4
|
+
snapshots: PageSnapshot[];
|
|
5
|
+
aiRoutes: string[];
|
|
6
|
+
requirements: RequirementsContext;
|
|
7
|
+
}
|
|
8
|
+
export interface AnnotationGenerationResult {
|
|
9
|
+
seed: AnnotationsSeed;
|
|
10
|
+
mode: 'no-ai' | 'heuristic' | 'openai' | 'empty';
|
|
11
|
+
}
|
|
12
|
+
export declare function runAnnotationGeneration(options: RunAnnotationGenerationOptions): Promise<AnnotationGenerationResult>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
import { createAnnotationProvider } from '../ai/providers/index.js';
|
|
3
|
+
import { createEmptyAnnotationsSeed } from './annotation-generator.js';
|
|
4
|
+
import { normalizeRoutePath } from '../routes/normalize-route-path.js';
|
|
5
|
+
export async function runAnnotationGeneration(options) {
|
|
6
|
+
if (options.noAi) {
|
|
7
|
+
return {
|
|
8
|
+
seed: createEmptyAnnotationsSeed(),
|
|
9
|
+
mode: 'no-ai',
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const aiRouteSet = new Set(options.aiRoutes);
|
|
13
|
+
const snapshots = options.snapshots.filter((snapshot) => {
|
|
14
|
+
const pageKey = normalizeRoutePath(snapshot.page_key) ?? snapshot.page_key;
|
|
15
|
+
return aiRouteSet.has(pageKey);
|
|
16
|
+
});
|
|
17
|
+
if (snapshots.length === 0) {
|
|
18
|
+
logger.warn('未生成可用页面快照,跳过标注草稿生成并写入空种子。');
|
|
19
|
+
return {
|
|
20
|
+
seed: createEmptyAnnotationsSeed(),
|
|
21
|
+
mode: 'empty',
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const provider = createAnnotationProvider();
|
|
25
|
+
const mergedAnnotations = [];
|
|
26
|
+
let mode = provider.name;
|
|
27
|
+
for (const snapshot of snapshots) {
|
|
28
|
+
try {
|
|
29
|
+
const seed = await provider.generate({
|
|
30
|
+
snapshot,
|
|
31
|
+
requirements: options.requirements,
|
|
32
|
+
});
|
|
33
|
+
mergedAnnotations.push(...seed.annotations);
|
|
34
|
+
mode = provider.name;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
38
|
+
logger.warn(`页面 ${snapshot.page_key} 标注生成失败,已跳过:${message}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (mergedAnnotations.length === 0) {
|
|
42
|
+
return {
|
|
43
|
+
seed: createEmptyAnnotationsSeed(),
|
|
44
|
+
mode: 'empty',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
seed: { annotations: mergedAnnotations },
|
|
49
|
+
mode,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=run-annotation-generation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-annotation-generation.js","sourceRoot":"","sources":["../../../src/lib/annotations/run-annotation-generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAevE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAuC;IAEvC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO;YACL,IAAI,EAAE,0BAA0B,EAAE;YAClC,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;QACtD,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC;QAC3E,OAAO,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,0BAA0B,EAAE;YAClC,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;IAC5C,MAAM,iBAAiB,GAAiB,EAAE,CAAC;IAC3C,IAAI,IAAI,GAAuC,QAAQ,CAAC,IAAI,CAAC;IAE7D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC;gBACnC,QAAQ;gBACR,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC,CAAC,CAAC;YACH,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5C,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,eAAe,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,0BAA0B,EAAE;YAClC,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE;QACxC,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface DesignMakerBundleManifest {
|
|
2
|
+
entry_html: string;
|
|
3
|
+
shell_script: string;
|
|
4
|
+
shell_css: string;
|
|
5
|
+
seed_data: string;
|
|
6
|
+
bundle_manifest: string;
|
|
7
|
+
mount_selector: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BuildAnnotatedBundleOptions {
|
|
10
|
+
artifactDir: string;
|
|
11
|
+
outputDir: string;
|
|
12
|
+
shellDistDir: string;
|
|
13
|
+
annotationsSeedPath: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function buildAnnotatedBundle(options: BuildAnnotatedBundleOptions): Promise<DesignMakerBundleManifest>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { copyFile, cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
const SHELL_SCRIPT = 'annotation-shell.js';
|
|
6
|
+
const SHELL_CSS = 'annotation-shell.css';
|
|
7
|
+
const SEED_FILE = 'annotations.seed.json';
|
|
8
|
+
const MANIFEST_FILE = 'designmaker.bundle.json';
|
|
9
|
+
const ENTRY_HTML = 'index.html';
|
|
10
|
+
const VERCEL_CONFIG = 'vercel.json';
|
|
11
|
+
function resolveCliPackageRoot() {
|
|
12
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), '../../..');
|
|
13
|
+
}
|
|
14
|
+
function resolveVercelConfigPath() {
|
|
15
|
+
return join(resolveCliPackageRoot(), 'templates', VERCEL_CONFIG);
|
|
16
|
+
}
|
|
17
|
+
export async function buildAnnotatedBundle(options) {
|
|
18
|
+
assertRequiredFile(join(options.artifactDir, ENTRY_HTML), '原型静态入口 HTML');
|
|
19
|
+
assertRequiredFile(join(options.shellDistDir, SHELL_SCRIPT), 'Annotation Shell 脚本');
|
|
20
|
+
assertRequiredFile(join(options.shellDistDir, SHELL_CSS), 'Annotation Shell 样式');
|
|
21
|
+
assertRequiredFile(options.annotationsSeedPath, '标注种子文件');
|
|
22
|
+
await rm(options.outputDir, { recursive: true, force: true });
|
|
23
|
+
await mkdir(options.outputDir, { recursive: true });
|
|
24
|
+
await cp(options.artifactDir, options.outputDir, { recursive: true });
|
|
25
|
+
await copyFile(join(options.shellDistDir, SHELL_SCRIPT), join(options.outputDir, SHELL_SCRIPT));
|
|
26
|
+
await copyFile(join(options.shellDistDir, SHELL_CSS), join(options.outputDir, SHELL_CSS));
|
|
27
|
+
await copyFile(options.annotationsSeedPath, join(options.outputDir, SEED_FILE));
|
|
28
|
+
await copyFile(resolveVercelConfigPath(), join(options.outputDir, VERCEL_CONFIG));
|
|
29
|
+
await injectDesignMakerShell(join(options.outputDir, ENTRY_HTML));
|
|
30
|
+
const manifest = {
|
|
31
|
+
entry_html: ENTRY_HTML,
|
|
32
|
+
shell_script: SHELL_SCRIPT,
|
|
33
|
+
shell_css: SHELL_CSS,
|
|
34
|
+
seed_data: SEED_FILE,
|
|
35
|
+
bundle_manifest: MANIFEST_FILE,
|
|
36
|
+
mount_selector: 'body',
|
|
37
|
+
};
|
|
38
|
+
await writeFile(join(options.outputDir, MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
|
|
39
|
+
return manifest;
|
|
40
|
+
}
|
|
41
|
+
async function injectDesignMakerShell(htmlPath) {
|
|
42
|
+
let html = await readFile(htmlPath, 'utf8');
|
|
43
|
+
if (html.includes(SHELL_SCRIPT))
|
|
44
|
+
return;
|
|
45
|
+
const injection = `
|
|
46
|
+
<link rel="stylesheet" href="./${SHELL_CSS}" />
|
|
47
|
+
<script>window.__DESIGNMAKER__ = { seedUrl: './${SEED_FILE}', cssUrl: './${SHELL_CSS}' };</script>
|
|
48
|
+
<script src="./${SHELL_SCRIPT}"></script>
|
|
49
|
+
`;
|
|
50
|
+
if (html.includes('</body>')) {
|
|
51
|
+
html = html.replace('</body>', `${injection}\n </body>`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
html += injection;
|
|
55
|
+
}
|
|
56
|
+
await writeFile(htmlPath, html, 'utf8');
|
|
57
|
+
}
|
|
58
|
+
function assertRequiredFile(path, label) {
|
|
59
|
+
if (!existsSync(path)) {
|
|
60
|
+
throw new Error(`缺少${label}:${path}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=annotated-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotated-bundle.js","sourceRoot":"","sources":["../../../src/lib/bundle/annotated-bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveShellDistDir(): string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { readEnv } from '../env.js';
|
|
5
|
+
function resolveCliPackageRoot() {
|
|
6
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
return resolve(currentDir, '../../..');
|
|
8
|
+
}
|
|
9
|
+
function resolveVendoredShellDist(cliPackageRoot) {
|
|
10
|
+
const vendored = join(cliPackageRoot, 'vendor/annotation-shell');
|
|
11
|
+
if (existsSync(join(vendored, 'annotation-shell.js'))) {
|
|
12
|
+
return vendored;
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function resolveMonorepoShellDist(cliPackageRoot) {
|
|
17
|
+
return resolve(cliPackageRoot, '../annotation-shell/dist');
|
|
18
|
+
}
|
|
19
|
+
export function resolveShellDistDir() {
|
|
20
|
+
const shellDist = readEnv('DESIGNMAKER_SHELL_DIST');
|
|
21
|
+
if (shellDist)
|
|
22
|
+
return resolve(shellDist);
|
|
23
|
+
const cliPackageRoot = resolveCliPackageRoot();
|
|
24
|
+
const vendored = resolveVendoredShellDist(cliPackageRoot);
|
|
25
|
+
if (vendored)
|
|
26
|
+
return vendored;
|
|
27
|
+
return resolveMonorepoShellDist(cliPackageRoot);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=shell-dist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-dist.js","sourceRoot":"","sources":["../../../src/lib/bundle/shell-dist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,SAAS,qBAAqB;IAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,wBAAwB,CAAC,cAAsB;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAAC,cAAsB;IACtD,OAAO,OAAO,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACpD,IAAI,SAAS;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzC,MAAM,cAAc,GAAG,qBAAqB,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAC1D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,OAAO,wBAAwB,CAAC,cAAc,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface CliConfig {
|
|
2
|
+
cwd: string;
|
|
3
|
+
workspace: string;
|
|
4
|
+
outDir: string;
|
|
5
|
+
noAi: boolean;
|
|
6
|
+
yes: boolean;
|
|
7
|
+
pages?: string[];
|
|
8
|
+
aiPages?: string[];
|
|
9
|
+
maxPages: number;
|
|
10
|
+
noCrawl: boolean;
|
|
11
|
+
projectName: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function loadCliConfig(args: string[]): CliConfig;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { cwd } from 'node:process';
|
|
3
|
+
export function loadCliConfig(args) {
|
|
4
|
+
const parsed = parseArgs(args);
|
|
5
|
+
const projectRoot = resolve(parsed.cwd ?? cwd());
|
|
6
|
+
const workspace = resolve(projectRoot, parsed.workspace ?? '.designmaker');
|
|
7
|
+
const outDir = resolve(projectRoot, parsed.outDir ?? `${workspace}/annotated-bundle`);
|
|
8
|
+
return {
|
|
9
|
+
cwd: projectRoot,
|
|
10
|
+
workspace,
|
|
11
|
+
outDir,
|
|
12
|
+
noAi: parsed.noAi,
|
|
13
|
+
yes: parsed.yes,
|
|
14
|
+
pages: parsed.pages,
|
|
15
|
+
aiPages: parsed.aiPages,
|
|
16
|
+
maxPages: parsed.maxPages,
|
|
17
|
+
noCrawl: parsed.noCrawl,
|
|
18
|
+
projectName: projectRoot.split('/').filter(Boolean).at(-1) ?? 'designmaker-project',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function parseArgs(args) {
|
|
22
|
+
const parsed = {
|
|
23
|
+
noAi: false,
|
|
24
|
+
yes: false,
|
|
25
|
+
maxPages: 10,
|
|
26
|
+
noCrawl: false,
|
|
27
|
+
};
|
|
28
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
29
|
+
const arg = args[index];
|
|
30
|
+
switch (arg) {
|
|
31
|
+
case '--cwd':
|
|
32
|
+
parsed.cwd = readValue(args, ++index, arg);
|
|
33
|
+
break;
|
|
34
|
+
case '--workspace':
|
|
35
|
+
parsed.workspace = readValue(args, ++index, arg);
|
|
36
|
+
break;
|
|
37
|
+
case '--out-dir':
|
|
38
|
+
parsed.outDir = readValue(args, ++index, arg);
|
|
39
|
+
break;
|
|
40
|
+
case '--pages':
|
|
41
|
+
parsed.pages = parsePathList(readValue(args, ++index, arg));
|
|
42
|
+
break;
|
|
43
|
+
case '--ai-pages':
|
|
44
|
+
parsed.aiPages = parsePathList(readValue(args, ++index, arg));
|
|
45
|
+
break;
|
|
46
|
+
case '--max-pages':
|
|
47
|
+
parsed.maxPages = parsePositiveInt(readValue(args, ++index, arg), arg);
|
|
48
|
+
break;
|
|
49
|
+
case '--no-ai':
|
|
50
|
+
parsed.noAi = true;
|
|
51
|
+
break;
|
|
52
|
+
case '--yes':
|
|
53
|
+
parsed.yes = true;
|
|
54
|
+
break;
|
|
55
|
+
case '--no-crawl':
|
|
56
|
+
parsed.noCrawl = true;
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
throw new Error(`未知参数:${arg}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return parsed;
|
|
63
|
+
}
|
|
64
|
+
function readValue(args, index, flag) {
|
|
65
|
+
const value = args[index];
|
|
66
|
+
if (!value || value.startsWith('--')) {
|
|
67
|
+
throw new Error(`${flag} 需要提供参数值`);
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
function parsePathList(value) {
|
|
72
|
+
return value
|
|
73
|
+
.split(',')
|
|
74
|
+
.map((part) => part.trim())
|
|
75
|
+
.filter(Boolean);
|
|
76
|
+
}
|
|
77
|
+
function parsePositiveInt(value, flag) {
|
|
78
|
+
const parsed = Number.parseInt(value, 10);
|
|
79
|
+
if (Number.isNaN(parsed) || parsed < 1) {
|
|
80
|
+
throw new Error(`${flag} 需要正整数`);
|
|
81
|
+
}
|
|
82
|
+
return parsed;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface DoctorCheck {
|
|
2
|
+
label: string;
|
|
3
|
+
ok: boolean;
|
|
4
|
+
detail: string;
|
|
5
|
+
fix?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function resolveProjectDir(args: string[]): string;
|
|
8
|
+
export declare function checkNodeVersion(): DoctorCheck;
|
|
9
|
+
export declare function checkAnnotationShell(): DoctorCheck;
|
|
10
|
+
export declare function checkPlaywrightChromium(): Promise<DoctorCheck>;
|
|
11
|
+
export declare function checkProjectPackageJson(projectDir: string): DoctorCheck;
|
|
12
|
+
export declare function runDoctorChecks(args: string[]): Promise<DoctorCheck[]>;
|