feat(daemon-beta B2): 萃取品質 lint(H1–H6)重新接到現行 direct.go
Gitea #24:分支 work/b2-quality-lint-0726(2f3e9ec)躺在 main 外兩週, 今天重新整合進現行 direct.go(原分支落後 main 130+ 筆,direct.go 本身 差 667 行,需要真正的整合工作而非硬併,見 wiki status.md 與頂層 daemon-beta/tasks.md 已記載的殘項)。 - collector/lint.go/lint_test.go:package main → package collector (main.go 在 4a26856/v0.18.9 已從兩支執行檔併成一支,整個 collector/ 目錄已改名 package collector;分支停在改名之前)。 - collector/main.go:func main() → func Run(args []string) int (同一次重構),新增 case "lint" 呼叫 runLint。 - collector/direct.go:DirectConfig.LintStrict 欄位+extractor 萃完、 POST rag_ingest_card 前掛 LintCard 閘(硬缺→不送標 rejected; 軟項→照送帶 quality:low+quality_warnings);CLI --strict 旗標。 - 既有測試共用的 cardFixture(direct_extract_test.go)/direct_pacing_test.go 三處 inline 卡片,從「兩段最簡卡」補成 B2 合格四段卡——不是新增例外, 是 lint 正確地在做它的事,舊卡片本來就不合格。 驗證:go build/vet/test ./... 全綠;另以真實 PDF(docs/onboarding/封測說明.pdf, 2MB 二進位)跑過完整 direct.go 同步鏈,證實送進 Gemini 的 prompt 是 5,071 字乾淨中文(0 個控制字元/NUL),不是原始位元組——ConvertToText (t73)已完整解決 900b895 想止血的問題,故該分支的 looksLikeText 二進位止血、Windows 交叉編譯腳本判定作廢,不併。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -83,6 +83,8 @@ func Run(args []string) int {
|
||||
return run(args[1:], runMode{withUpload: true, withTrigger: true})
|
||||
case "direct":
|
||||
return runDirect(args[1:])
|
||||
case "lint":
|
||||
return runLint(args[1:])
|
||||
case "template-install":
|
||||
return runTemplateInstall(args[1:])
|
||||
default:
|
||||
@@ -244,3 +246,43 @@ func fail(err error) int {
|
||||
fmt.Fprintln(os.Stderr, "collector:", err)
|
||||
return 1
|
||||
}
|
||||
|
||||
// runLint 是 `collector lint <卡片.md>` 子命令:對一張卡跑 B2 品質檢查(H1–H6)。
|
||||
// 印出分級 JSON;被擋(硬缺,或 --strict 下含軟項)=exit 1,方便腳本/CI 銷帳(施工順序步驟 4)。
|
||||
func runLint(args []string) int {
|
||||
fs := newFlagSet()
|
||||
strict := fs.Bool("strict", false, "軟項(H3/H4/H6)也算擋(測試/CI)")
|
||||
source := fs.String("source", "", "原稿檔路徑(H6 相似度需要;不給=跳過 H6)")
|
||||
if err := fs.Parse(args); err != nil {
|
||||
return 2
|
||||
}
|
||||
if fs.NArg() < 1 {
|
||||
fmt.Fprintln(os.Stderr, "用法:collector lint <卡片.md> [--source <原稿>] [--strict]")
|
||||
return 2
|
||||
}
|
||||
card, err := os.ReadFile(fs.Arg(0))
|
||||
if err != nil {
|
||||
return fail(err)
|
||||
}
|
||||
var src string
|
||||
if *source != "" {
|
||||
b, serr := os.ReadFile(*source)
|
||||
if serr != nil {
|
||||
return fail(serr)
|
||||
}
|
||||
src = string(b)
|
||||
}
|
||||
res := LintCard(string(card), LintOptions{Source: src})
|
||||
blocked := res.Blocks(*strict)
|
||||
out, _ := json.MarshalIndent(struct {
|
||||
Card string `json:"card"`
|
||||
Strict bool `json:"strict"`
|
||||
Blocked bool `json:"blocked"`
|
||||
Result LintResult `json:"result"`
|
||||
}{fs.Arg(0), *strict, blocked, res}, "", " ")
|
||||
fmt.Println(string(out))
|
||||
if blocked {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user