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.
Files changed (154) hide show
  1. package/dist/commands/doctor.d.ts +1 -0
  2. package/dist/commands/doctor.js +26 -0
  3. package/dist/commands/doctor.js.map +1 -0
  4. package/dist/commands/import.d.ts +1 -0
  5. package/dist/commands/import.js +45 -0
  6. package/dist/commands/import.js.map +1 -0
  7. package/dist/commands/rebuild.d.ts +1 -0
  8. package/dist/commands/rebuild.js +32 -0
  9. package/dist/commands/rebuild.js.map +1 -0
  10. package/dist/commands/start.d.ts +1 -0
  11. package/dist/commands/start.js +103 -0
  12. package/dist/commands/start.js.map +1 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.js +65 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/lib/ai/build-annotation-prompt.d.ts +6 -0
  17. package/dist/lib/ai/build-annotation-prompt.js +40 -0
  18. package/dist/lib/ai/build-annotation-prompt.js.map +1 -0
  19. package/dist/lib/ai/providers/index.d.ts +10 -0
  20. package/dist/lib/ai/providers/index.js +27 -0
  21. package/dist/lib/ai/providers/index.js.map +1 -0
  22. package/dist/lib/ai/providers/openai.d.ts +9 -0
  23. package/dist/lib/ai/providers/openai.js +77 -0
  24. package/dist/lib/ai/providers/openai.js.map +1 -0
  25. package/dist/lib/ai/providers/response-schema.d.ts +159 -0
  26. package/dist/lib/ai/providers/response-schema.js +21 -0
  27. package/dist/lib/ai/providers/response-schema.js.map +1 -0
  28. package/dist/lib/annotations/annotation-generator.d.ts +9 -0
  29. package/dist/lib/annotations/annotation-generator.js +90 -0
  30. package/dist/lib/annotations/annotation-generator.js.map +1 -0
  31. package/dist/lib/annotations/run-annotation-generation.d.ts +13 -0
  32. package/dist/lib/annotations/run-annotation-generation.js +52 -0
  33. package/dist/lib/annotations/run-annotation-generation.js.map +1 -0
  34. package/dist/lib/bundle/annotated-bundle.d.ts +15 -0
  35. package/dist/lib/bundle/annotated-bundle.js +63 -0
  36. package/dist/lib/bundle/annotated-bundle.js.map +1 -0
  37. package/dist/lib/bundle/shell-dist.d.ts +1 -0
  38. package/dist/lib/bundle/shell-dist.js +29 -0
  39. package/dist/lib/bundle/shell-dist.js.map +1 -0
  40. package/dist/lib/config.d.ts +13 -0
  41. package/dist/lib/config.js +84 -0
  42. package/dist/lib/config.js.map +1 -0
  43. package/dist/lib/doctor/doctor-checks.d.ts +12 -0
  44. package/dist/lib/doctor/doctor-checks.js +98 -0
  45. package/dist/lib/doctor/doctor-checks.js.map +1 -0
  46. package/dist/lib/env.d.ts +1 -0
  47. package/dist/lib/env.js +5 -0
  48. package/dist/lib/env.js.map +1 -0
  49. package/dist/lib/logger.d.ts +6 -0
  50. package/dist/lib/logger.js +15 -0
  51. package/dist/lib/logger.js.map +1 -0
  52. package/dist/lib/project/detect-artifacts.d.ts +1 -0
  53. package/dist/lib/project/detect-artifacts.js +10 -0
  54. package/dist/lib/project/detect-artifacts.js.map +1 -0
  55. package/dist/lib/project/detect-framework.d.ts +3 -0
  56. package/dist/lib/project/detect-framework.js +14 -0
  57. package/dist/lib/project/detect-framework.js.map +1 -0
  58. package/dist/lib/project/detect-package-manager.d.ts +3 -0
  59. package/dist/lib/project/detect-package-manager.js +33 -0
  60. package/dist/lib/project/detect-package-manager.js.map +1 -0
  61. package/dist/lib/project/detect-scripts.d.ts +6 -0
  62. package/dist/lib/project/detect-scripts.js +8 -0
  63. package/dist/lib/project/detect-scripts.js.map +1 -0
  64. package/dist/lib/project/package-json.d.ts +23 -0
  65. package/dist/lib/project/package-json.js +20 -0
  66. package/dist/lib/project/package-json.js.map +1 -0
  67. package/dist/lib/project/project-scan.d.ts +2 -0
  68. package/dist/lib/project/project-scan.js +35 -0
  69. package/dist/lib/project/project-scan.js.map +1 -0
  70. package/dist/lib/prompt/is-tty.d.ts +1 -0
  71. package/dist/lib/prompt/is-tty.js +5 -0
  72. package/dist/lib/prompt/is-tty.js.map +1 -0
  73. package/dist/lib/prototype/browser.d.ts +2 -0
  74. package/dist/lib/prototype/browser.js +5 -0
  75. package/dist/lib/prototype/browser.js.map +1 -0
  76. package/dist/lib/prototype/capture-all-pages.d.ts +13 -0
  77. package/dist/lib/prototype/capture-all-pages.js +22 -0
  78. package/dist/lib/prototype/capture-all-pages.js.map +1 -0
  79. package/dist/lib/prototype/dom-summary.d.ts +3 -0
  80. package/dist/lib/prototype/dom-summary.js +56 -0
  81. package/dist/lib/prototype/dom-summary.js.map +1 -0
  82. package/dist/lib/prototype/page-capture.d.ts +6 -0
  83. package/dist/lib/prototype/page-capture.js +36 -0
  84. package/dist/lib/prototype/page-capture.js.map +1 -0
  85. package/dist/lib/prototype/page-metadata.d.ts +7 -0
  86. package/dist/lib/prototype/page-metadata.js +9 -0
  87. package/dist/lib/prototype/page-metadata.js.map +1 -0
  88. package/dist/lib/prototype/prototype-session.d.ts +22 -0
  89. package/dist/lib/prototype/prototype-session.js +82 -0
  90. package/dist/lib/prototype/prototype-session.js.map +1 -0
  91. package/dist/lib/prototype/run-package-script.d.ts +2 -0
  92. package/dist/lib/prototype/run-package-script.js +21 -0
  93. package/dist/lib/prototype/run-package-script.js.map +1 -0
  94. package/dist/lib/prototype/start-static-preview.d.ts +5 -0
  95. package/dist/lib/prototype/start-static-preview.js +74 -0
  96. package/dist/lib/prototype/start-static-preview.js.map +1 -0
  97. package/dist/lib/prototype/startup-strategy.d.ts +7 -0
  98. package/dist/lib/prototype/startup-strategy.js +32 -0
  99. package/dist/lib/prototype/startup-strategy.js.map +1 -0
  100. package/dist/lib/prototype/visible-text.d.ts +2 -0
  101. package/dist/lib/prototype/visible-text.js +5 -0
  102. package/dist/lib/prototype/visible-text.js.map +1 -0
  103. package/dist/lib/prototype/wait-for-url.d.ts +1 -0
  104. package/dist/lib/prototype/wait-for-url.js +16 -0
  105. package/dist/lib/prototype/wait-for-url.js.map +1 -0
  106. package/dist/lib/requirements/parse-file.d.ts +1 -0
  107. package/dist/lib/requirements/parse-file.js +7 -0
  108. package/dist/lib/requirements/parse-file.js.map +1 -0
  109. package/dist/lib/requirements/parse-text.d.ts +1 -0
  110. package/dist/lib/requirements/parse-text.js +4 -0
  111. package/dist/lib/requirements/parse-text.js.map +1 -0
  112. package/dist/lib/requirements/requirements-discovery.d.ts +2 -0
  113. package/dist/lib/requirements/requirements-discovery.js +62 -0
  114. package/dist/lib/requirements/requirements-discovery.js.map +1 -0
  115. package/dist/lib/requirements/requirements-ranking.d.ts +1 -0
  116. package/dist/lib/requirements/requirements-ranking.js +41 -0
  117. package/dist/lib/requirements/requirements-ranking.js.map +1 -0
  118. package/dist/lib/routes/confirm-ai-routes.d.ts +10 -0
  119. package/dist/lib/routes/confirm-ai-routes.js +70 -0
  120. package/dist/lib/routes/confirm-ai-routes.js.map +1 -0
  121. package/dist/lib/routes/crawl-internal-links.d.ts +4 -0
  122. package/dist/lib/routes/crawl-internal-links.js +42 -0
  123. package/dist/lib/routes/crawl-internal-links.js.map +1 -0
  124. package/dist/lib/routes/normalize-route-path.d.ts +5 -0
  125. package/dist/lib/routes/normalize-route-path.js +52 -0
  126. package/dist/lib/routes/normalize-route-path.js.map +1 -0
  127. package/dist/lib/routes/resolve-capture-routes.d.ts +18 -0
  128. package/dist/lib/routes/resolve-capture-routes.js +47 -0
  129. package/dist/lib/routes/resolve-capture-routes.js.map +1 -0
  130. package/dist/lib/routes/routes-config.d.ts +21 -0
  131. package/dist/lib/routes/routes-config.js +31 -0
  132. package/dist/lib/routes/routes-config.js.map +1 -0
  133. package/dist/lib/workspace/paths.d.ts +8 -0
  134. package/dist/lib/workspace/paths.js +19 -0
  135. package/dist/lib/workspace/paths.js.map +1 -0
  136. package/dist/lib/workspace/read-json.d.ts +2 -0
  137. package/dist/lib/workspace/read-json.js +26 -0
  138. package/dist/lib/workspace/read-json.js.map +1 -0
  139. package/dist/lib/workspace/schema.d.ts +355 -0
  140. package/dist/lib/workspace/schema.js +71 -0
  141. package/dist/lib/workspace/schema.js.map +1 -0
  142. package/dist/lib/workspace/types.d.ts +81 -0
  143. package/dist/lib/workspace/types.js +2 -0
  144. package/dist/lib/workspace/types.js.map +1 -0
  145. package/dist/lib/workspace/workspace-store.d.ts +27 -0
  146. package/dist/lib/workspace/workspace-store.js +75 -0
  147. package/dist/lib/workspace/workspace-store.js.map +1 -0
  148. package/dist/lib/workspace/write-json.d.ts +1 -0
  149. package/dist/lib/workspace/write-json.js +10 -0
  150. package/dist/lib/workspace/write-json.js.map +1 -0
  151. package/package.json +34 -0
  152. package/templates/vercel.json +5 -0
  153. package/vendor/annotation-shell/annotation-shell.css +1 -0
  154. 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[]>;