diff --git a/docs/structure/cockpit-e2e.yaml b/docs/structure/cockpit-e2e.yaml new file mode 100644 index 00000000..9f54de42 --- /dev/null +++ b/docs/structure/cockpit-e2e.yaml @@ -0,0 +1,8 @@ +project: 审计演示项目 +docs: + - type: bd_research + title: 验证主体报告 + sections: + - title: 概述 + - title: 设计说明 + - title: 验证结论 diff --git a/scripts/e2e.sh b/scripts/e2e.sh index 5bbf8df6..5aaeedfe 100644 --- a/scripts/e2e.sh +++ b/scripts/e2e.sh @@ -219,6 +219,32 @@ log "seed: ingest corpus into $PID_MAIN" cmd rdm.ingest "{\"projectId\":\"$PID_MAIN\",\"source\":\"01-用户需求与系统需求.md\",\"stage\":\"BD\",\"text\":$(python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))' <<<"$SEED_MD")}" >/dev/null log "seed done" +# ── 驾驶舱 I4 种子:文档树 + 章节正文(草稿流)+ 非成员账号 ── +log "seed: load cockpit doc-tree into $PID_MAIN" +"$OUT/agent-system-rdm" -data "$DATA" \ + -structure "$DEV_ROOT/docs/structure/cockpit-e2e.yaml" -project "$PID_MAIN" \ + >"$OUT/structure-cockpit.log" 2>&1 || { tail -5 "$OUT/structure-cockpit.log"; die "cockpit structure load failed"; } +log "seed: cockpit section content via draft propose+adopt" +COCKPIT_OV=$(cmd rdm.cockpit.overview "{\"projectId\":\"$PID_MAIN\"}") +DOC_ID=$(printf '%s' "$COCKPIT_OV" | python3 -c 'import json,sys; d=json.load(sys.stdin); print([i["ref"]["id"] for i in d["documents"] if i["title"]=="验证主体报告"][0])') +SEC_JSON=$(cmd rdm.cockpit.tree "{\"projectId\":\"$PID_MAIN\",\"parent\":\"$DOC_ID\"}") +SEC_OVERVIEW=$(printf '%s' "$SEC_JSON" | python3 -c 'import json,sys; d=json.load(sys.stdin); print([i["ref"]["id"] for i in d["items"] if i["title"]=="概述"][0])') +SEC_DESIGN=$(printf '%s' "$SEC_JSON" | python3 -c 'import json,sys; d=json.load(sys.stdin); print([i["ref"]["id"] for i in d["items"] if i["title"]=="设计说明"][0])') +PROP=$(cmd rdm.draft.propose "{\"projectId\":\"$PID_MAIN\",\"sectionId\":\"$SEC_OVERVIEW\",\"content\":\"本报告给出验证主体、结论与证据链的总体视图。\"}") +PROP_ID=$(printf '%s' "$PROP" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d.get("proposalId") or d.get("id"))') +cmd rdm.draft.adopt "{\"projectId\":\"$PID_MAIN\",\"proposalId\":\"$PROP_ID\"}" >/dev/null +PROP=$(cmd rdm.draft.propose "{\"projectId\":\"$PID_MAIN\",\"sectionId\":\"$SEC_DESIGN\",\"content\":\"设计说明:两树一网领域事实经驾驶舱只读投影呈现。\"}") +PROP_ID=$(printf '%s' "$PROP" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d.get("proposalId") or d.get("id"))') +cmd rdm.draft.adopt "{\"projectId\":\"$PID_MAIN\",\"proposalId\":\"$PROP_ID\"}" >/dev/null +# 场景 4 驱动用:留一个未采纳提案(浏览器内经 API 采纳后观察投影一致)。 +cmd rdm.draft.propose "{\"projectId\":\"$PID_MAIN\",\"sectionId\":\"$SEC_DESIGN\",\"content\":\"一致性探针内容。\"}" >/dev/null +log "seed: second account (non-member negative case)" +"$OUT/agent-system" user create --data "$DATA" --owner e2e-reader --out-file "$OUT/e2e-reader.bootstrap.key" >/dev/null || die "reader create failed" +K2=$(cat "$OUT/e2e-reader.bootstrap.key") +JAR2="$OUT/reader.jar" +curl -sf -c "$JAR2" -X POST "$API_BASE/api/auth/login-key/redeem" -H 'Content-Type: application/json' -d "{\"key\":\"$K2\",\"owner\":\"e2e-reader\"}" >/dev/null || die "reader redeem failed" +curl -sf -b "$JAR2" -c "$JAR2" -X POST "$API_BASE/api/auth/password" -H 'Content-Type: application/json' -d "{\"next\":\"E2eReader#2026\"}" >/dev/null || die "reader password setup failed" + # ── 3. 验收 ───────────────────────────────────────────── if [ "$SEED_ONLY" = 1 ]; then log "seed-only mode: api=$API_BASE ui=next;cookie jar=$JAR;数据=$DATA"