@@ -45,7 +45,7 @@ const (
4545 globalTemplatePath = ".sitedog/demo.html.tpl"
4646 authFilePath = ".sitedog/auth"
4747 apiBaseURL = "https://app.sitedog.io"
48- Version = "v0.6.4 "
48+ Version = "v0.6.5 "
4949)
5050
5151func main () {
@@ -90,18 +90,21 @@ Commands:
9090Options for serve:
9191 --port PORT Port to run server on (default: 8081)
9292
93+ Options for sniff:
94+ --verbose, -v Show detailed detection information
95+
9396Options for render:
9497 --output PATH Path to output HTML file (default: sitedog.html)
9598
9699Examples:
97100 sitedog sniff # detect stack and create sitedog.yml
98101 sitedog sniff ./my-project # detect stack in directory and create config
102+ sitedog sniff --verbose # show detailed detection process
103+ sitedog sniff -v ./my-project # verbose analysis of specific directory
99104
100105 sitedog serve --port 3030` )
101106}
102107
103-
104-
105108func startServer (configFile * string , port int ) (* http.Server , string ) {
106109 // Handlers
107110 http .HandleFunc ("/" , func (w http.ResponseWriter , r * http.Request ) {
@@ -672,10 +675,23 @@ type PackageInfo struct {
672675}
673676
674677func handleSniff () {
675- // Parse arguments - path can be positional argument
678+ // Parse arguments - path can be positional argument and flags
676679 var projectPath , configPath string
677- if len (os .Args ) >= 3 {
678- argPath := os .Args [2 ]
680+ var verbose bool
681+
682+ // Parse flags first
683+ args := os .Args [2 :] // Skip 'sitedog' and 'sniff'
684+ for i , arg := range args {
685+ if arg == "--verbose" || arg == "-v" {
686+ verbose = true
687+ // Remove this flag from args
688+ args = append (args [:i ], args [i + 1 :]... )
689+ break
690+ }
691+ }
692+
693+ if len (args ) >= 1 {
694+ argPath := args [0 ]
679695 if strings .HasSuffix (argPath , ".yml" ) || strings .HasSuffix (argPath , ".yaml" ) {
680696 // Argument is a config file path - analyze parent directory, save to specified file
681697 configPath = argPath
@@ -800,7 +816,11 @@ func handleSniff() {
800816 }
801817
802818 // Display results
803- displayDetectorResults (allResults )
819+ if verbose {
820+ displayDetailedResults (projectPath , detectedLanguages , stackData , servicesData , allResults )
821+ } else {
822+ displayDetectorResults (allResults )
823+ }
804824
805825 // Create or update configuration
806826 createConfigFromDetectorResults (configPath , allResults )
@@ -1584,3 +1604,105 @@ func (a *ServicesDependenciesAdapter) GetServicesData() map[string]*detectors.Se
15841604 }
15851605 return result
15861606}
1607+
1608+ func displayDetailedResults (projectPath string , detectedLanguages []string , stackData * StackDependencyFiles , servicesData map [string ]* ServiceData , allResults map [string ]string ) {
1609+ fmt .Printf ("🔍 Detailed Detection Analysis\n " )
1610+ fmt .Printf ("═══════════════════════════════\n \n " )
1611+
1612+ // Show detected languages
1613+ if len (detectedLanguages ) > 0 {
1614+ fmt .Printf ("📝 Languages detected: %s\n \n " , strings .Join (detectedLanguages , ", " ))
1615+
1616+ // Analyze project dependencies with detailed output
1617+ results := analyzeProjectDependencies (projectPath , detectedLanguages , stackData , servicesData )
1618+
1619+ for _ , result := range results {
1620+ fmt .Printf ("🔧 %s Analysis:\n " , strings .Title (result .Language ))
1621+ fmt .Printf ("├── Files analyzed: %d\n " , len (result .Files ))
1622+
1623+ for _ , file := range result .Files {
1624+ fmt .Printf ("│ ├── %s\n " , file )
1625+
1626+ // Show packages found in this file
1627+ fileServices := analyzeFile (file , result .Language , servicesData )
1628+ if len (fileServices ) > 0 {
1629+ for _ , service := range fileServices {
1630+ fmt .Printf ("│ │ └── %s service detected\n " , service .Name )
1631+ for _ , pkg := range service .Packages {
1632+ fmt .Printf ("│ │ ├── Package: %s\n " , pkg .Name )
1633+ }
1634+ }
1635+ } else {
1636+ fmt .Printf ("│ │ └── No service packages found\n " )
1637+ }
1638+ }
1639+
1640+ fmt .Printf ("│\n " )
1641+ fmt .Printf ("├── Services found: %d\n " , len (result .Services ))
1642+ for _ , service := range result .Services {
1643+ if serviceData , exists := servicesData [service .Name ]; exists {
1644+ fmt .Printf ("│ ├── %s → %s\n " , serviceData .Name , serviceData .URL )
1645+ fmt .Printf ("│ │ └── Based on packages: %s\n " , func () string {
1646+ var packages []string
1647+ for _ , pkg := range service .Packages {
1648+ packages = append (packages , pkg .Name )
1649+ }
1650+ return strings .Join (packages , ", " )
1651+ }())
1652+ } else {
1653+ fmt .Printf ("│ ├── %s (unknown service)\n " , service .Name )
1654+ }
1655+ }
1656+ fmt .Printf ("│\n " )
1657+ }
1658+
1659+ fmt .Printf ("└── Analysis complete\n \n " )
1660+ } else {
1661+ fmt .Printf ("❌ No languages detected in project\n \n " )
1662+ }
1663+
1664+ // Show repository information
1665+ if repo , hasRepo := allResults ["repo" ]; hasRepo {
1666+ fmt .Printf ("📁 Repository: %s\n \n " , repo )
1667+ }
1668+
1669+ // Show final summary
1670+ serviceCount := len (allResults )
1671+ if _ , hasRepo := allResults ["repo" ]; hasRepo {
1672+ serviceCount -- // Don't count repo as a service
1673+ }
1674+
1675+ if serviceCount > 0 {
1676+ fmt .Printf ("✨ Summary: %d service(s) detected\n " , serviceCount )
1677+ fmt .Printf ("═══════════════════════════════════\n " )
1678+
1679+ // Show services in sorted order
1680+ var keys []string
1681+ for key := range allResults {
1682+ if key != "repo" {
1683+ keys = append (keys , key )
1684+ }
1685+ }
1686+ sort .Strings (keys )
1687+
1688+ for _ , key := range keys {
1689+ value := allResults [key ]
1690+ displayName := key
1691+
1692+ // Try to get proper display name
1693+ if servicesData != nil {
1694+ if serviceData , exists := servicesData [key ]; exists {
1695+ displayName = serviceData .Name
1696+ }
1697+ }
1698+
1699+ if displayName == key {
1700+ displayName = getTechnologyDisplayName (key , value )
1701+ }
1702+
1703+ fmt .Printf (" 🔗 %s → %s\n " , displayName , value )
1704+ }
1705+ } else {
1706+ fmt .Printf ("❌ No services detected\n " )
1707+ }
1708+ }
0 commit comments