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 @@
|
|
|
1
|
+
export declare function doctorCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { logger } from '../lib/logger.js';
|
|
2
|
+
import { runDoctorChecks } from '../lib/doctor/doctor-checks.js';
|
|
3
|
+
export async function doctorCommand(args) {
|
|
4
|
+
const checks = await runDoctorChecks(args);
|
|
5
|
+
for (const check of checks) {
|
|
6
|
+
if (check.ok) {
|
|
7
|
+
logger.success(`${check.label}:${check.detail}`);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
logger.error(`${check.label}:${check.detail}`);
|
|
11
|
+
if (check.fix) {
|
|
12
|
+
logger.info(` 修复建议:${check.fix}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const failed = checks.filter((check) => !check.ok).length;
|
|
17
|
+
if (failed > 0) {
|
|
18
|
+
logger.info('');
|
|
19
|
+
logger.info(`共 ${failed} 项未通过,请按上述建议修复后重试。`);
|
|
20
|
+
process.exitCode = 1;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
logger.info('');
|
|
24
|
+
logger.success('环境检查全部通过,可以执行 designmaker start。');
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAC1D,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,oBAAoB,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { loadCliConfig } from '../lib/config.js';
|
|
3
|
+
import { logger } from '../lib/logger.js';
|
|
4
|
+
import { annotationsSeedSchema } from '../lib/workspace/schema.js';
|
|
5
|
+
import { createWorkspaceStore } from '../lib/workspace/workspace-store.js';
|
|
6
|
+
import { readJsonFile } from '../lib/workspace/read-json.js';
|
|
7
|
+
export async function importCommand(args) {
|
|
8
|
+
const { inputPath, configArgs } = parseImportArgs(args);
|
|
9
|
+
const config = loadCliConfig(configArgs);
|
|
10
|
+
const workspace = createWorkspaceStore({
|
|
11
|
+
projectRoot: config.cwd,
|
|
12
|
+
workspaceRoot: config.workspace,
|
|
13
|
+
outputDir: config.outDir,
|
|
14
|
+
});
|
|
15
|
+
await workspace.ensure();
|
|
16
|
+
const seed = await readJsonFile(resolve(config.cwd, inputPath), annotationsSeedSchema);
|
|
17
|
+
await workspace.writeAnnotationsSeed(seed);
|
|
18
|
+
logger.success('标注数据已回灌到 DesignMaker 工作区');
|
|
19
|
+
logger.info(`输入文件:${resolve(config.cwd, inputPath)}`);
|
|
20
|
+
logger.info(`标注数量:${seed.annotations.length}`);
|
|
21
|
+
logger.info(`工作区种子:${workspace.paths.annotationsSeedJson}`);
|
|
22
|
+
logger.info('下一步可以执行 designmaker rebuild 重新生成标注版静态产物。');
|
|
23
|
+
}
|
|
24
|
+
function parseImportArgs(args) {
|
|
25
|
+
const configArgs = [];
|
|
26
|
+
let inputPath = null;
|
|
27
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
28
|
+
const arg = args[index];
|
|
29
|
+
if (!arg.startsWith('--') && !inputPath) {
|
|
30
|
+
inputPath = arg;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
configArgs.push(arg);
|
|
34
|
+
if (arg === '--cwd' || arg === '--workspace' || arg === '--out-dir') {
|
|
35
|
+
const value = args[++index];
|
|
36
|
+
if (value)
|
|
37
|
+
configArgs.push(value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (!inputPath) {
|
|
41
|
+
throw new Error('designmaker import 需要提供 annotations.json 路径');
|
|
42
|
+
}
|
|
43
|
+
return { inputPath, configArgs };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,oBAAoB,CAAC;QACrC,WAAW,EAAE,MAAM,CAAC,GAAG;QACvB,aAAa,EAAE,MAAM,CAAC,SAAS;QAC/B,SAAS,EAAE,MAAM,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACvF,MAAM,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAE3C,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,IAAc;IACrC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,SAAS,GAAkB,IAAI,CAAC;IAEpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,SAAS,GAAG,GAAG,CAAC;YAChB,SAAS;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACpE,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,KAAK;gBAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function rebuildCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { loadCliConfig } from '../lib/config.js';
|
|
3
|
+
import { logger } from '../lib/logger.js';
|
|
4
|
+
import { buildAnnotatedBundle } from '../lib/bundle/annotated-bundle.js';
|
|
5
|
+
import { resolveShellDistDir } from '../lib/bundle/shell-dist.js';
|
|
6
|
+
import { createWorkspaceStore } from '../lib/workspace/workspace-store.js';
|
|
7
|
+
export async function rebuildCommand(args) {
|
|
8
|
+
const config = loadCliConfig(args);
|
|
9
|
+
const workspace = createWorkspaceStore({
|
|
10
|
+
projectRoot: config.cwd,
|
|
11
|
+
workspaceRoot: config.workspace,
|
|
12
|
+
outputDir: config.outDir,
|
|
13
|
+
});
|
|
14
|
+
await workspace.ensure();
|
|
15
|
+
const scan = await workspace.readProjectScan();
|
|
16
|
+
const seed = await workspace.readAnnotationsSeed();
|
|
17
|
+
const artifactDir = scan.artifact_dirs[0];
|
|
18
|
+
if (!artifactDir) {
|
|
19
|
+
throw new Error('缺少可重建的静态产物目录,请先执行 designmaker start');
|
|
20
|
+
}
|
|
21
|
+
await buildAnnotatedBundle({
|
|
22
|
+
artifactDir: join(config.cwd, artifactDir),
|
|
23
|
+
outputDir: workspace.paths.outputDir,
|
|
24
|
+
shellDistDir: resolveShellDistDir(),
|
|
25
|
+
annotationsSeedPath: workspace.paths.annotationsSeedJson,
|
|
26
|
+
});
|
|
27
|
+
logger.success('标注版静态产物已重新生成');
|
|
28
|
+
logger.info(`静态产物目录:${artifactDir}`);
|
|
29
|
+
logger.info(`标注数量:${seed.annotations.length}`);
|
|
30
|
+
logger.info(`输出目录:${workspace.paths.outputDir}`);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=rebuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/commands/rebuild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,oBAAoB,CAAC;QACrC,WAAW,EAAE,MAAM,CAAC,GAAG;QACvB,aAAa,EAAE,MAAM,CAAC,SAAS;QAC/B,SAAS,EAAE,MAAM,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,mBAAmB,EAAE,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,oBAAoB,CAAC;QACzB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC;QAC1C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS;QACpC,YAAY,EAAE,mBAAmB,EAAE;QACnC,mBAAmB,EAAE,SAAS,CAAC,KAAK,CAAC,mBAAmB;KACzD,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,IAAI,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,IAAI,CAAC,QAAQ,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { loadCliConfig } from '../lib/config.js';
|
|
4
|
+
import { logger } from '../lib/logger.js';
|
|
5
|
+
import { runAnnotationGeneration } from '../lib/annotations/run-annotation-generation.js';
|
|
6
|
+
import { buildAnnotatedBundle } from '../lib/bundle/annotated-bundle.js';
|
|
7
|
+
import { resolveShellDistDir } from '../lib/bundle/shell-dist.js';
|
|
8
|
+
import { scanProject } from '../lib/project/project-scan.js';
|
|
9
|
+
import { capturePrototype } from '../lib/prototype/prototype-session.js';
|
|
10
|
+
import { discoverRequirements } from '../lib/requirements/requirements-discovery.js';
|
|
11
|
+
import { createWorkspaceStore } from '../lib/workspace/workspace-store.js';
|
|
12
|
+
export async function startCommand(args) {
|
|
13
|
+
const config = loadCliConfig(args);
|
|
14
|
+
const packageJsonPath = resolve(config.cwd, 'package.json');
|
|
15
|
+
if (!existsSync(packageJsonPath)) {
|
|
16
|
+
throw new Error(`当前目录不是可识别的前端项目:缺少 package.json(${config.cwd})`);
|
|
17
|
+
}
|
|
18
|
+
const workspace = createWorkspaceStore({
|
|
19
|
+
projectRoot: config.cwd,
|
|
20
|
+
workspaceRoot: config.workspace,
|
|
21
|
+
outputDir: config.outDir,
|
|
22
|
+
});
|
|
23
|
+
await workspace.ensure();
|
|
24
|
+
let scan = await scanProject(config.cwd);
|
|
25
|
+
const requirements = await discoverRequirements(config.cwd);
|
|
26
|
+
const capture = await capturePrototype(config.cwd, scan, workspace.paths, {
|
|
27
|
+
cwd: config.cwd,
|
|
28
|
+
workspace: config.workspace,
|
|
29
|
+
pages: config.pages,
|
|
30
|
+
aiPages: config.aiPages,
|
|
31
|
+
maxPages: config.maxPages,
|
|
32
|
+
noCrawl: config.noCrawl,
|
|
33
|
+
yes: config.yes,
|
|
34
|
+
});
|
|
35
|
+
scan = capture.scan;
|
|
36
|
+
for (const item of capture.snapshots) {
|
|
37
|
+
await workspace.writePageSnapshot(item.fileName, item.snapshot);
|
|
38
|
+
}
|
|
39
|
+
const annotationGeneration = await runAnnotationGeneration({
|
|
40
|
+
noAi: config.noAi,
|
|
41
|
+
snapshots: capture.snapshots.map((item) => item.snapshot),
|
|
42
|
+
aiRoutes: capture.aiRoutes,
|
|
43
|
+
requirements,
|
|
44
|
+
});
|
|
45
|
+
const metadata = await workspace.upsertWorkspaceMetadata({
|
|
46
|
+
name: config.projectName,
|
|
47
|
+
no_ai: config.noAi,
|
|
48
|
+
framework: scan.framework,
|
|
49
|
+
entry_url: capture.entryUrl,
|
|
50
|
+
});
|
|
51
|
+
await workspace.writeProjectScan(scan);
|
|
52
|
+
await workspace.writeRequirementsContext(requirements);
|
|
53
|
+
await workspace.writeAnnotationsSeed(annotationGeneration.seed);
|
|
54
|
+
const bundleManifest = await buildBundleIfPossible(config.cwd, scan.artifact_dirs[0], workspace.paths);
|
|
55
|
+
logger.success('DesignMaker 工作区已准备完成');
|
|
56
|
+
logger.info(`项目目录:${metadata.project_root}`);
|
|
57
|
+
logger.info(`工作区:${metadata.workspace_root}`);
|
|
58
|
+
logger.info(`输出目录:${metadata.output_dir}`);
|
|
59
|
+
logger.info(`框架:${scan.framework}`);
|
|
60
|
+
logger.info(`包管理器:${scan.package_manager}`);
|
|
61
|
+
logger.info(`静态产物目录:${scan.artifact_dirs.length > 0 ? scan.artifact_dirs.join(', ') : '未发现'}`);
|
|
62
|
+
logger.info(`启动策略:${scan.startup_strategy ?? '未确定'}`);
|
|
63
|
+
logger.info(`发现路由:${capture.routes.join(', ')}`);
|
|
64
|
+
logger.info(`AI 标注路由:${capture.aiRoutes.join(', ')}`);
|
|
65
|
+
logger.info(`入口 URL:${scan.resolved_entry_url ?? '未生成'}`);
|
|
66
|
+
logger.info(`快照页数:${capture.snapshots.length}`);
|
|
67
|
+
logger.info(`页面快照:${capture.snapshots.length > 0
|
|
68
|
+
? capture.snapshots.map((item) => item.fileName).join(', ')
|
|
69
|
+
: '未生成'}`);
|
|
70
|
+
logger.info(`AI 调用页数:${config.noAi ? 0 : capture.aiRoutes.length}`);
|
|
71
|
+
logger.info(`初始标注数:${annotationGeneration.seed.annotations.length}`);
|
|
72
|
+
logger.info(`标注版产物:${bundleManifest ? workspace.paths.outputDir : '未生成'}`);
|
|
73
|
+
logger.info(`候选需求文档:${requirements.candidate_files.length}`);
|
|
74
|
+
logger.info(`已选择需求文档:${requirements.selected_files.length > 0 ? requirements.selected_files.join(', ') : '未发现'}`);
|
|
75
|
+
logger.info(`标注生成模式:${formatAnnotationGenerationMode(annotationGeneration.mode)}`);
|
|
76
|
+
logger.info('');
|
|
77
|
+
logger.info('下一步可以打开标注版产物,验证标注展示、编辑与导出。');
|
|
78
|
+
}
|
|
79
|
+
function formatAnnotationGenerationMode(mode) {
|
|
80
|
+
switch (mode) {
|
|
81
|
+
case 'no-ai':
|
|
82
|
+
return '跳过 AI(--no-ai)';
|
|
83
|
+
case 'heuristic':
|
|
84
|
+
return '本地启发式草稿(未发送到远程模型)';
|
|
85
|
+
case 'openai':
|
|
86
|
+
return 'OpenAI 兼容 provider';
|
|
87
|
+
case 'empty':
|
|
88
|
+
return '空种子降级';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function buildBundleIfPossible(projectRoot, artifactDir, paths) {
|
|
92
|
+
if (!artifactDir) {
|
|
93
|
+
logger.warn('未发现可打包的静态产物,跳过标注版静态项目生成。');
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return buildAnnotatedBundle({
|
|
97
|
+
artifactDir: join(projectRoot, artifactDir),
|
|
98
|
+
outputDir: paths.outputDir,
|
|
99
|
+
shellDistDir: resolveShellDistDir(),
|
|
100
|
+
annotationsSeedPath: paths.annotationsSeedJson,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
3
|
+
import { importCommand } from './commands/import.js';
|
|
4
|
+
import { rebuildCommand } from './commands/rebuild.js';
|
|
5
|
+
import { startCommand } from './commands/start.js';
|
|
6
|
+
import { logger } from './lib/logger.js';
|
|
7
|
+
async function main(argv) {
|
|
8
|
+
const [command = 'start', ...args] = argv;
|
|
9
|
+
switch (command) {
|
|
10
|
+
case 'start':
|
|
11
|
+
await startCommand(args);
|
|
12
|
+
return;
|
|
13
|
+
case 'import':
|
|
14
|
+
await importCommand(args);
|
|
15
|
+
return;
|
|
16
|
+
case 'rebuild':
|
|
17
|
+
await rebuildCommand(args);
|
|
18
|
+
return;
|
|
19
|
+
case 'doctor':
|
|
20
|
+
await doctorCommand(args);
|
|
21
|
+
return;
|
|
22
|
+
case '--help':
|
|
23
|
+
case '-h':
|
|
24
|
+
case 'help':
|
|
25
|
+
printHelp();
|
|
26
|
+
return;
|
|
27
|
+
default:
|
|
28
|
+
throw new Error(`未知命令:${command}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function printHelp() {
|
|
32
|
+
logger.info(`DesignMaker CLI
|
|
33
|
+
|
|
34
|
+
Usage:
|
|
35
|
+
designmaker start [--cwd <path>] [--workspace <path>] [--out-dir <path>] [--no-ai] [--yes]
|
|
36
|
+
[--pages <paths>] [--ai-pages <paths>] [--max-pages <n>] [--no-crawl]
|
|
37
|
+
designmaker import <annotations.json> [--cwd <path>] [--workspace <path>] [--out-dir <path>]
|
|
38
|
+
designmaker rebuild [--cwd <path>] [--workspace <path>] [--out-dir <path>]
|
|
39
|
+
designmaker doctor [--cwd <path>]
|
|
40
|
+
|
|
41
|
+
Options:
|
|
42
|
+
--cwd <path> 原型项目目录,默认当前目录
|
|
43
|
+
--workspace <path> 工作区目录,默认 <cwd>/.designmaker
|
|
44
|
+
--out-dir <path> 标注版静态产物目录,默认 <workspace>/annotated-bundle
|
|
45
|
+
--no-ai 跳过 AI,进入手动标注流程
|
|
46
|
+
--yes 跳过交互确认;默认仅对首页 / 生成 AI 标注
|
|
47
|
+
--pages <paths> 逗号分隔路由列表,覆盖自动发现(如 /,/settings)
|
|
48
|
+
--ai-pages <paths> 逗号分隔 AI 标注路由,跳过交互(须为 routes 子集)
|
|
49
|
+
--max-pages <n> 路由发现/快照上限,默认 10
|
|
50
|
+
--no-crawl 禁用链接爬取,仅采集首页 /
|
|
51
|
+
|
|
52
|
+
Commands:
|
|
53
|
+
doctor 检查 Node、内置 Shell、Playwright Chromium 与项目目录
|
|
54
|
+
|
|
55
|
+
Tip: On first use, after installing CLI and Chromium, run \`designmaker doctor\`
|
|
56
|
+
before \`start\`, \`import\`, or \`rebuild\`. Re-run when you change machines
|
|
57
|
+
or hit environment errors (e.g. missing Chromium).
|
|
58
|
+
`);
|
|
59
|
+
}
|
|
60
|
+
main(process.argv.slice(2)).catch((error) => {
|
|
61
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
62
|
+
logger.error(message);
|
|
63
|
+
process.exitCode = 1;
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAE1C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO;QACT,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO;QACT,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,SAAS,EAAE,CAAC;YACZ,OAAO;QACT;YACE,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC,CAAC;AACH,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PageSnapshot, RequirementsContext } from '../workspace/types.js';
|
|
2
|
+
export interface AnnotationPrompt {
|
|
3
|
+
system: string;
|
|
4
|
+
user: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function buildAnnotationPrompt(snapshot: PageSnapshot, requirements: RequirementsContext): AnnotationPrompt;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function buildAnnotationPrompt(snapshot, requirements) {
|
|
2
|
+
return {
|
|
3
|
+
system: '你是 DesignMaker 的结构化原型标注助手。只输出 JSON,不输出 Markdown。标注必须可供 PM 二次编辑,不要假装已经最终确认。',
|
|
4
|
+
user: JSON.stringify({
|
|
5
|
+
task: '根据页面可见文本、DOM 摘要和需求资料生成页面标注草稿。',
|
|
6
|
+
output_schema: {
|
|
7
|
+
annotations: [
|
|
8
|
+
{
|
|
9
|
+
title: 'string',
|
|
10
|
+
description: 'string',
|
|
11
|
+
business_rule: 'string',
|
|
12
|
+
validation_rule: 'string',
|
|
13
|
+
acceptance_criteria: 'string',
|
|
14
|
+
anchor_hint: {
|
|
15
|
+
selector_hint: 'string',
|
|
16
|
+
text_signature: 'string',
|
|
17
|
+
anchor_x: 'number',
|
|
18
|
+
anchor_y: 'number',
|
|
19
|
+
anchor_w: 'number',
|
|
20
|
+
anchor_h: 'number',
|
|
21
|
+
},
|
|
22
|
+
confidence: 'number between 0 and 1',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
page: {
|
|
27
|
+
page_key: snapshot.page_key,
|
|
28
|
+
title: snapshot.title,
|
|
29
|
+
url: snapshot.url,
|
|
30
|
+
visible_text: snapshot.visible_text,
|
|
31
|
+
dom_summary: snapshot.dom_summary,
|
|
32
|
+
},
|
|
33
|
+
requirements: {
|
|
34
|
+
selected_files: requirements.selected_files,
|
|
35
|
+
combined_text: requirements.combined_text,
|
|
36
|
+
},
|
|
37
|
+
}, null, 2),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=build-annotation-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-annotation-prompt.js","sourceRoot":"","sources":["../../../src/lib/ai/build-annotation-prompt.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,qBAAqB,CACnC,QAAsB,EACtB,YAAiC;IAEjC,OAAO;QACL,MAAM,EACJ,4EAA4E;QAC9E,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;YACE,IAAI,EAAE,+BAA+B;YACrC,aAAa,EAAE;gBACb,WAAW,EAAE;oBACX;wBACE,KAAK,EAAE,QAAQ;wBACf,WAAW,EAAE,QAAQ;wBACrB,aAAa,EAAE,QAAQ;wBACvB,eAAe,EAAE,QAAQ;wBACzB,mBAAmB,EAAE,QAAQ;wBAC7B,WAAW,EAAE;4BACX,aAAa,EAAE,QAAQ;4BACvB,cAAc,EAAE,QAAQ;4BACxB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,QAAQ;yBACnB;wBACD,UAAU,EAAE,wBAAwB;qBACrC;iBACF;aACF;YACD,IAAI,EAAE;gBACJ,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,WAAW,EAAE,QAAQ,CAAC,WAAW;aAClC;YACD,YAAY,EAAE;gBACZ,cAAc,EAAE,YAAY,CAAC,cAAc;gBAC3C,aAAa,EAAE,YAAY,CAAC,aAAa;aAC1C;SACF,EACD,IAAI,EACJ,CAAC,CACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AnnotationsSeed, PageSnapshot, RequirementsContext } from '../../workspace/types.js';
|
|
2
|
+
export interface AnnotationProviderInput {
|
|
3
|
+
snapshot: PageSnapshot;
|
|
4
|
+
requirements: RequirementsContext;
|
|
5
|
+
}
|
|
6
|
+
export interface AnnotationProvider {
|
|
7
|
+
name: 'heuristic' | 'openai';
|
|
8
|
+
generate: (input: AnnotationProviderInput) => Promise<AnnotationsSeed>;
|
|
9
|
+
}
|
|
10
|
+
export declare function createAnnotationProvider(): AnnotationProvider;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readEnv } from '../../env.js';
|
|
2
|
+
import { logger } from '../../logger.js';
|
|
3
|
+
import { generateHeuristicAnnotations } from '../../annotations/annotation-generator.js';
|
|
4
|
+
import { generateOpenAiAnnotations } from './openai.js';
|
|
5
|
+
export function createAnnotationProvider() {
|
|
6
|
+
const providerName = readEnv('DESIGNMAKER_AI_PROVIDER');
|
|
7
|
+
if (providerName === 'openai') {
|
|
8
|
+
const allowRemote = readEnv('DESIGNMAKER_ALLOW_REMOTE_AI') === '1';
|
|
9
|
+
const apiKey = readEnv('OPENAI_API_KEY');
|
|
10
|
+
if (!allowRemote || !apiKey) {
|
|
11
|
+
logger.warn('已选择 openai provider,但未同时设置 DESIGNMAKER_ALLOW_REMOTE_AI=1 和 OPENAI_API_KEY,将使用本地启发式草稿。');
|
|
12
|
+
return createHeuristicProvider();
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
name: 'openai',
|
|
16
|
+
generate: async (input) => generateOpenAiAnnotations(input, { apiKey }),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return createHeuristicProvider();
|
|
20
|
+
}
|
|
21
|
+
function createHeuristicProvider() {
|
|
22
|
+
return {
|
|
23
|
+
name: 'heuristic',
|
|
24
|
+
generate: async (input) => generateHeuristicAnnotations(input),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/ai/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAEzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAYxD,MAAM,UAAU,wBAAwB;IACtC,MAAM,YAAY,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAExD,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,6BAA6B,CAAC,KAAK,GAAG,CAAC;QACnE,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CACT,uFAAuF,CACxF,CAAC;YACF,OAAO,uBAAuB,EAAE,CAAC;QACnC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,yBAAyB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC;IAED,OAAO,uBAAuB,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,4BAA4B,CAAC,KAAK,CAAC;KAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AnnotationsSeed, PageSnapshot, RequirementsContext } from '../../workspace/types.js';
|
|
2
|
+
interface OpenAiOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function generateOpenAiAnnotations(input: {
|
|
6
|
+
snapshot: PageSnapshot;
|
|
7
|
+
requirements: RequirementsContext;
|
|
8
|
+
}, options: OpenAiOptions): Promise<AnnotationsSeed>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readEnv } from '../../env.js';
|
|
3
|
+
import { buildAnnotationPrompt } from '../build-annotation-prompt.js';
|
|
4
|
+
import { aiAnnotationResponseSchema } from './response-schema.js';
|
|
5
|
+
export async function generateOpenAiAnnotations(input, options) {
|
|
6
|
+
const prompt = buildAnnotationPrompt(input.snapshot, input.requirements);
|
|
7
|
+
const baseUrl = readEnv('OPENAI_BASE_URL') ?? 'https://api.openai.com/v1';
|
|
8
|
+
const model = readEnv('OPENAI_MODEL') ?? 'gpt-4o-mini';
|
|
9
|
+
const response = await fetch(`${baseUrl.replace(/\/$/, '')}/chat/completions`, {
|
|
10
|
+
method: 'POST',
|
|
11
|
+
headers: {
|
|
12
|
+
Authorization: `Bearer ${options.apiKey}`,
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
},
|
|
15
|
+
body: JSON.stringify({
|
|
16
|
+
model,
|
|
17
|
+
temperature: 0.2,
|
|
18
|
+
response_format: { type: 'json_object' },
|
|
19
|
+
messages: [
|
|
20
|
+
{ role: 'system', content: prompt.system },
|
|
21
|
+
{ role: 'user', content: prompt.user },
|
|
22
|
+
],
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
throw new Error(`OpenAI 兼容接口调用失败:HTTP ${response.status}`);
|
|
27
|
+
}
|
|
28
|
+
const payload = (await response.json());
|
|
29
|
+
const content = payload.choices?.[0]?.message?.content;
|
|
30
|
+
if (!content) {
|
|
31
|
+
throw new Error('OpenAI 兼容接口未返回 message.content');
|
|
32
|
+
}
|
|
33
|
+
const parsed = aiAnnotationResponseSchema.parse(JSON.parse(content));
|
|
34
|
+
return {
|
|
35
|
+
annotations: parsed.annotations.map((draft, index) => {
|
|
36
|
+
const anchor = findBestAnchor(input.snapshot, draft.anchor_hint.selector_hint, draft.anchor_hint.text_signature);
|
|
37
|
+
return {
|
|
38
|
+
id: createOpenAiAnnotationId(input.snapshot.page_key, index),
|
|
39
|
+
page_key: input.snapshot.page_key,
|
|
40
|
+
title: draft.title,
|
|
41
|
+
description: draft.description,
|
|
42
|
+
business_rule: draft.business_rule,
|
|
43
|
+
validation_rule: draft.validation_rule,
|
|
44
|
+
acceptance_criteria: draft.acceptance_criteria,
|
|
45
|
+
source: 'ai',
|
|
46
|
+
confidence: draft.confidence,
|
|
47
|
+
selector_hint: draft.anchor_hint.selector_hint ?? anchor?.selector_hint ?? '',
|
|
48
|
+
text_signature: draft.anchor_hint.text_signature ?? anchor?.text ?? '',
|
|
49
|
+
anchor_x: draft.anchor_hint.anchor_x ?? anchor?.bounding_box.x ?? 0,
|
|
50
|
+
anchor_y: draft.anchor_hint.anchor_y ?? anchor?.bounding_box.y ?? 0,
|
|
51
|
+
anchor_w: draft.anchor_hint.anchor_w ?? anchor?.bounding_box.width ?? 0,
|
|
52
|
+
anchor_h: draft.anchor_hint.anchor_h ?? anchor?.bounding_box.height ?? 0,
|
|
53
|
+
hidden: false,
|
|
54
|
+
};
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function createOpenAiAnnotationId(pageKey, index) {
|
|
59
|
+
const slug = pageKey === '/' ? 'root' : pageKey.replace(/^\//, '').replace(/[^a-zA-Z0-9_-]+/g, '_');
|
|
60
|
+
const hash = createHash('sha1')
|
|
61
|
+
.update(`${pageKey}|${index}|${Date.now().toString(36)}`)
|
|
62
|
+
.digest('hex')
|
|
63
|
+
.slice(0, 8);
|
|
64
|
+
return `ai_${slug}_${index}_${hash}`;
|
|
65
|
+
}
|
|
66
|
+
function findBestAnchor(snapshot, selectorHint, textSignature) {
|
|
67
|
+
if (selectorHint) {
|
|
68
|
+
const bySelector = snapshot.dom_summary.find((item) => item.selector_hint === selectorHint);
|
|
69
|
+
if (bySelector)
|
|
70
|
+
return bySelector;
|
|
71
|
+
}
|
|
72
|
+
if (textSignature) {
|
|
73
|
+
return snapshot.dom_summary.find((item) => item.text.includes(textSignature));
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../../src/lib/ai/providers/openai.ts"],"names":[],"mappings":"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"}
|