Hugoifier

hugoifier / hugoifier / cli.py
Blame History Raw 155 lines
1
"""
2
Hugo-ifier CLI Tool
3
4
Usage examples:
5
python cli.py complete themes/revolve-hugo
6
python cli.py complete themes/revolve-hugo --output /tmp/my-site
7
HUGOIFIER_BACKEND=openai python cli.py complete themes/revolve-hugo
8
python cli.py analyze themes/revolve-hugo
9
python cli.py hugoify themes/revolve-hugo
10
python cli.py decapify output/revolve-hugo
11
"""
12
13
import argparse
14
import logging
15
import sys
16
17
from .utils.analyze import analyze
18
from .utils.cloudflare import configure_cloudflare
19
from .utils.complete import complete
20
from .utils.decapify import decapify
21
from .utils.deploy import deploy
22
from .utils.enhance import alt_text, enhance, generate, seo
23
from .utils.hugoify import hugoify
24
from .utils.parser import parse
25
from .utils.translate import translate
26
27
28
def main():
29
parser = argparse.ArgumentParser(
30
description="Hugo-ifier — AI-powered Hugo theme converter",
31
formatter_class=argparse.RawDescriptionHelpFormatter,
32
epilog=__doc__,
33
)
34
parser.add_argument(
35
'--backend', choices=['anthropic', 'openai', 'google'],
36
help='AI backend to use (overrides HUGOIFIER_BACKEND env var)',
37
)
38
subparsers = parser.add_subparsers(dest="command")
39
40
# complete — full pipeline
41
complete_parser = subparsers.add_parser("complete", help="Run the full pipeline (analyze → hugoify → decap)")
42
complete_parser.add_argument("path", help="Path to the theme directory")
43
complete_parser.add_argument("--output", "-o", help="Output directory (default: output/{theme-name})")
44
complete_parser.add_argument("--cms-name", default=None, help="Whitelabel CMS name")
45
complete_parser.add_argument("--cms-logo", default=None, help="Whitelabel logo URL")
46
complete_parser.add_argument("--cms-color", default=None, help="Whitelabel top-bar hex color")
47
48
# analyze
49
analyze_parser = subparsers.add_parser("analyze", help="Analyze a theme and report structure")
50
analyze_parser.add_argument("path", help="Path to the theme")
51
52
# hugoify
53
hugoify_parser = subparsers.add_parser("hugoify", help="Convert HTML or Next.js app to Hugo theme (or validate existing Hugo theme)")
54
hugoify_parser.add_argument("path", help="Path to HTML file or theme directory")
55
56
# decapify
57
decapify_parser = subparsers.add_parser("decapify", help="Add Decap CMS to an assembled Hugo site")
58
decapify_parser.add_argument("path", help="Path to the Hugo site directory")
59
decapify_parser.add_argument("--cms-name", default=None, help="Whitelabel CMS name (default: 'Content Manager')")
60
decapify_parser.add_argument("--cms-logo", default=None, help="Whitelabel logo URL")
61
decapify_parser.add_argument("--cms-color", default=None, help="Whitelabel top-bar hex color")
62
63
# translate
64
translate_parser = subparsers.add_parser("translate", help="Translate content to another language")
65
translate_parser.add_argument("path", help="Path to the content file")
66
translate_parser.add_argument("--target-language", default="Spanish", help="Target language (default: Spanish)")
67
68
# parse / lint
69
parser_parser = subparsers.add_parser("parser", help="Parse and lint (stub)")
70
parser_parser.add_argument("path", help="Path to the theme")
71
72
# deploy (stub)
73
deploy_parser = subparsers.add_parser("deploy", help="Deploy to Cloudflare (stub)")
74
deploy_parser.add_argument("path", help="Path to the site")
75
deploy_parser.add_argument("zone", help="Cloudflare zone")
76
77
# cloudflare (stub)
78
cloudflare_parser = subparsers.add_parser("cloudflare", help="Configure Cloudflare (stub)")
79
cloudflare_parser.add_argument("path", help="Path to the site")
80
cloudflare_parser.add_argument("zone", help="Cloudflare zone")
81
82
# generate — AI content generation
83
generate_parser = subparsers.add_parser("generate", help="Generate content pages using AI")
84
generate_parser.add_argument("path", help="Path to the Hugo site directory")
85
generate_parser.add_argument("--prompt", default=None, help="Text prompt describing what content to generate")
86
generate_parser.add_argument("--from-file", default=None, help="Example markdown file to use as style reference")
87
88
# seo — add meta descriptions + OG tags
89
seo_parser = subparsers.add_parser("seo", help="Add missing meta descriptions and OG tags")
90
seo_parser.add_argument("path", help="Path to the Hugo site directory")
91
92
# alt-text — generate image alt text
93
alttext_parser = subparsers.add_parser("alt-text", help="Generate alt text for images in templates")
94
alttext_parser.add_argument("path", help="Path to the Hugo site directory")
95
96
# enhance — run all enhancements (seo + alt-text)
97
enhance_parser = subparsers.add_parser("enhance", help="Run all AI enhancements (seo + alt-text)")
98
enhance_parser.add_argument("path", help="Path to the Hugo site directory")
99
100
args = parser.parse_args()
101
102
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
103
104
# Override backend if specified on command line
105
if args.backend:
106
import config as cfg
107
cfg.BACKEND = args.backend
108
109
try:
110
if args.command == "complete":
111
result = complete(
112
args.path,
113
output_dir=args.output,
114
cms_name=args.cms_name,
115
cms_logo=args.cms_logo,
116
cms_color=args.cms_color,
117
)
118
print(result)
119
elif args.command == "analyze":
120
print(analyze(args.path))
121
elif args.command == "hugoify":
122
print(hugoify(args.path))
123
elif args.command == "decapify":
124
print(decapify(
125
args.path,
126
cms_name=args.cms_name,
127
cms_logo=args.cms_logo,
128
cms_color=args.cms_color,
129
))
130
elif args.command == "translate":
131
print(translate(args.path, target_language=args.target_language))
132
elif args.command == "parser":
133
print(parse(args.path))
134
elif args.command == "deploy":
135
print(deploy(args.path, args.zone))
136
elif args.command == "cloudflare":
137
print(configure_cloudflare(args.path, args.zone))
138
elif args.command == "generate":
139
print(generate(args.path, prompt=args.prompt, from_file=args.from_file))
140
elif args.command == "seo":
141
print(seo(args.path))
142
elif args.command == "alt-text":
143
print(alt_text(args.path))
144
elif args.command == "enhance":
145
print(enhance(args.path))
146
else:
147
parser.print_help()
148
except (ValueError, EnvironmentError) as e:
149
print(f"Error: {e}", file=sys.stderr)
150
sys.exit(1)
151
152
153
if __name__ == "__main__":
154
main()
155

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button