sigil-creator 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Sigil Creator Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,150 @@
1
+ Metadata-Version: 2.4
2
+ Name: sigil-creator
3
+ Version: 0.1.0
4
+ Summary: CLI tools for creating personal magical sigils using classical and chaos magic methods (Spare letter reduction, Agrippa planetary kameas, Rose Cross, and grimoire-style seals).
5
+ Author: Sigil Creator Contributors
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/CraftingBuilds/sigil-creator-cli
8
+ Project-URL: Documentation, https://github.com/CraftingBuilds/sigil-creator-cli#readme
9
+ Keywords: sigil,chaos-magic,occult,grimoire,kamea,cli,magic
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: End Users/Desktop
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Operating System :: MacOS
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Topic :: Religion
18
+ Classifier: Topic :: Utilities
19
+ Requires-Python: >=3.8
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Dynamic: license-file
23
+
24
+ # sigil-creator
25
+
26
+ **CLI tools for creating personal magical sigils** grounded in classical Western occult traditions and modern chaos magic.
27
+
28
+ Implements the deterministic helper steps used by the [sigil-creator](https://github.com/example/sigil-creator) skill:
29
+
30
+ - Austin Osman Spare / chaos-magic letter reduction
31
+ - Letter → number conversion for Agrippa planetary kameas
32
+ - Visual **Sigil Profiles** (YAML) for consistent aesthetic rendering
33
+ - Method and kamea reference documents
34
+
35
+ The actual artistic construction of the glyph (overlapping strokes, path drawing on a magic square, image generation) is left to the practitioner or an external image model. This package supplies the reduction, numbering, style definitions, and documentation.
36
+
37
+ ## Installation (Linux / macOS)
38
+
39
+ ### From source (recommended while developing)
40
+
41
+ ```bash
42
+ cd sigil-creator-cli
43
+ python3 -m pip install --user -e .
44
+ ```
45
+
46
+ ### Or build a wheel / sdist
47
+
48
+ ```bash
49
+ python3 -m pip install build
50
+ python3 -m build
51
+ python3 -m pip install dist/sigil_creator-*.whl
52
+ ```
53
+
54
+ After installation the following commands are available:
55
+
56
+ | Command | Purpose |
57
+ |--------------------|----------------------------------------------|
58
+ | `sigil` | Main multi-command entry point |
59
+ | `sigil-reduce` | Stand-alone letter reducer |
60
+ | `sigil-numbers` | Stand-alone letter→number converter |
61
+
62
+ ## Quick start
63
+
64
+ ```bash
65
+ # 1. Reduce a Statement of Intent (Spare method)
66
+ sigil reduce "I am financially secure"
67
+ # → MFNCLYSR
68
+
69
+ # Keep vowels
70
+ sigil reduce --keep-vowels "I am financially secure"
71
+
72
+ # 2. Convert to kamea path numbers
73
+ sigil numbers MFNCLYSR
74
+ sigil numbers --max 7 "I am financially secure"
75
+
76
+ # 3. List / inspect visual profiles
77
+ sigil profiles
78
+ sigil show-profile antiquarian_calligraphic
79
+ sigil show-profile chaos_minimal
80
+
81
+ # 4. Read the full method reference
82
+ sigil methods
83
+ sigil methods --section Spare
84
+ sigil methods --section Kamea
85
+ sigil kameas
86
+
87
+ # 5. Concise workflow reminder
88
+ sigil guide
89
+ ```
90
+
91
+ You can also pipe:
92
+
93
+ ```bash
94
+ echo "It is my will to write every day" | sigil reduce
95
+ ```
96
+
97
+ ## Available Sigil Profiles
98
+
99
+ | ID | Character |
100
+ |---------------------------|------------------------------------------------|
101
+ | `antiquarian_calligraphic`| Bold, archaic, interwoven, calligraphic |
102
+ | `grimoire_engraved` | Severe, angular, authoritative, plate-like |
103
+ | `chaos_minimal` | Clean, abstract, psychological, decisive |
104
+ | `alchemical_manuscript` | Ornate yet restrained, symbolic, manuscript |
105
+
106
+ Profiles live in `sigil_creator/data/profiles/` and can be extended by dropping additional YAML files.
107
+
108
+ ## Planetary Kameas (summary)
109
+
110
+ | Planet | Square | Typical use |
111
+ |---------|--------|--------------------------------------|
112
+ | Saturn | 3×3 | Protection, boundaries, endings |
113
+ | Jupiter | 4×4 | Wealth, expansion, success |
114
+ | Mars | 5×5 | Energy, courage, conflict |
115
+ | Sun | 6×6 | Vitality, recognition, leadership |
116
+ | Venus | 7×7 | Love, beauty, harmony |
117
+ | Mercury | 8×8 | Communication, intellect, commerce |
118
+ | Moon | 9×9 | Intuition, cycles, the subconscious |
119
+
120
+ Full squares and reduction rules: `sigil kameas`.
121
+
122
+ ## Charging & release (reminder)
123
+
124
+ 1. Formulate a clear, present-tense, positive Statement of Intent.
125
+ 2. Reduce / map it into an abstract mark.
126
+ 3. Enter a state of gnosis (meditation, breath work, movement, etc.) while focusing on the sigil.
127
+ 4. Deliberately forget the original desire so the unconscious can work.
128
+ 5. Destroy, bury, or hide the physical sigil.
129
+
130
+ This package treats the practice as psychological technology, artistic craft, or sincere occult work according to the user’s own framework. It makes no claims about results.
131
+
132
+ ## Development layout
133
+
134
+ ```
135
+ sigil-creator-cli/
136
+ ├── pyproject.toml
137
+ ├── README.md
138
+ ├── src/sigil_creator/
139
+ │ ├── __init__.py
140
+ │ ├── cli.py # main `sigil` command
141
+ │ ├── reduce_letters.py
142
+ │ ├── letters_to_numbers.py
143
+ │ └── data/
144
+ │ ├── profiles/ # YAML style definitions
145
+ │ └── references/ # methods.md, kameas.md
146
+ ```
147
+
148
+ ## License
149
+
150
+ MIT
@@ -0,0 +1,127 @@
1
+ # sigil-creator
2
+
3
+ **CLI tools for creating personal magical sigils** grounded in classical Western occult traditions and modern chaos magic.
4
+
5
+ Implements the deterministic helper steps used by the [sigil-creator](https://github.com/example/sigil-creator) skill:
6
+
7
+ - Austin Osman Spare / chaos-magic letter reduction
8
+ - Letter → number conversion for Agrippa planetary kameas
9
+ - Visual **Sigil Profiles** (YAML) for consistent aesthetic rendering
10
+ - Method and kamea reference documents
11
+
12
+ The actual artistic construction of the glyph (overlapping strokes, path drawing on a magic square, image generation) is left to the practitioner or an external image model. This package supplies the reduction, numbering, style definitions, and documentation.
13
+
14
+ ## Installation (Linux / macOS)
15
+
16
+ ### From source (recommended while developing)
17
+
18
+ ```bash
19
+ cd sigil-creator-cli
20
+ python3 -m pip install --user -e .
21
+ ```
22
+
23
+ ### Or build a wheel / sdist
24
+
25
+ ```bash
26
+ python3 -m pip install build
27
+ python3 -m build
28
+ python3 -m pip install dist/sigil_creator-*.whl
29
+ ```
30
+
31
+ After installation the following commands are available:
32
+
33
+ | Command | Purpose |
34
+ |--------------------|----------------------------------------------|
35
+ | `sigil` | Main multi-command entry point |
36
+ | `sigil-reduce` | Stand-alone letter reducer |
37
+ | `sigil-numbers` | Stand-alone letter→number converter |
38
+
39
+ ## Quick start
40
+
41
+ ```bash
42
+ # 1. Reduce a Statement of Intent (Spare method)
43
+ sigil reduce "I am financially secure"
44
+ # → MFNCLYSR
45
+
46
+ # Keep vowels
47
+ sigil reduce --keep-vowels "I am financially secure"
48
+
49
+ # 2. Convert to kamea path numbers
50
+ sigil numbers MFNCLYSR
51
+ sigil numbers --max 7 "I am financially secure"
52
+
53
+ # 3. List / inspect visual profiles
54
+ sigil profiles
55
+ sigil show-profile antiquarian_calligraphic
56
+ sigil show-profile chaos_minimal
57
+
58
+ # 4. Read the full method reference
59
+ sigil methods
60
+ sigil methods --section Spare
61
+ sigil methods --section Kamea
62
+ sigil kameas
63
+
64
+ # 5. Concise workflow reminder
65
+ sigil guide
66
+ ```
67
+
68
+ You can also pipe:
69
+
70
+ ```bash
71
+ echo "It is my will to write every day" | sigil reduce
72
+ ```
73
+
74
+ ## Available Sigil Profiles
75
+
76
+ | ID | Character |
77
+ |---------------------------|------------------------------------------------|
78
+ | `antiquarian_calligraphic`| Bold, archaic, interwoven, calligraphic |
79
+ | `grimoire_engraved` | Severe, angular, authoritative, plate-like |
80
+ | `chaos_minimal` | Clean, abstract, psychological, decisive |
81
+ | `alchemical_manuscript` | Ornate yet restrained, symbolic, manuscript |
82
+
83
+ Profiles live in `sigil_creator/data/profiles/` and can be extended by dropping additional YAML files.
84
+
85
+ ## Planetary Kameas (summary)
86
+
87
+ | Planet | Square | Typical use |
88
+ |---------|--------|--------------------------------------|
89
+ | Saturn | 3×3 | Protection, boundaries, endings |
90
+ | Jupiter | 4×4 | Wealth, expansion, success |
91
+ | Mars | 5×5 | Energy, courage, conflict |
92
+ | Sun | 6×6 | Vitality, recognition, leadership |
93
+ | Venus | 7×7 | Love, beauty, harmony |
94
+ | Mercury | 8×8 | Communication, intellect, commerce |
95
+ | Moon | 9×9 | Intuition, cycles, the subconscious |
96
+
97
+ Full squares and reduction rules: `sigil kameas`.
98
+
99
+ ## Charging & release (reminder)
100
+
101
+ 1. Formulate a clear, present-tense, positive Statement of Intent.
102
+ 2. Reduce / map it into an abstract mark.
103
+ 3. Enter a state of gnosis (meditation, breath work, movement, etc.) while focusing on the sigil.
104
+ 4. Deliberately forget the original desire so the unconscious can work.
105
+ 5. Destroy, bury, or hide the physical sigil.
106
+
107
+ This package treats the practice as psychological technology, artistic craft, or sincere occult work according to the user’s own framework. It makes no claims about results.
108
+
109
+ ## Development layout
110
+
111
+ ```
112
+ sigil-creator-cli/
113
+ ├── pyproject.toml
114
+ ├── README.md
115
+ ├── src/sigil_creator/
116
+ │ ├── __init__.py
117
+ │ ├── cli.py # main `sigil` command
118
+ │ ├── reduce_letters.py
119
+ │ ├── letters_to_numbers.py
120
+ │ └── data/
121
+ │ ├── profiles/ # YAML style definitions
122
+ │ └── references/ # methods.md, kameas.md
123
+ ```
124
+
125
+ ## License
126
+
127
+ MIT
@@ -0,0 +1,45 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "sigil-creator"
7
+ version = "0.1.0"
8
+ description = "CLI tools for creating personal magical sigils using classical and chaos magic methods (Spare letter reduction, Agrippa planetary kameas, Rose Cross, and grimoire-style seals)."
9
+ readme = "README.md"
10
+ requires-python = ">=3.8"
11
+ license = {text = "MIT"}
12
+ authors = [
13
+ {name = "Sigil Creator Contributors"}
14
+ ]
15
+ keywords = ["sigil", "chaos-magic", "occult", "grimoire", "kamea", "cli", "magic"]
16
+ classifiers = [
17
+ "Development Status :: 4 - Beta",
18
+ "Environment :: Console",
19
+ "Intended Audience :: End Users/Desktop",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Operating System :: POSIX :: Linux",
22
+ "Operating System :: MacOS",
23
+ "Programming Language :: Python :: 3",
24
+ "Topic :: Religion",
25
+ "Topic :: Utilities",
26
+ ]
27
+
28
+ [project.scripts]
29
+ sigil = "sigil_creator.cli:main"
30
+ sigil-reduce = "sigil_creator.reduce_letters:main"
31
+ sigil-numbers = "sigil_creator.letters_to_numbers:main"
32
+
33
+ [project.urls]
34
+ Homepage = "https://github.com/CraftingBuilds/sigil-creator-cli"
35
+ Documentation = "https://github.com/CraftingBuilds/sigil-creator-cli#readme"
36
+
37
+ [tool.setuptools.packages.find]
38
+ where = ["src"]
39
+
40
+ [tool.setuptools.package-data]
41
+ "sigil_creator" = ["data/profiles/*.yaml", "data/references/*.md"]
42
+
43
+ [tool.pytest.ini_options]
44
+ testpaths = ["tests"]
45
+ python_files = ["test_*.py", "*_test.py"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,4 @@
1
+ """Sigil Creator — CLI tools for personal magical sigil construction."""
2
+
3
+ __version__ = "0.1.0"
4
+ __all__ = ["reduce_letters", "letters_to_numbers", "cli"]
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env python3
2
+ """Main entry point for the sigil-creator CLI."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import importlib.resources as resources
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Optional
11
+
12
+ from . import __version__
13
+ from .reduce_letters import reduce_intent
14
+ from .letters_to_numbers import convert
15
+
16
+
17
+ def get_data_path(relative: str) -> Path:
18
+ """Locate package data files (profiles, references)."""
19
+ try:
20
+ # Python 3.9+
21
+ base = resources.files("sigil_creator")
22
+ return Path(str(base.joinpath("data", relative)))
23
+ except Exception:
24
+ # Fallback for development / editable installs
25
+ here = Path(__file__).resolve().parent
26
+ return here / "data" / relative
27
+
28
+
29
+ def cmd_reduce(args: argparse.Namespace) -> int:
30
+ text = args.intent or sys.stdin.read()
31
+ if not text.strip():
32
+ print("Error: provide a statement of intent as argument or on stdin.", file=sys.stderr)
33
+ return 1
34
+ result = reduce_intent(
35
+ text.strip(),
36
+ remove_vowels=not args.keep_vowels,
37
+ keep_case=args.keep_case,
38
+ )
39
+ print(result)
40
+ return 0
41
+
42
+
43
+ def cmd_numbers(args: argparse.Namespace) -> int:
44
+ text = args.text or sys.stdin.read()
45
+ if not text.strip():
46
+ print("Error: provide letters or intent as argument or on stdin.", file=sys.stderr)
47
+ return 1
48
+ numbers = convert(text, reduce=not args.no_reduce, max_val=args.max)
49
+ print(" ".join(map(str, numbers)))
50
+ if args.verbose:
51
+ print(f"Sequence: {numbers}", file=sys.stderr)
52
+ return 0
53
+
54
+
55
+ def cmd_profiles(args: argparse.Namespace) -> int:
56
+ profiles_dir = get_data_path("profiles")
57
+ if not profiles_dir.is_dir():
58
+ print(f"Profiles directory not found: {profiles_dir}", file=sys.stderr)
59
+ return 1
60
+ files = sorted(profiles_dir.glob("*.yaml"))
61
+ if not files:
62
+ print("No profiles found.")
63
+ return 0
64
+ for f in files:
65
+ print(f.stem)
66
+ if args.verbose:
67
+ print(f" → {f}")
68
+ return 0
69
+
70
+
71
+ def cmd_show_profile(args: argparse.Namespace) -> int:
72
+ path = get_data_path(f"profiles/{args.name}.yaml")
73
+ if not path.is_file():
74
+ # try without extension / fuzzy
75
+ candidates = list(get_data_path("profiles").glob(f"*{args.name}*.yaml"))
76
+ if len(candidates) == 1:
77
+ path = candidates[0]
78
+ else:
79
+ print(f"Profile not found: {args.name}", file=sys.stderr)
80
+ print("Available:", file=sys.stderr)
81
+ for p in sorted(get_data_path("profiles").glob("*.yaml")):
82
+ print(f" {p.stem}", file=sys.stderr)
83
+ return 1
84
+ print(path.read_text(encoding="utf-8"))
85
+ return 0
86
+
87
+
88
+ def cmd_methods(args: argparse.Namespace) -> int:
89
+ path = get_data_path("references/methods.md")
90
+ if not path.is_file():
91
+ print(f"Reference not found: {path}", file=sys.stderr)
92
+ return 1
93
+ text = path.read_text(encoding="utf-8")
94
+ if args.section:
95
+ # Simple section filter
96
+ lines = text.splitlines()
97
+ out = []
98
+ capturing = False
99
+ for line in lines:
100
+ if line.startswith("## ") and args.section.lower() in line.lower():
101
+ capturing = True
102
+ elif line.startswith("## ") and capturing:
103
+ break
104
+ if capturing:
105
+ out.append(line)
106
+ print("\n".join(out) if out else text)
107
+ else:
108
+ print(text)
109
+ return 0
110
+
111
+
112
+ def cmd_kameas(args: argparse.Namespace) -> int:
113
+ path = get_data_path("references/kameas.md")
114
+ if not path.is_file():
115
+ print(f"Reference not found: {path}", file=sys.stderr)
116
+ return 1
117
+ print(path.read_text(encoding="utf-8"))
118
+ return 0
119
+
120
+
121
+ def cmd_guide(args: argparse.Namespace) -> int:
122
+ """Print a concise practical guide for creating a sigil from the CLI."""
123
+ guide = f"""
124
+ sigil-creator {__version__} — Quick Guide
125
+ ========================================
126
+
127
+ 1. Formulate a Statement of Intent (SoI)
128
+ Present tense, positive, specific, already-true:
129
+ "I am financially secure"
130
+ "It is my will to find steady creative work I enjoy"
131
+
132
+ 2. Reduce the letters (Spare / chaos method — default)
133
+ $ sigil reduce "I am financially secure"
134
+ → MFNCLYSR (vowels removed, unique letters)
135
+
136
+ Keep vowels:
137
+ $ sigil reduce --keep-vowels "I am financially secure"
138
+
139
+ 3. Convert to numbers for a planetary kamea
140
+ $ sigil numbers MFNCLYSR
141
+ $ sigil numbers --max 9 "I am financially secure"
142
+
143
+ 4. Choose a visual profile
144
+ $ sigil profiles
145
+ $ sigil show-profile antiquarian_calligraphic
146
+
147
+ 5. Read method details
148
+ $ sigil methods
149
+ $ sigil methods --section Spare
150
+ $ sigil kameas
151
+
152
+ 6. Construct the glyph yourself (or with an image model)
153
+ - Overlap / rotate / share strokes of the reduced letters
154
+ - For kamea: plot the number sequence as a path on the chosen square
155
+ (start with open circle, end with a bar)
156
+ - Apply the stroke, geometry and composition rules from the chosen profile
157
+
158
+ 7. Charge & release
159
+ Enter gnosis (meditation, breath, movement, etc.), gaze, then deliberately
160
+ forget the original desire. Destroy or hide the physical mark.
161
+
162
+ Full references are shipped with the package under the data/ tree.
163
+ """
164
+ print(guide.strip())
165
+ return 0
166
+
167
+
168
+ def build_parser() -> argparse.ArgumentParser:
169
+ parser = argparse.ArgumentParser(
170
+ prog="sigil",
171
+ description="Create personal magical sigils — letter reduction, kamea numbers, profiles & references.",
172
+ formatter_class=argparse.RawDescriptionHelpFormatter,
173
+ epilog="Examples:\n"
174
+ " sigil reduce \"I am calm and focused\"\n"
175
+ " sigil numbers --max 7 ABCDEF\n"
176
+ " sigil profiles\n"
177
+ " sigil show-profile chaos_minimal\n"
178
+ " sigil methods --section Kamea\n"
179
+ " sigil guide\n",
180
+ )
181
+ parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
182
+
183
+ sub = parser.add_subparsers(dest="command", required=True)
184
+
185
+ # reduce
186
+ p_reduce = sub.add_parser("reduce", help="Reduce a statement of intent to unique letters (Spare method)")
187
+ p_reduce.add_argument("intent", nargs="?", help="Statement of intent (or read from stdin)")
188
+ p_reduce.add_argument("--keep-vowels", action="store_true", help="Do not strip vowels")
189
+ p_reduce.add_argument("--keep-case", action="store_true", help="Preserve original case")
190
+ p_reduce.set_defaults(func=cmd_reduce)
191
+
192
+ # numbers
193
+ p_num = sub.add_parser("numbers", help="Convert letters to numbers for kamea paths")
194
+ p_num.add_argument("text", nargs="?", help="Letters or full intent (or stdin)")
195
+ p_num.add_argument("--no-reduce", action="store_true", help="Do not digital-root reduce")
196
+ p_num.add_argument("--max", type=int, default=9, help="Maximum value after reduction (default 9)")
197
+ p_num.add_argument("-v", "--verbose", action="store_true")
198
+ p_num.set_defaults(func=cmd_numbers)
199
+
200
+ # profiles
201
+ p_prof = sub.add_parser("profiles", help="List available visual Sigil Profiles")
202
+ p_prof.add_argument("-v", "--verbose", action="store_true")
203
+ p_prof.set_defaults(func=cmd_profiles)
204
+
205
+ # show-profile
206
+ p_show = sub.add_parser("show-profile", help="Print a profile YAML definition")
207
+ p_show.add_argument("name", help="Profile id (e.g. antiquarian_calligraphic)")
208
+ p_show.set_defaults(func=cmd_show_profile)
209
+
210
+ # methods
211
+ p_meth = sub.add_parser("methods", help="Show detailed method reference")
212
+ p_meth.add_argument("--section", "-s", help="Filter to a section title (Spare, Kamea, Rose, Grimoire…)")
213
+ p_meth.set_defaults(func=cmd_methods)
214
+
215
+ # kameas
216
+ p_kam = sub.add_parser("kameas", help="Show Agrippa planetary magic squares reference")
217
+ p_kam.set_defaults(func=cmd_kameas)
218
+
219
+ # guide
220
+ p_guide = sub.add_parser("guide", help="Print a short practical workflow guide")
221
+ p_guide.set_defaults(func=cmd_guide)
222
+
223
+ return parser
224
+
225
+
226
+ def main(argv: Optional[list[str]] = None) -> int:
227
+ parser = build_parser()
228
+ args = parser.parse_args(argv)
229
+ return args.func(args)
230
+
231
+
232
+ if __name__ == "__main__":
233
+ sys.exit(main())