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);