@@ -42,7 +42,8 @@ var generateCmd = &cobra.Command{
4242 Short : "Generate an AI-aware BOM (AIBOM)" ,
4343 Long : "Scans the target path for AI Hugginface imports and produces a CycloneDX AIBOM JSON." ,
4444 RunE : func (cmd * cobra.Command , args []string ) error {
45- target := generatePath
45+ // Get input path from viper (respects config file and CLI flag)
46+ target := viper .GetString ("generate.input" )
4647 if target == "" {
4748 target = "."
4849 }
@@ -52,7 +53,7 @@ var generateCmd = &cobra.Command{
5253 }
5354
5455 // Resolve effective log level (from config, env, or flag).
55- level := strings .ToLower (strings .TrimSpace (viper .GetString ("log. level" )))
56+ level := strings .ToLower (strings .TrimSpace (viper .GetString ("generate.log- level" )))
5657 if level == "" {
5758 level = "standard"
5859 }
@@ -64,33 +65,36 @@ var generateCmd = &cobra.Command{
6465 }
6566
6667 // Resolve effective HF mode (from config, env, or flag).
67- mode := strings .ToLower (strings .TrimSpace (viper .GetString ("huggingface. mode" )))
68+ mode := strings .ToLower (strings .TrimSpace (viper .GetString ("generate.hf- mode" )))
6869 if mode == "" {
6970 mode = "online"
7071 }
7172 switch mode {
7273 case "online" , "dummy" :
7374 // ok
7475 default :
75- return fmt .Errorf ("invalid --hf-mode %q (expected online|dummy)" , hfMode )
76+ return fmt .Errorf ("invalid --hf-mode %q (expected online|dummy)" , mode )
7677 }
7778 // Get format from viper (respects config file)
78- outputFormat := viper .GetString ("output .format" )
79+ outputFormat := viper .GetString ("generate .format" )
7980 if outputFormat == "" {
8081 outputFormat = "auto"
8182 }
8283
8384 // Get spec version from viper
84- specVersion := viper .GetString ("output.specVersion" )
85+ specVersion := viper .GetString ("generate.spec" )
86+
87+ // Get output path from viper for early validation
88+ outputPath := viper .GetString ("generate.output" )
8589
8690 // Fail fast on explicit format/extension mismatch before scanning
87- if generateOutput != "" && outputFormat != "" && outputFormat != "auto" {
88- ext := filepath .Ext (generateOutput )
91+ if outputPath != "" && outputFormat != "" && outputFormat != "auto" {
92+ ext := filepath .Ext (outputPath )
8993 if outputFormat == "xml" && ext == ".json" {
90- return fmt .Errorf ("output path extension %q does not match format %q" , ext , generateOutputFormat )
94+ return fmt .Errorf ("output path extension %q does not match format %q" , ext , outputFormat )
9195 }
92- if generateOutputFormat == "json" && ext == ".xml" {
93- return fmt .Errorf ("output path extension %q does not match format %q" , ext , generateOutputFormat )
96+ if outputFormat == "json" && ext == ".xml" {
97+ return fmt .Errorf ("output path extension %q does not match format %q" , ext , outputFormat )
9498 }
9599 }
96100
@@ -106,15 +110,9 @@ var generateCmd = &cobra.Command{
106110 }
107111 }
108112
109- // Scan for AI components
110- discoveries , err := scanner .Scan (absTarget )
111- if err != nil {
112- return err
113- }
114-
115113 // Get HF settings from viper
116- hfToken := viper .GetString ("huggingface. token" )
117- hfTimeout := viper .GetInt ("huggingface. timeout" )
114+ hfToken := viper .GetString ("generate.hf- token" )
115+ hfTimeout := viper .GetInt ("generate.hf- timeout" )
118116 if hfTimeout <= 0 {
119117 hfTimeout = 10
120118 }
@@ -130,6 +128,11 @@ var generateCmd = &cobra.Command{
130128 return err
131129 }
132130 } else {
131+ // Scan for AI components (only in non-dummy mode)
132+ discoveries , err := scanner .Scan (absTarget )
133+ if err != nil {
134+ return err
135+ }
133136 // Online mode: per discovery: store + fetch + map + build (inside generator).
134137 discoveredBOMs , err = generator .BuildPerDiscovery (discoveries , hfToken , timeout )
135138 if err != nil {
@@ -139,14 +142,15 @@ var generateCmd = &cobra.Command{
139142
140143 // Optional enrichment: only run when requested.
141144 // The enricher is now a separate command; this flag is deprecated.
142- if enrich {
145+ if viper . GetBool ( "generate. enrich" ) {
143146 fmt .Fprintf (cmd .ErrOrStderr (), "[warn] --enrich flag is deprecated. Use 'aibomgen-cli enrich' command instead.\n " )
144147 }
145148
146- output := generateOutput
149+ // Get output path from viper
150+ output := viper .GetString ("generate.output" )
147151 if output == "" {
148152 // Default extension based on requested format (json unless explicitly xml)
149- if generateOutputFormat == "xml" {
153+ if outputFormat == "xml" {
150154 output = "dist/aibom.xml"
151155 } else {
152156 output = "dist/aibom.json"
@@ -213,23 +217,26 @@ var generateCmd = &cobra.Command{
213217}
214218
215219func init () {
216- generateCmd .Flags ().StringVarP (& generatePath , "input" , "i" , "" , "Path to scan (default: current directory) " )
217- generateCmd .Flags ().StringVarP (& generateOutput , "output" , "o" , "" , "Output file path (directory is used; default: dist/aibom.json )" )
218- generateCmd .Flags ().StringVarP (& generateOutputFormat , "format" , "f" , "auto " , "Output BOM format: json|xml|auto (default: auto) " )
220+ generateCmd .Flags ().StringVarP (& generatePath , "input" , "i" , "" , "Path to scan" )
221+ generateCmd .Flags ().StringVarP (& generateOutput , "output" , "o" , "" , "Output file path (directory is used)" )
222+ generateCmd .Flags ().StringVarP (& generateOutputFormat , "format" , "f" , "" , "Output BOM format: json|xml|auto" )
219223 generateCmd .Flags ().StringVar (& generateSpecVersion , "spec" , "" , "CycloneDX spec version for output (e.g., 1.4, 1.5, 1.6)" )
220- generateCmd .Flags ().StringVar (& hfMode , "hf-mode" , "online " , "Hugging Face metadata mode: online|dummy (default: online) " )
221- generateCmd .Flags ().IntVar (& hfTimeoutSec , "hf-timeout" , 10 , "HTTP timeout in seconds for Hugging Face API" )
222- generateCmd .Flags ().StringVar (& hfToken , "hf-token" , "" , "Hugging Face access token (string) " )
223- generateCmd .Flags ().BoolVar (& enrich , "enrich" , false , "Prompt for missing fields and compute completeness" )
224- generateCmd .Flags ().StringVar (& generateLogLevel , "log-level" , "standard " , "Log level: quiet|standard|debug (default: standard) " )
224+ generateCmd .Flags ().StringVar (& hfMode , "hf-mode" , "" , "Hugging Face metadata mode: online|dummy" )
225+ generateCmd .Flags ().IntVar (& hfTimeoutSec , "hf-timeout" , 0 , "HTTP timeout in seconds for Hugging Face API" )
226+ generateCmd .Flags ().StringVar (& hfToken , "hf-token" , "" , "Hugging Face access token" )
227+ generateCmd .Flags ().BoolVar (& enrich , "enrich" , false , "Prompt for missing fields and compute completeness (deprecated) " )
228+ generateCmd .Flags ().StringVar (& generateLogLevel , "log-level" , "" , "Log level: quiet|standard|debug" )
225229
226- // Bind flags to viper for config file support
227- viper .BindPFlag ("output.format" , generateCmd .Flags ().Lookup ("format" ))
228- viper .BindPFlag ("output.specVersion" , generateCmd .Flags ().Lookup ("spec" ))
229- viper .BindPFlag ("huggingface.mode" , generateCmd .Flags ().Lookup ("hf-mode" ))
230- viper .BindPFlag ("huggingface.timeout" , generateCmd .Flags ().Lookup ("hf-timeout" ))
231- viper .BindPFlag ("huggingface.token" , generateCmd .Flags ().Lookup ("hf-token" ))
232- viper .BindPFlag ("log.level" , generateCmd .Flags ().Lookup ("log-level" ))
230+ // Bind all flags to viper for config file support
231+ viper .BindPFlag ("generate.input" , generateCmd .Flags ().Lookup ("input" ))
232+ viper .BindPFlag ("generate.output" , generateCmd .Flags ().Lookup ("output" ))
233+ viper .BindPFlag ("generate.format" , generateCmd .Flags ().Lookup ("format" ))
234+ viper .BindPFlag ("generate.spec" , generateCmd .Flags ().Lookup ("spec" ))
235+ viper .BindPFlag ("generate.hf-mode" , generateCmd .Flags ().Lookup ("hf-mode" ))
236+ viper .BindPFlag ("generate.hf-timeout" , generateCmd .Flags ().Lookup ("hf-timeout" ))
237+ viper .BindPFlag ("generate.hf-token" , generateCmd .Flags ().Lookup ("hf-token" ))
238+ viper .BindPFlag ("generate.enrich" , generateCmd .Flags ().Lookup ("enrich" ))
239+ viper .BindPFlag ("generate.log-level" , generateCmd .Flags ().Lookup ("log-level" ))
233240}
234241
235242func bomMetadataComponentName (bom * cdx.BOM ) string {
0 commit comments