101 lines
4.9 KiB
JavaScript
101 lines
4.9 KiB
JavaScript
const BASE = 'http://localhost:3002';
|
|
const PID = 'b1b5884e-ba85-4d8f-9a92-e524603587a0';
|
|
|
|
async function main() {
|
|
const login = await fetch(`${BASE}/api/auth/login`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ password: '620f4c96' })
|
|
});
|
|
const { token } = await login.json();
|
|
const auth = { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` };
|
|
|
|
// Create default standard with empty category_tag
|
|
const stdBody = {
|
|
name: '默认标准(10维度)',
|
|
content: `## 场景价值与合理性(10分)
|
|
评审 docs/ 目录下的场景论述文档。检查是否有业务场景文档,如果没有→0分。场景是否真实、Agent是否不可替代、ROI是否可量化。
|
|
## 开发范式应用(10分)
|
|
寻找开发范式证据:.speckit/目录或spec文件(spec-first范式)、.cursorrules/CLAUDE.md/AGENTS.md(规则先行)、测试文件结构(TDD证据)。如果没有证据→说明未应用。
|
|
## 架构设计(10分)
|
|
形式图+AI日志标签验证。模块化程度、分层设计、数据流清晰度。如果有 DESIGN.md 或 docs/design.md 优先审阅。
|
|
## 工具使用与集成深度(10分)
|
|
IDE集成(VSCode插件/webview等)、API/Skill调用方式、外部工具使用深度。
|
|
## Agent核心能力(20分)
|
|
自主性:Agent是否能自主完成感知-规划-决策闭环。工具调用:是否集成外部工具/API,调用方式是否正确。异常恢复:是否有重试/降级/错误处理机制。多轮交互:是否支持用户的多轮确认和澄清。
|
|
## 实现完整度与稳定性(10分)
|
|
代码功能是否完整、核心路径是否可通。边界处理、输入验证是否完善。错误处理是否健壮。
|
|
## 规模与功能点(15分)
|
|
以功能点数量为主要依据,代码行数仅作参考。小规模(<=5功能点)5-7分;中规模(6-10功能点)8-11分;大规模(>10功能点)12-15分。
|
|
## 演示与文档(5分)
|
|
评审 docs/ 目录下的设计书、测试用例、测试报告等文档完整性。如果没有任何文档→0分。检查设计文档、测试用例、测试报告、README是否齐全。
|
|
## AI使用日志(5分)
|
|
AGENTS.md 和 CLAUDE.md 也是有效的AI使用日志。评审日志是否覆盖需求/设计/编码/测试阶段,每条日志是否标注了使用的AI工具和提示词。
|
|
## 效果与数据(5分)
|
|
评审测试结果数据(来自测试报告)。是否有量化的成功率/覆盖率/性能数据,数据是否真实可复现。`,
|
|
category_tag: ''
|
|
};
|
|
const sr = await fetch(`${BASE}/api/projects/${PID}/standards`, {
|
|
method: 'POST', headers: auth,
|
|
body: JSON.stringify(stdBody)
|
|
});
|
|
const srData = await sr.text();
|
|
console.log('CREATE DEFAULT STD:', sr.status, srData.slice(0, 100));
|
|
|
|
// Now create an entry without category_tag (will use default)
|
|
const r = await fetch(`${BASE}/api/projects/${PID}/entries`, {
|
|
method: 'POST', headers: auth,
|
|
body: JSON.stringify({
|
|
title: 'cobol-java-10维度验证',
|
|
repo_url: 'https://gittea.dev/hangshuo652/jcl-cobol-git',
|
|
participant: 'hangshuo'
|
|
})
|
|
});
|
|
const text = await r.text();
|
|
console.log('CREATE ENTRY:', r.status, text.slice(0, 200));
|
|
|
|
if (r.ok) {
|
|
const entry = JSON.parse(text);
|
|
// Start review
|
|
const s = await fetch(`${BASE}/api/projects/${PID}/entries/${entry.id}/start`, {
|
|
method: 'POST', headers: auth
|
|
});
|
|
console.log('START:', s.status, await s.text());
|
|
return entry.id;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
main().then(id => {
|
|
if (id) {
|
|
// Poll
|
|
const poll = async () => {
|
|
const login = await fetch(`${BASE}/api/auth/login`, {
|
|
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ password: '620f4c96' })
|
|
});
|
|
const { token } = await login.json();
|
|
const auth = { 'Authorization': `Bearer ${token}` };
|
|
for (let i = 0; i < 12; i++) {
|
|
await new Promise(r => setTimeout(r, 15000));
|
|
const res = await fetch(`${BASE}/api/projects/${PID}/entries/${id}`, { headers: auth });
|
|
const data = await res.json();
|
|
const logs = JSON.parse(data.progress_log || '[]');
|
|
console.log(`POLL_${i}: STATUS=${data.status} RAW=${data.raw_score} FINAL=${data.final_score} LOGS=${logs.length}`);
|
|
if (data.status === 'review_done') {
|
|
const report = JSON.parse(data.ai_report);
|
|
console.log(`SCORE: ${report.pct} (${report.totalScore}/${report.maxTotal})`);
|
|
report.dimensions.forEach(d => console.log(` ${d.name}: ${d.score}/${d.maxScore}`));
|
|
logs.forEach(l => console.log(` LOG: ${l.status || ''} ${(l.msg || '').slice(0, 60)}`));
|
|
break;
|
|
}
|
|
if (data.status?.includes('_fail') || data.status === 'failed') {
|
|
console.log('FAILED:', data.progress_log);
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
poll();
|
|
}
|
|
}).catch(console.error);
|