返回 DeepSeek-Reasonix
docs_manifest.go
根目录 / internal / cli / docs_manifest.go
1 package cli
2
3 import (
4 "encoding/json"
5 "flag"
6 "fmt"
7 "os"
8 "path/filepath"
9 "strings"
10
11 "reasonix/internal/productdocs"
12 )
13
14 // docsManifestCommand is an intentionally undocumented release/diagnostic
15 // command. User-facing retrieval stays on /docs and the read-only docs tool;
16 // release jobs use this command to inspect the compiled corpus before publish.
17 func docsManifestCommand(args []string, cliVersion string) int {
18 flags := flag.NewFlagSet("docs-manifest", flag.ContinueOnError)
19 flags.SetOutput(os.Stderr)
20 verifySource := flags.String("verify-source", "", "compare the embedded corpus with a Reasonix source root")
21 expectVersion := flags.String("expect-version", "", "require this embedded product version")
22 expectRevision := flags.String("expect-revision", "", "require this embedded source revision")
23 if err := flags.Parse(args); err != nil {
24 return 2
25 }
26 if flags.NArg() != 0 {
27 fmt.Fprintln(os.Stderr, "error: docs-manifest accepts flags only")
28 return 2
29 }
30
31 manifest, err := productdocs.EmbeddedManifest()
32 if err != nil {
33 fmt.Fprintln(os.Stderr, "error: load embedded documentation:", err)
34 return 1
35 }
36 if manifest.Version != strings.TrimSpace(cliVersion) {
37 fmt.Fprintf(os.Stderr, "error: docs build version %q does not match CLI version %q\n", manifest.Version, cliVersion)
38 return 1
39 }
40 if expected := strings.TrimSpace(*expectVersion); expected != "" && manifest.Version != expected {
41 fmt.Fprintf(os.Stderr, "error: docs build version %q, expected %q\n", manifest.Version, expected)
42 return 1
43 }
44 if expected := strings.TrimSpace(*expectRevision); expected != "" && manifest.Revision != expected {
45 fmt.Fprintf(os.Stderr, "error: docs source revision %q, expected %q\n", manifest.Revision, expected)
46 return 1
47 }
48 if sourceDir := strings.TrimSpace(*verifySource); sourceDir != "" {
49 source, err := productdocs.SourceManifest(
50 os.DirFS(filepath.Join(sourceDir, "docs")),
51 os.DirFS(filepath.Join(sourceDir, "release-notes")),
52 )
53 if err != nil {
54 fmt.Fprintln(os.Stderr, "error: load source documentation:", err)
55 return 1
56 }
57 if manifest.Digest != source.Digest || manifest.Documents != source.Documents || manifest.Sections != source.Sections || manifest.ReleaseNotes != source.ReleaseNotes {
58 fmt.Fprintf(os.Stderr, "error: embedded docs do not match %s: embedded=%s/%d/%d/%d source=%s/%d/%d/%d\n",
59 sourceDir, manifest.Digest, manifest.Documents, manifest.Sections, manifest.ReleaseNotes,
60 source.Digest, source.Documents, source.Sections, source.ReleaseNotes)
61 return 1
62 }
63 }
64
65 encoded, err := json.Marshal(manifest)
66 if err != nil {
67 fmt.Fprintln(os.Stderr, "error: encode docs manifest:", err)
68 return 1
69 }
70 fmt.Println(string(encoded))
71 return 0
72 }
73
73 lines GO