diff --git a/docs/latex/Makefile b/docs/latex/Makefile
new file mode 100644
index 0000000..07f226d
--- /dev/null
+++ b/docs/latex/Makefile
@@ -0,0 +1,27 @@
+LATEX_CMD?=pdflatex
+MKIDX_CMD?=makeindex
+BIBTEX_CMD?=bibtex
+LATEX_COUNT?=8
+MANUAL_FILE?=refman
+
+all: $(MANUAL_FILE).pdf
+
+pdf: $(MANUAL_FILE).pdf
+
+$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex
+ $(LATEX_CMD) $(MANUAL_FILE)
+ $(MKIDX_CMD) $(MANUAL_FILE).idx
+ $(LATEX_CMD) $(MANUAL_FILE)
+ latex_count=$(LATEX_COUNT) ; \
+ while egrep -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\
+ do \
+ echo "Rerunning latex...." ;\
+ $(LATEX_CMD) $(MANUAL_FILE) ;\
+ latex_count=`expr $$latex_count - 1` ;\
+ done
+ $(MKIDX_CMD) $(MANUAL_FILE).idx
+ $(LATEX_CMD) $(MANUAL_FILE)
+
+
+clean:
+ rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf
diff --git a/docs/latex/README_8md.tex b/docs/latex/README_8md.tex
new file mode 100644
index 0000000..dd4e1ac
--- /dev/null
+++ b/docs/latex/README_8md.tex
@@ -0,0 +1,2 @@
+\hypertarget{README_8md}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/\+README.md File Reference}
+\label{README_8md}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/README.md@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/README.md}}
diff --git a/docs/latex/annotated.tex b/docs/latex/annotated.tex
new file mode 100644
index 0000000..404b927
--- /dev/null
+++ b/docs/latex/annotated.tex
@@ -0,0 +1,16 @@
+\doxysection{Class List}
+Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{penify\+\_\+hook.\+api\+\_\+client.\+APIClient}} }{\pageref{classpenify__hook_1_1api__client_1_1APIClient}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer}{penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer}} }{\pageref{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook}{penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook}} }{\pageref{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classException}{Exception}} }{\pageref{classException}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook}{penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook}} }{\pageref{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook}{penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook}} }{\pageref{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook}{penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook}} }{\pageref{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1utils_1_1GitRepoNotFoundError}{penify\+\_\+hook.\+utils.\+Git\+Repo\+Not\+Found\+Error}} }{\pageref{classpenify__hook_1_1utils_1_1GitRepoNotFoundError}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient}{penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client}} }{\pageref{classpenify__hook_1_1jira__client_1_1JiraClient}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient}{penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient}} }{\pageref{classpenify__hook_1_1llm__client_1_1LLMClient}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands}{tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands}} }{\pageref{classtests_1_1test__commit__commands_1_1TestCommitCommands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands}{tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands}} }{\pageref{classtests_1_1test__config__commands_1_1TestConfigCommands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classtests_1_1test__web__config_1_1TestWebConfig}{tests.\+test\+\_\+web\+\_\+config.\+Test\+Web\+Config}} }{\pageref{classtests_1_1test__web__config_1_1TestWebConfig}}{}
+\end{DoxyCompactList}
diff --git a/docs/latex/api__client_8py.tex b/docs/latex/api__client_8py.tex
new file mode 100644
index 0000000..5c88c67
--- /dev/null
+++ b/docs/latex/api__client_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{api__client_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/api\+\_\+client.py File Reference}
+\label{api__client_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/api\_client.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/api\_client.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{penify\+\_\+hook.\+api\+\_\+client.\+APIClient}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1api__client}{penify\+\_\+hook.\+api\+\_\+client}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/auth__commands_8py.tex b/docs/latex/auth__commands_8py.tex
new file mode 100644
index 0000000..0d000ae
--- /dev/null
+++ b/docs/latex/auth__commands_8py.tex
@@ -0,0 +1,18 @@
+\hypertarget{auth__commands_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/auth\+\_\+commands.py File Reference}
+\label{auth__commands_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/auth\_commands.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/auth\_commands.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands}{penify\+\_\+hook.\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1auth__commands}{penify\+\_\+hook.\+commands.\+auth\+\_\+commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24}{penify\+\_\+hook.\+commands.\+auth\+\_\+commands.\+save\+\_\+credentials}} (api\+\_\+key)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655}{penify\+\_\+hook.\+commands.\+auth\+\_\+commands.\+login}} (api\+\_\+url, dashboard\+\_\+url)
+\end{DoxyCompactItemize}
diff --git a/docs/latex/base__analyzer_8py.tex b/docs/latex/base__analyzer_8py.tex
new file mode 100644
index 0000000..2010fe0
--- /dev/null
+++ b/docs/latex/base__analyzer_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{base__analyzer_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/base\+\_\+analyzer.py File Reference}
+\label{base__analyzer_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/base\_analyzer.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/base\_analyzer.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer}{penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1base__analyzer}{penify\+\_\+hook.\+base\+\_\+analyzer}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/classException.tex b/docs/latex/classException.tex
new file mode 100644
index 0000000..99a8354
--- /dev/null
+++ b/docs/latex/classException.tex
@@ -0,0 +1,27 @@
+\hypertarget{classException}{}\doxysection{Exception Class Reference}
+\label{classException}\index{Exception@{Exception}}
+
+
+Inheritance diagram for Exception\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=222pt]{classException__inherit__graph}
+\end{center}
+\end{figure}
+
+
+Collaboration diagram for Exception\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=145pt]{classException__coll__graph}
+\end{center}
+\end{figure}
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{utils_8py}{utils.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classException__coll__graph.md5 b/docs/latex/classException__coll__graph.md5
new file mode 100644
index 0000000..38ed226
--- /dev/null
+++ b/docs/latex/classException__coll__graph.md5
@@ -0,0 +1 @@
+8bfc7cbaf3c53c3b1288446104b2c7ee
\ No newline at end of file
diff --git a/docs/latex/classException__coll__graph.pdf b/docs/latex/classException__coll__graph.pdf
new file mode 100644
index 0000000..b993645
Binary files /dev/null and b/docs/latex/classException__coll__graph.pdf differ
diff --git a/docs/latex/classException__inherit__graph.md5 b/docs/latex/classException__inherit__graph.md5
new file mode 100644
index 0000000..9da9907
--- /dev/null
+++ b/docs/latex/classException__inherit__graph.md5
@@ -0,0 +1 @@
+0369339521e829fc6d9c723dfaa74cc8
\ No newline at end of file
diff --git a/docs/latex/classException__inherit__graph.pdf b/docs/latex/classException__inherit__graph.pdf
new file mode 100644
index 0000000..2c5b885
Binary files /dev/null and b/docs/latex/classException__inherit__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1api__client_1_1APIClient.tex b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient.tex
new file mode 100644
index 0000000..a4615dd
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient.tex
@@ -0,0 +1,142 @@
+\hypertarget{classpenify__hook_1_1api__client_1_1APIClient}{}\doxysection{penify\+\_\+hook.\+api\+\_\+client.\+APIClient Class Reference}
+\label{classpenify__hook_1_1api__client_1_1APIClient}\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+
+
+Collaboration diagram for penify\+\_\+hook.\+api\+\_\+client.\+APIClient\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=253pt]{classpenify__hook_1_1api__client_1_1APIClient__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_ad9cb741a8baf2d13f845e25a36311086}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_a130cf688ed35dc0e8cbd8320b6b2d872}{api\+\_\+url}}, str api\+\_\+token=None, str bearer\+\_\+token=None)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_ac5aad61508c2cafdf6e88e6c7d6c82b3}{send\+\_\+file\+\_\+for\+\_\+docstring\+\_\+generation}} (self, file\+\_\+name, content, line\+\_\+numbers, repo\+\_\+details=None)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce}{generate\+\_\+commit\+\_\+summary}} (self, git\+\_\+diff, str instruction=\char`\"{}\char`\"{}, repo\+\_\+details=None, dict jira\+\_\+context=None)
+\item
+list\mbox{[}str\mbox{]} \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_a5d2b4a26b24352d951ea79ecc4ff3402}{get\+\_\+supported\+\_\+file\+\_\+types}} (self)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3}{generate\+\_\+commit\+\_\+summary\+\_\+with\+\_\+llm}} (self, diff, message, bool generate\+\_\+description, repo\+\_\+details, \mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient}{LLMClient}} llm\+\_\+client, jira\+\_\+context=None)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_ad15b790608e703c8c122aa2ead7dfa99}{get\+\_\+api\+\_\+key}} (self)
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_a130cf688ed35dc0e8cbd8320b6b2d872}{api\+\_\+url}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_a5bb502603717946ad710b49ad9d95237}{AUTH\+\_\+\+TOKEN}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient_a7d7e2cf42c54eb4f25adee96a09ee7b0}{BEARER\+\_\+\+TOKEN}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_ad9cb741a8baf2d13f845e25a36311086}\label{classpenify__hook_1_1api__client_1_1APIClient_ad9cb741a8baf2d13f845e25a36311086}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!\_\_init\_\_@{\_\_init\_\_}}
+\index{\_\_init\_\_@{\_\_init\_\_}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{api\+\_\+url, }\item[{str }]{api\+\_\+token = {\ttfamily None}, }\item[{str }]{bearer\+\_\+token = {\ttfamily None} }\end{DoxyParamCaption})}
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce}\label{classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!generate\_commit\_summary@{generate\_commit\_summary}}
+\index{generate\_commit\_summary@{generate\_commit\_summary}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{generate\_commit\_summary()}{generate\_commit\_summary()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+generate\+\_\+commit\+\_\+summary (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{git\+\_\+diff, }\item[{str }]{instruction = {\ttfamily \char`\"{}\char`\"{}}, }\item[{}]{repo\+\_\+details = {\ttfamily None}, }\item[{dict }]{jira\+\_\+context = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Generates a commit summary by sending a POST request to the API endpoint.
+
+This function constructs a payload containing the git diff and any additional
+instructions provided. It then sends this payload to a specified API endpoint
+to generate a summary of the commit. If the request is successful, it returns
+the response from the API; otherwise, it returns None. The function also
+handles optional repository details and JIRA context if they are provided.
+
+Args:
+ git_diff (str): The git diff of the commit.
+ instruction (str): Additional instruction for the commit. Defaults to "".
+ repo_details (dict): Details of the git repository. Defaults to None.
+ jira_context (dict): JIRA issue details to enhance the commit summary. Defaults to None.
+
+Returns:
+ dict: The response from the API if the request is successful, None otherwise.
+\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3}\label{classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!generate\_commit\_summary\_with\_llm@{generate\_commit\_summary\_with\_llm}}
+\index{generate\_commit\_summary\_with\_llm@{generate\_commit\_summary\_with\_llm}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{generate\_commit\_summary\_with\_llm()}{generate\_commit\_summary\_with\_llm()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+generate\+\_\+commit\+\_\+summary\+\_\+with\+\_\+llm (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{diff, }\item[{}]{message, }\item[{bool}]{generate\+\_\+description, }\item[{}]{repo\+\_\+details, }\item[{\mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient}{LLMClient}}}]{llm\+\_\+client, }\item[{}]{jira\+\_\+context = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Generates a commit summary using a local LLM client; falls back to API on
+error.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_ad15b790608e703c8c122aa2ead7dfa99}\label{classpenify__hook_1_1api__client_1_1APIClient_ad15b790608e703c8c122aa2ead7dfa99}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!get\_api\_key@{get\_api\_key}}
+\index{get\_api\_key@{get\_api\_key}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{get\_api\_key()}{get\_api\_key()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+get\+\_\+api\+\_\+key (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Fetch an API key from a specified URL using a Bearer token.\end{DoxyVerb}
+ \mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_a5d2b4a26b24352d951ea79ecc4ff3402}\label{classpenify__hook_1_1api__client_1_1APIClient_a5d2b4a26b24352d951ea79ecc4ff3402}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!get\_supported\_file\_types@{get\_supported\_file\_types}}
+\index{get\_supported\_file\_types@{get\_supported\_file\_types}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{get\_supported\_file\_types()}{get\_supported\_file\_types()}}
+{\footnotesize\ttfamily list\mbox{[}str\mbox{]} penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+get\+\_\+supported\+\_\+file\+\_\+types (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Retrieve supported file types from the API or return a default list.\end{DoxyVerb}
+ \mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_ac5aad61508c2cafdf6e88e6c7d6c82b3}\label{classpenify__hook_1_1api__client_1_1APIClient_ac5aad61508c2cafdf6e88e6c7d6c82b3}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!send\_file\_for\_docstring\_generation@{send\_file\_for\_docstring\_generation}}
+\index{send\_file\_for\_docstring\_generation@{send\_file\_for\_docstring\_generation}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{send\_file\_for\_docstring\_generation()}{send\_file\_for\_docstring\_generation()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+send\+\_\+file\+\_\+for\+\_\+docstring\+\_\+generation (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{file\+\_\+name, }\item[{}]{content, }\item[{}]{line\+\_\+numbers, }\item[{}]{repo\+\_\+details = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Send file content and modified lines to the API and return modified content.\end{DoxyVerb}
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_a130cf688ed35dc0e8cbd8320b6b2d872}\label{classpenify__hook_1_1api__client_1_1APIClient_a130cf688ed35dc0e8cbd8320b6b2d872}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!api\_url@{api\_url}}
+\index{api\_url@{api\_url}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{api\_url}{api\_url}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+api\+\_\+url}
+
+\mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_a5bb502603717946ad710b49ad9d95237}\label{classpenify__hook_1_1api__client_1_1APIClient_a5bb502603717946ad710b49ad9d95237}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!AUTH\_TOKEN@{AUTH\_TOKEN}}
+\index{AUTH\_TOKEN@{AUTH\_TOKEN}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{AUTH\_TOKEN}{AUTH\_TOKEN}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+AUTH\+\_\+\+TOKEN}
+
+\mbox{\Hypertarget{classpenify__hook_1_1api__client_1_1APIClient_a7d7e2cf42c54eb4f25adee96a09ee7b0}\label{classpenify__hook_1_1api__client_1_1APIClient_a7d7e2cf42c54eb4f25adee96a09ee7b0}}
+\index{penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}!BEARER\_TOKEN@{BEARER\_TOKEN}}
+\index{BEARER\_TOKEN@{BEARER\_TOKEN}!penify\_hook.api\_client.APIClient@{penify\_hook.api\_client.APIClient}}
+\doxysubsubsection{\texorpdfstring{BEARER\_TOKEN}{BEARER\_TOKEN}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+api\+\_\+client.\+APIClient.\+BEARER\+\_\+\+TOKEN}
+
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{api__client_8py}{api\+\_\+client.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5
new file mode 100644
index 0000000..2c7b583
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5
@@ -0,0 +1 @@
+92a3e9cee2cd5e4975e6a42b548f0d62
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.pdf b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.pdf
new file mode 100644
index 0000000..4195610
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5
new file mode 100644
index 0000000..057ae7a
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5
@@ -0,0 +1 @@
+c32bbe2c64601ea3a3ae63d4ee184f5c
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.pdf b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.pdf
new file mode 100644
index 0000000..efe6c7d
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5
new file mode 100644
index 0000000..003c9e9
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5
@@ -0,0 +1 @@
+1edc4dc702a27cb3bbe6a36743a7fda9
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.pdf b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.pdf
new file mode 100644
index 0000000..44cad83
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.tex b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.tex
new file mode 100644
index 0000000..7a3de00
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.tex
@@ -0,0 +1,107 @@
+\hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer}{}\doxysection{penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer Class Reference}
+\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer}\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+
+
+Inheritance diagram for penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph}
+\end{center}
+\end{figure}
+
+
+Collaboration diagram for penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=232pt]{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab1296a3d1e9070d891801876b66f7344}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, str \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_aa67c06dd12b1bafaeaee81c41dcb7e25}{folder\+\_\+path}}, \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}} \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a81e9c55709205aaf4ebbe2b41683baf2}{api\+\_\+client}})
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_aa67c06dd12b1bafaeaee81c41dcb7e25}{folder\+\_\+path}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a957e81a1ab561f6cecfbe999e7b85499}{repo\+\_\+path}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a3a9ddfa1dfba81fe21214fe486389369}{repo}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a9cca3465b0cc00d78324b0a9eac1d7f5}{repo\+\_\+details}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab702c0c3ba81d159d7c3bcd7ea2abba4}{relative\+\_\+file\+\_\+path}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a81e9c55709205aaf4ebbe2b41683baf2}{api\+\_\+client}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a0cac0310ec635aa64a34857cf30ce1eb}{supported\+\_\+file\+\_\+types}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab1296a3d1e9070d891801876b66f7344}\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab1296a3d1e9070d891801876b66f7344}}
+\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}!\_\_init\_\_@{\_\_init\_\_}}
+\index{\_\_init\_\_@{\_\_init\_\_}!penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{folder\+\_\+path, }\item[{\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}}}]{api\+\_\+client }\end{DoxyParamCaption})}
+
+
+
+Reimplemented in \mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a1bb0358140931d82c7616f12efe31821}{penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook}}, \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a190c473090b2a07e7cb43073a3211c4b}{penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook}}, \mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c}{penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook}}, and \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e}{penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook}}.
+
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a81e9c55709205aaf4ebbe2b41683baf2}\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a81e9c55709205aaf4ebbe2b41683baf2}}
+\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}!api\_client@{api\_client}}
+\index{api\_client@{api\_client}!penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+\doxysubsubsection{\texorpdfstring{api\_client}{api\_client}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer.\+api\+\_\+client}
+
+\mbox{\Hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_aa67c06dd12b1bafaeaee81c41dcb7e25}\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_aa67c06dd12b1bafaeaee81c41dcb7e25}}
+\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}!folder\_path@{folder\_path}}
+\index{folder\_path@{folder\_path}!penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+\doxysubsubsection{\texorpdfstring{folder\_path}{folder\_path}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer.\+folder\+\_\+path}
+
+\mbox{\Hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab702c0c3ba81d159d7c3bcd7ea2abba4}\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab702c0c3ba81d159d7c3bcd7ea2abba4}}
+\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}!relative\_file\_path@{relative\_file\_path}}
+\index{relative\_file\_path@{relative\_file\_path}!penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+\doxysubsubsection{\texorpdfstring{relative\_file\_path}{relative\_file\_path}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer.\+relative\+\_\+file\+\_\+path}
+
+\mbox{\Hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a3a9ddfa1dfba81fe21214fe486389369}\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a3a9ddfa1dfba81fe21214fe486389369}}
+\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}!repo@{repo}}
+\index{repo@{repo}!penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+\doxysubsubsection{\texorpdfstring{repo}{repo}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer.\+repo}
+
+\mbox{\Hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a9cca3465b0cc00d78324b0a9eac1d7f5}\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a9cca3465b0cc00d78324b0a9eac1d7f5}}
+\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}!repo\_details@{repo\_details}}
+\index{repo\_details@{repo\_details}!penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+\doxysubsubsection{\texorpdfstring{repo\_details}{repo\_details}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer.\+repo\+\_\+details}
+
+\mbox{\Hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a957e81a1ab561f6cecfbe999e7b85499}\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a957e81a1ab561f6cecfbe999e7b85499}}
+\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}!repo\_path@{repo\_path}}
+\index{repo\_path@{repo\_path}!penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+\doxysubsubsection{\texorpdfstring{repo\_path}{repo\_path}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer.\+repo\+\_\+path}
+
+\mbox{\Hypertarget{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a0cac0310ec635aa64a34857cf30ce1eb}\label{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a0cac0310ec635aa64a34857cf30ce1eb}}
+\index{penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}!supported\_file\_types@{supported\_file\_types}}
+\index{supported\_file\_types@{supported\_file\_types}!penify\_hook.base\_analyzer.BaseAnalyzer@{penify\_hook.base\_analyzer.BaseAnalyzer}}
+\doxysubsubsection{\texorpdfstring{supported\_file\_types}{supported\_file\_types}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer.\+supported\+\_\+file\+\_\+types}
+
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{base__analyzer_8py}{base\+\_\+analyzer.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5
new file mode 100644
index 0000000..8f67765
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5
@@ -0,0 +1 @@
+ba0c3a1d5b95dea65df70168e43976e0
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.pdf b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.pdf
new file mode 100644
index 0000000..b1b3bce
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5
new file mode 100644
index 0000000..8ac4d16
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5
@@ -0,0 +1 @@
+78c7a1fd0d3db6799e694367914b2b16
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.pdf b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.pdf
new file mode 100644
index 0000000..4301d5f
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.tex b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.tex
new file mode 100644
index 0000000..64d4f3a
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.tex
@@ -0,0 +1,209 @@
+\hypertarget{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook}{}\doxysection{penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook Class Reference}
+\label{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook}\index{penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}}
+
+
+Inheritance diagram for penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=249pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph}
+\end{center}
+\end{figure}
+
+
+Collaboration diagram for penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=249pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, str \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a957e81a1ab561f6cecfbe999e7b85499}{repo\+\_\+path}}, \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}} \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a81e9c55709205aaf4ebbe2b41683baf2}{api\+\_\+client}}, \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ad93360e31f2ec58a0d7c9f08b219028a}{llm\+\_\+client}}=None, jira\+\_\+client=None)
+\item
+dict \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37}{get\+\_\+summary}} (self, str instruction, bool generate\+\_\+description)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9}{run}} (self, Optional\mbox{[}str\mbox{]} msg, bool edit\+\_\+commit\+\_\+message, bool generate\+\_\+description)
+\item
+tuple \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f}{process\+\_\+jira\+\_\+integration}} (self, str title, str description, str msg)
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ad93360e31f2ec58a0d7c9f08b219028a}{llm\+\_\+client}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Private Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca}{\+\_\+amend\+\_\+commit}} (self)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e}\label{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e}}
+\index{penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}!\_\_init\_\_@{\_\_init\_\_}}
+\index{\_\_init\_\_@{\_\_init\_\_}!penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{repo\+\_\+path, }\item[{\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}}}]{api\+\_\+client, }\item[{}]{llm\+\_\+client = {\ttfamily None}, }\item[{}]{jira\+\_\+client = {\ttfamily None} }\end{DoxyParamCaption})}
+
+
+
+Reimplemented from \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab1296a3d1e9070d891801876b66f7344}{penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer}}.
+
+Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=252pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=252pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca}\label{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca}}
+\index{penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}!\_amend\_commit@{\_amend\_commit}}
+\index{\_amend\_commit@{\_amend\_commit}!penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{\_amend\_commit()}{\_amend\_commit()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook.\+\_\+amend\+\_\+commit (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [private]}}
+
+\begin{DoxyVerb}Amends the last commit message in the repository.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37}\label{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37}}
+\index{penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}!get\_summary@{get\_summary}}
+\index{get\_summary@{get\_summary}!penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{get\_summary()}{get\_summary()}}
+{\footnotesize\ttfamily dict penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook.\+get\+\_\+summary (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{instruction, }\item[{bool}]{generate\+\_\+description }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Generate a summary for the commit based on the staged changes.
+
+This function retrieves the differences of the staged changes in the repository
+and generates a commit summary using the provided instruction. If there are no
+changes staged for commit, an exception is raised. If a JIRA client is
+connected, it will attempt to extract issue keys from the current branch and
+use them to fetch context. The summary can be generated either with a Language
+Model (LLM) client or through the API client.
+
+Args:
+ instruction (str): A string containing instructions for generating the commit summary.
+ generate_description (bool): Whether to include detailed descriptions in the summary.
+
+Raises:
+ ValueError: If there are no changes staged for commit.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f}\label{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f}}
+\index{penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}!process\_jira\_integration@{process\_jira\_integration}}
+\index{process\_jira\_integration@{process\_jira\_integration}!penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{process\_jira\_integration()}{process\_jira\_integration()}}
+{\footnotesize\ttfamily tuple penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook.\+process\+\_\+jira\+\_\+integration (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{title, }\item[{str}]{description, }\item[{str}]{msg }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Process JIRA integration by extracting issue keys from commit message
+components and branch name.
+
+This function looks for JIRA issue keys in the provided commit title,
+description, original user message, and the active branch name. It uses these
+keys to update the commit message with JIRA information and adds comments to
+the corresponding JIRA issues. If no keys are found, it logs a warning.
+
+Args:
+ title (str): The generated commit title.
+ description (str): The generated commit description.
+ msg (str): The original user message that might contain JIRA references.
+
+Returns:
+ tuple: A tuple containing the updated commit title and description with included JIRA
+ information.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9}\label{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9}}
+\index{penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}!run@{run}}
+\index{run@{run}!penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{run()}{run()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook.\+run (\begin{DoxyParamCaption}\item[{}]{self, }\item[{Optional\mbox{[}str\mbox{]}}]{msg, }\item[{bool}]{edit\+\_\+commit\+\_\+message, }\item[{bool}]{generate\+\_\+description }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Run the post-commit hook.
+
+This method processes the modified files from the last commit, stages them, and
+creates an auto-commit with an optional message. It also handles JIRA
+integration if available. If there is an error generating the commit summary,
+an exception is raised.
+
+Args:
+ msg (Optional[str]): An optional message to include in the commit.
+ edit_commit_message (bool): A flag indicating whether to open the git commit
+ edit terminal after committing.
+ generate_description (bool): A flag indicating whether to include a description
+ in the commit message.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ad93360e31f2ec58a0d7c9f08b219028a}\label{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ad93360e31f2ec58a0d7c9f08b219028a}}
+\index{penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}!llm\_client@{llm\_client}}
+\index{llm\_client@{llm\_client}!penify\_hook.commit\_analyzer.CommitDocGenHook@{penify\_hook.commit\_analyzer.CommitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{llm\_client}{llm\_client}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook.\+llm\+\_\+client}
+
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{commit__analyzer_8py}{commit\+\_\+analyzer.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5
new file mode 100644
index 0000000..35df147
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5
@@ -0,0 +1 @@
+7b1e9da3153fe718973c563cc1f30008
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.pdf
new file mode 100644
index 0000000..bd975c7
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5
new file mode 100644
index 0000000..35df147
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5
@@ -0,0 +1 @@
+7b1e9da3153fe718973c563cc1f30008
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.pdf
new file mode 100644
index 0000000..bd975c7
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5
new file mode 100644
index 0000000..ba338a1
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5
@@ -0,0 +1 @@
+5902c80c1d724536feb6bf090e4c6e48
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.pdf
new file mode 100644
index 0000000..04be3c4
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5
new file mode 100644
index 0000000..509e440
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5
@@ -0,0 +1 @@
+13c7d6aeed6f4fa79b99539888c943c5
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.pdf
new file mode 100644
index 0000000..e7c9599
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5
new file mode 100644
index 0000000..7c7ea1e
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5
@@ -0,0 +1 @@
+16dda8bcf7bb544a1ac1a3ee749a4c12
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.pdf
new file mode 100644
index 0000000..041dd2f
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5
new file mode 100644
index 0000000..60c5b76
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5
@@ -0,0 +1 @@
+227f3af6dd4655e93382d230110c696c
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.pdf
new file mode 100644
index 0000000..61f9a81
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5
new file mode 100644
index 0000000..7d58051
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5
@@ -0,0 +1 @@
+71c8bbc9a0279bebdaf9302e6ef06f8c
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.pdf
new file mode 100644
index 0000000..171b7ee
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5
new file mode 100644
index 0000000..5d17f80
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5
@@ -0,0 +1 @@
+3d7dac766372b5b869a22364e1f96e2e
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.pdf
new file mode 100644
index 0000000..8196166
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5
new file mode 100644
index 0000000..308ea89
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5
@@ -0,0 +1 @@
+7e5b42cf201193b45ebc6a2301be181f
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.pdf
new file mode 100644
index 0000000..ba0f925
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5
new file mode 100644
index 0000000..dd65a22
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5
@@ -0,0 +1 @@
+07f6c9f36c4b1be5bb1cf0c8fc522d64
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.pdf b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.pdf
new file mode 100644
index 0000000..1884141
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.tex b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.tex
new file mode 100644
index 0000000..4a80143
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.tex
@@ -0,0 +1,137 @@
+\hypertarget{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook}{}\doxysection{penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook Class Reference}
+\label{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook}\index{penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}}
+
+
+Inheritance diagram for penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=232pt]{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph}
+\end{center}
+\end{figure}
+
+
+Collaboration diagram for penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=232pt]{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a190c473090b2a07e7cb43073a3211c4b}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, str \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a9b03b88a9ce1b9af945279375048dc32}{file\+\_\+path}}, \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}} \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a81e9c55709205aaf4ebbe2b41683baf2}{api\+\_\+client}})
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e}{process\+\_\+file}} (self, \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a9b03b88a9ce1b9af945279375048dc32}{file\+\_\+path}}, pbar, str new\+\_\+param=\char`\"{}\char`\"{})
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073}{print\+\_\+processing}} (self, \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a9b03b88a9ce1b9af945279375048dc32}{file\+\_\+path}})
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1}{run}} (self)
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a9b03b88a9ce1b9af945279375048dc32}{file\+\_\+path}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a190c473090b2a07e7cb43073a3211c4b}\label{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a190c473090b2a07e7cb43073a3211c4b}}
+\index{penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}!\_\_init\_\_@{\_\_init\_\_}}
+\index{\_\_init\_\_@{\_\_init\_\_}!penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{file\+\_\+path, }\item[{\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}}}]{api\+\_\+client }\end{DoxyParamCaption})}
+
+
+
+Reimplemented from \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab1296a3d1e9070d891801876b66f7344}{penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer}}.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073}\label{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073}}
+\index{penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}!print\_processing@{print\_processing}}
+\index{print\_processing@{print\_processing}!penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{print\_processing()}{print\_processing()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook.\+print\+\_\+processing (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{file\+\_\+path }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Prints a message indicating that a file is being processed.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e}\label{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e}}
+\index{penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}!process\_file@{process\_file}}
+\index{process\_file@{process\_file}!penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{process\_file()}{process\_file()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook.\+process\+\_\+file (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{file\+\_\+path, }\item[{}]{pbar, }\item[{str }]{new\+\_\+param = {\ttfamily \char`\"{}\char`\"{}} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Processes a file by validating its extension, reading content,
+generating documentation, and writing changes back to the file. The function
+performs several stages of processing: 1. Validates the file's extension to
+ensure it is supported. 2. Reads the content of the file. 3. Sends the file
+content for documentation generation. 4. Writes the generated documentation
+back to the file if there are changes.
+
+Args:
+ file_path (str): The path of the file to be processed.
+ pbar (tqdm.tqdm): A progress bar object to update the status of processing stages.
+ new_param (str?): An additional parameter for future use. Defaults to an empty string.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1}\label{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1}}
+\index{penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}!run@{run}}
+\index{run@{run}!penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{run()}{run()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook.\+run (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Runs the documentation process with a progress bar.
+
+This method orchestrates the documentation process by creating a progress bar,
+processing the file, and handling exceptions to ensure the progress bar
+completes properly. It updates the progress bar through various stages and
+provides feedback based on the result of the file processing.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a9b03b88a9ce1b9af945279375048dc32}\label{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a9b03b88a9ce1b9af945279375048dc32}}
+\index{penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}!file\_path@{file\_path}}
+\index{file\_path@{file\_path}!penify\_hook.file\_analyzer.FileAnalyzerGenHook@{penify\_hook.file\_analyzer.FileAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{file\_path}{file\_path}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook.\+file\+\_\+path}
+
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{file__analyzer_8py}{file\+\_\+analyzer.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5
new file mode 100644
index 0000000..72d294f
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5
@@ -0,0 +1 @@
+f623cc67d7a4a31617b4c5845170b4e6
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.pdf b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.pdf
new file mode 100644
index 0000000..73a7604
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5
new file mode 100644
index 0000000..72d294f
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5
@@ -0,0 +1 @@
+f623cc67d7a4a31617b4c5845170b4e6
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.pdf b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.pdf
new file mode 100644
index 0000000..73a7604
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5
new file mode 100644
index 0000000..2e49928
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5
@@ -0,0 +1 @@
+1efb0855e6048d713024cec5d6e365a2
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.pdf b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.pdf
new file mode 100644
index 0000000..889132b
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5
new file mode 100644
index 0000000..e69240d
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5
@@ -0,0 +1 @@
+5f3ec66eaa94bda06214ac6b7da5c11e
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.pdf b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.pdf
new file mode 100644
index 0000000..7e567df
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5
new file mode 100644
index 0000000..919e132
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5
@@ -0,0 +1 @@
+021ee7d254db5a7eecf98c56f461c558
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.pdf b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.pdf
new file mode 100644
index 0000000..ce540e9
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5
new file mode 100644
index 0000000..183ef73
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5
@@ -0,0 +1 @@
+000b7c30ac00693a301980d5799ae8a3
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.pdf b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.pdf
new file mode 100644
index 0000000..6cbfef7
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.tex b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.tex
new file mode 100644
index 0000000..88f43e4
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.tex
@@ -0,0 +1,105 @@
+\hypertarget{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook}{}\doxysection{penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook Class Reference}
+\label{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook}\index{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}}
+
+
+Inheritance diagram for penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=264pt]{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph}
+\end{center}
+\end{figure}
+
+
+Collaboration diagram for penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=264pt]{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a1bb0358140931d82c7616f12efe31821}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, str \mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a53f73d69cc0f00763ee4830e4f0f7393}{dir\+\_\+path}}, \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}} \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a81e9c55709205aaf4ebbe2b41683baf2}{api\+\_\+client}})
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec}{list\+\_\+all\+\_\+files\+\_\+in\+\_\+dir}} (self, str \mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a53f73d69cc0f00763ee4830e4f0f7393}{dir\+\_\+path}})
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc}{run}} (self)
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a53f73d69cc0f00763ee4830e4f0f7393}{dir\+\_\+path}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a1bb0358140931d82c7616f12efe31821}\label{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a1bb0358140931d82c7616f12efe31821}}
+\index{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}!\_\_init\_\_@{\_\_init\_\_}}
+\index{\_\_init\_\_@{\_\_init\_\_}!penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{dir\+\_\+path, }\item[{\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}}}]{api\+\_\+client }\end{DoxyParamCaption})}
+
+
+
+Reimplemented from \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab1296a3d1e9070d891801876b66f7344}{penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer}}.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec}\label{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec}}
+\index{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}!list\_all\_files\_in\_dir@{list\_all\_files\_in\_dir}}
+\index{list\_all\_files\_in\_dir@{list\_all\_files\_in\_dir}!penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{list\_all\_files\_in\_dir()}{list\_all\_files\_in\_dir()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook.\+list\+\_\+all\+\_\+files\+\_\+in\+\_\+dir (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{dir\+\_\+path }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}List all non-hidden files in a directory and its subdirectories.
+
+This function recursively traverses the specified directory and its
+subdirectories, collecting paths of all non-hidden files. It filters out hidden
+directories and files (those starting with a dot) to ensure only visible files
+are returned.
+
+Args:
+ dir_path (str): The path to the directory whose files and subdirectory files need to be listed.
+\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc}\label{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc}}
+\index{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}!run@{run}}
+\index{run@{run}!penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{run()}{run()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook.\+run (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Run the post-commit hook and process files with a progress bar.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a53f73d69cc0f00763ee4830e4f0f7393}\label{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a53f73d69cc0f00763ee4830e4f0f7393}}
+\index{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}!dir\_path@{dir\_path}}
+\index{dir\_path@{dir\_path}!penify\_hook.folder\_analyzer.FolderAnalyzerGenHook@{penify\_hook.folder\_analyzer.FolderAnalyzerGenHook}}
+\doxysubsubsection{\texorpdfstring{dir\_path}{dir\_path}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook.\+dir\+\_\+path}
+
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{folder__analyzer_8py}{folder\+\_\+analyzer.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5
new file mode 100644
index 0000000..f267fb5
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5
@@ -0,0 +1 @@
+e2418599999dd43b3b774ba832ff7679
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.pdf b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.pdf
new file mode 100644
index 0000000..c821a4d
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5
new file mode 100644
index 0000000..f267fb5
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5
@@ -0,0 +1 @@
+e2418599999dd43b3b774ba832ff7679
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.pdf b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.pdf
new file mode 100644
index 0000000..c821a4d
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5
new file mode 100644
index 0000000..9edbb7f
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5
@@ -0,0 +1 @@
+4b626a5d73186fe5984747cb8eb5699e
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.pdf b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.pdf
new file mode 100644
index 0000000..4965f70
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5
new file mode 100644
index 0000000..0845786
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5
@@ -0,0 +1 @@
+feda0e58feb9f9a10947ea8378ae74dd
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.pdf b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.pdf
new file mode 100644
index 0000000..3e59576
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.tex b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.tex
new file mode 100644
index 0000000..95a820e
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.tex
@@ -0,0 +1,172 @@
+\hypertarget{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook}{}\doxysection{penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook Class Reference}
+\label{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook}\index{penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}}
+
+
+Inheritance diagram for penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=232pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph}
+\end{center}
+\end{figure}
+
+
+Collaboration diagram for penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=232pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, str \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a957e81a1ab561f6cecfbe999e7b85499}{repo\+\_\+path}}, \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}} \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_a81e9c55709205aaf4ebbe2b41683baf2}{api\+\_\+client}})
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481}{get\+\_\+modified\+\_\+files\+\_\+in\+\_\+last\+\_\+commit}} (self)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd}{get\+\_\+modified\+\_\+lines}} (self, diff\+\_\+text)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85}{process\+\_\+file}} (self, file\+\_\+path)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae}{run}} (self)
+\end{DoxyCompactItemize}
+\doxysubsection*{Additional Inherited Members}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c}\label{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c}}
+\index{penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}!\_\_init\_\_@{\_\_init\_\_}}
+\index{\_\_init\_\_@{\_\_init\_\_}!penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{repo\+\_\+path, }\item[{\mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}}}]{api\+\_\+client }\end{DoxyParamCaption})}
+
+
+
+Reimplemented from \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer_ab1296a3d1e9070d891801876b66f7344}{penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer}}.
+
+Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=221pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=221pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481}\label{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481}}
+\index{penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}!get\_modified\_files\_in\_last\_commit@{get\_modified\_files\_in\_last\_commit}}
+\index{get\_modified\_files\_in\_last\_commit@{get\_modified\_files\_in\_last\_commit}!penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{get\_modified\_files\_in\_last\_commit()}{get\_modified\_files\_in\_last\_commit()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook.\+get\+\_\+modified\+\_\+files\+\_\+in\+\_\+last\+\_\+commit (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Get the list of files modified in the last commit.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd}\label{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd}}
+\index{penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}!get\_modified\_lines@{get\_modified\_lines}}
+\index{get\_modified\_lines@{get\_modified\_lines}!penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{get\_modified\_lines()}{get\_modified\_lines()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook.\+get\+\_\+modified\+\_\+lines (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{diff\+\_\+text }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Extract modified line numbers from a diff text.
+
+This function processes a diff text to identify and extract the line numbers
+that have been modified. It distinguishes between added and deleted lines and
+keeps track of the current line number as it parses through the diff. The
+function handles hunk headers and ensures that any deletions at the end of the
+file are also captured.
+
+Args:
+ diff_text (str): A string containing the diff text to be processed.
+\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85}\label{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85}}
+\index{penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}!process\_file@{process\_file}}
+\index{process\_file@{process\_file}!penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{process\_file()}{process\_file()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook.\+process\+\_\+file (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{file\+\_\+path }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Processes a file by checking its type, reading its content, and sending it to
+an API.
+
+This method constructs the absolute path of the specified file and verifies if
+the file has a valid extension. If the file type is supported, it reads the
+content of the file and retrieves the differences from the last commit in the
+repository. If changes are detected, it sends the file content along with the
+modified lines to an API for further processing. If the API response indicates
+no changes, the original file will not be overwritten.
+
+Args:
+ file_path (str): The relative path to the file to be processed.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae}\label{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae}}
+\index{penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}!run@{run}}
+\index{run@{run}!penify\_hook.git\_analyzer.GitDocGenHook@{penify\_hook.git\_analyzer.GitDocGenHook}}
+\doxysubsubsection{\texorpdfstring{run()}{run()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook.\+run (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Run the post-commit hook.
+
+This method retrieves the list of modified files from the last commit and
+processes each file. It stages any files that have been modified during
+processing and creates an auto-commit if changes were made. A progress bar is
+displayed to indicate the processing status of each file. The method handles
+any exceptions that occur during file processing, printing an error message for
+each file that fails to process. If any modifications are made to the files, an
+auto-commit is created to save those changes.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph}
+\end{center}
+\end{figure}
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{git__analyzer_8py}{git\+\_\+analyzer.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5
new file mode 100644
index 0000000..0d79f1e
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5
@@ -0,0 +1 @@
+ba80f175c8cd7a8a783b166fbb3a2ca2
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.pdf
new file mode 100644
index 0000000..f37ac98
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5
new file mode 100644
index 0000000..0d79f1e
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5
@@ -0,0 +1 @@
+ba80f175c8cd7a8a783b166fbb3a2ca2
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.pdf
new file mode 100644
index 0000000..f37ac98
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5
new file mode 100644
index 0000000..b91e421
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5
@@ -0,0 +1 @@
+81df036896289c80f1003b3dadbab751
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.pdf
new file mode 100644
index 0000000..6523f87
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5
new file mode 100644
index 0000000..8f064ad
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5
@@ -0,0 +1 @@
+33b112b67f2f608b8139e9b2d4d8036a
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.pdf
new file mode 100644
index 0000000..0c48010
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5
new file mode 100644
index 0000000..f69765c
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5
@@ -0,0 +1 @@
+f90a7307f64d3cc918b7a108f87099ba
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.pdf
new file mode 100644
index 0000000..35f809e
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5
new file mode 100644
index 0000000..f8b92d2
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5
@@ -0,0 +1 @@
+31223da7995a497de7dfb15cad3db840
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.pdf
new file mode 100644
index 0000000..dbe1da8
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5
new file mode 100644
index 0000000..eb830b8
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5
@@ -0,0 +1 @@
+dc504961442038a74f38d545279487ec
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.pdf
new file mode 100644
index 0000000..3cd65e2
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5
new file mode 100644
index 0000000..8fb1cfb
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5
@@ -0,0 +1 @@
+ce5e5759ae8990671a19084de5b38951
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.pdf
new file mode 100644
index 0000000..45b0b0d
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5
new file mode 100644
index 0000000..575d3a3
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5
@@ -0,0 +1 @@
+ec09b97c599665269fd73299b9fa3d02
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.pdf b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.pdf
new file mode 100644
index 0000000..5858ee3
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient.tex b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient.tex
new file mode 100644
index 0000000..f2bf7b2
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient.tex
@@ -0,0 +1,385 @@
+\hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient}{}\doxysection{penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client Class Reference}
+\label{classpenify__hook_1_1jira__client_1_1JiraClient}\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+
+
+Collaboration diagram for penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=249pt]{classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_a47efc1ec07389c960f2dfb37ba8c09f5}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, str \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_a3c0cfecff02a75cb7001509a595b8197}{jira\+\_\+url}}=None, str \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_ae56104d5aa7bda7bb26d169c4b46038c}{jira\+\_\+user}}=None, str \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_afc5c90e53b702f9fc27e2ee7d3f991b9}{jira\+\_\+api\+\_\+token}}=None)
+\item
+bool \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8}{is\+\_\+connected}} (self)
+\item
+List\mbox{[}str\mbox{]} \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c}{extract\+\_\+issue\+\_\+keys\+\_\+from\+\_\+branch}} (self, str branch\+\_\+name)
+\item
+List\mbox{[}str\mbox{]} \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7}{extract\+\_\+issue\+\_\+keys}} (self, str text)
+\item
+Optional\mbox{[}Dict\mbox{[}str, Any\mbox{]}\mbox{]} \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a}{get\+\_\+issue\+\_\+details}} (self, str issue\+\_\+key)
+\item
+bool \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1}{add\+\_\+comment}} (self, str issue\+\_\+key, str comment)
+\item
+bool \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826}{update\+\_\+issue\+\_\+status}} (self, str issue\+\_\+key, str transition\+\_\+name)
+\item
+tuple \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23}{format\+\_\+commit\+\_\+message\+\_\+with\+\_\+jira\+\_\+info}} (self, str commit\+\_\+title, str commit\+\_\+description, List\mbox{[}str\mbox{]} issue\+\_\+keys=None)
+\item
+Dict\mbox{[}str, Any\mbox{]} \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746}{get\+\_\+detailed\+\_\+issue\+\_\+context}} (self, str issue\+\_\+key)
+\item
+Dict\mbox{[}str, Any\mbox{]} \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd}{get\+\_\+commit\+\_\+context\+\_\+from\+\_\+issues}} (self, List\mbox{[}str\mbox{]} issue\+\_\+keys)
+\item
+tuple \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760}{enhance\+\_\+commit\+\_\+message}} (self, str title, str description, List\mbox{[}str\mbox{]} issue\+\_\+keys)
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_a3c0cfecff02a75cb7001509a595b8197}{jira\+\_\+url}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_ae56104d5aa7bda7bb26d169c4b46038c}{jira\+\_\+user}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_afc5c90e53b702f9fc27e2ee7d3f991b9}{jira\+\_\+api\+\_\+token}}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient_aefb3f96c79358cf3a95d96d3747235b6}{jira\+\_\+client}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+\begin{DoxyVerb}Client for interacting with JIRA API
+\end{DoxyVerb}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_a47efc1ec07389c960f2dfb37ba8c09f5}\label{classpenify__hook_1_1jira__client_1_1JiraClient_a47efc1ec07389c960f2dfb37ba8c09f5}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!\_\_init\_\_@{\_\_init\_\_}}
+\index{\_\_init\_\_@{\_\_init\_\_}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str }]{jira\+\_\+url = {\ttfamily None}, }\item[{str }]{jira\+\_\+user = {\ttfamily None}, }\item[{str }]{jira\+\_\+api\+\_\+token = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Initialize the JIRA client.
+
+Args:
+ jira_url: Base URL for JIRA instance (e.g., "https://your-domain.atlassian.net")
+ jira_user: JIRA username or email
+ jira_api_token: JIRA API token
+\end{DoxyVerb}
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1}\label{classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!add\_comment@{add\_comment}}
+\index{add\_comment@{add\_comment}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{add\_comment()}{add\_comment()}}
+{\footnotesize\ttfamily bool penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+add\+\_\+comment (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{issue\+\_\+key, }\item[{str}]{comment }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Adds a comment to a JIRA issue.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=214pt]{classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760}\label{classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!enhance\_commit\_message@{enhance\_commit\_message}}
+\index{enhance\_commit\_message@{enhance\_commit\_message}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{enhance\_commit\_message()}{enhance\_commit\_message()}}
+{\footnotesize\ttfamily tuple penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+enhance\+\_\+commit\+\_\+message (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{title, }\item[{str}]{description, }\item[{List\mbox{[}str\mbox{]}}]{issue\+\_\+keys }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Enhance a commit message with business and technical context from JIRA issues.
+
+This function first checks if the list of issue keys is empty or if there is no
+connection. If so, it returns the original title and description without
+modification. It then retrieves context information from the specified JIRA
+issues. If the primary issue is missing, it formats the commit message with
+basic JIRA info. The function enhances the commit title by prefixing it with
+the primary issue key if not already included. It appends a business context
+section to the description, including details like issue type, status,
+priority, sprint, acceptance criteria, and a condensed issue description. If
+comments are available, they are added as technical notes. Finally, related
+issues are listed.
+
+Args:
+ title (str): Original commit title.
+ description (str): Original commit description.
+ issue_keys (List[str]): List of JIRA issue keys to include in the enhanced commit message.
+
+Returns:
+ tuple: A tuple containing the enhanced commit title and description with added
+ context from JIRA issues.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7}\label{classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!extract\_issue\_keys@{extract\_issue\_keys}}
+\index{extract\_issue\_keys@{extract\_issue\_keys}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{extract\_issue\_keys()}{extract\_issue\_keys()}}
+{\footnotesize\ttfamily List\mbox{[}str\mbox{]} penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+extract\+\_\+issue\+\_\+keys (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{text }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Extract unique JIRA issue keys from the given text.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c}\label{classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!extract\_issue\_keys\_from\_branch@{extract\_issue\_keys\_from\_branch}}
+\index{extract\_issue\_keys\_from\_branch@{extract\_issue\_keys\_from\_branch}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{extract\_issue\_keys\_from\_branch()}{extract\_issue\_keys\_from\_branch()}}
+{\footnotesize\ttfamily List\mbox{[}str\mbox{]} penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+extract\+\_\+issue\+\_\+keys\+\_\+from\+\_\+branch (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{branch\+\_\+name }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Extracts unique JIRA issue keys from a branch name.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23}\label{classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!format\_commit\_message\_with\_jira\_info@{format\_commit\_message\_with\_jira\_info}}
+\index{format\_commit\_message\_with\_jira\_info@{format\_commit\_message\_with\_jira\_info}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{format\_commit\_message\_with\_jira\_info()}{format\_commit\_message\_with\_jira\_info()}}
+{\footnotesize\ttfamily tuple penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+format\+\_\+commit\+\_\+message\+\_\+with\+\_\+jira\+\_\+info (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{commit\+\_\+title, }\item[{str}]{commit\+\_\+description, }\item[{List\mbox{[}str\mbox{]} }]{issue\+\_\+keys = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Format commit message with JIRA issue information.
+
+This function updates the provided commit title and description by
+incorporating JIRA issue keys. If no issue keys are supplied, it extracts them
+from the commit title and description. It then formats the commit title to
+include the first issue key if not already present and appends detailed
+information about each issue to the commit description.
+
+Args:
+ commit_title (str): The original commit title.
+ commit_description (str): The original commit description.
+ issue_keys (List[str]?): A list of JIRA issue keys to include in the commit message. If not
+ provided, issue keys will be extracted from both the title and the description.
+
+Returns:
+ tuple: A tuple containing the updated commit title and description with JIRA
+ information included.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd}\label{classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!get\_commit\_context\_from\_issues@{get\_commit\_context\_from\_issues}}
+\index{get\_commit\_context\_from\_issues@{get\_commit\_context\_from\_issues}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{get\_commit\_context\_from\_issues()}{get\_commit\_context\_from\_issues()}}
+{\footnotesize\ttfamily Dict\mbox{[}str, Any\mbox{]} penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+get\+\_\+commit\+\_\+context\+\_\+from\+\_\+issues (\begin{DoxyParamCaption}\item[{}]{self, }\item[{List\mbox{[}str\mbox{]}}]{issue\+\_\+keys }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Gather contextual information from JIRA issues to improve commit messages.
+
+This function processes a list of JIRA issue keys, retrieves detailed context
+for each issue, and aggregates it into a dictionary that can be used to enhance
+commit messages. It first retrieves the primary issue (the first key in the
+list) and then gathers basic details for any related issues. The resulting
+context includes information from both the primary and related issues, along
+with all issue keys.
+
+Args:
+ issue_keys: List of JIRA issue keys to gather information from
+
+Returns:
+ Dict containing business and technical context from the issues
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746}\label{classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!get\_detailed\_issue\_context@{get\_detailed\_issue\_context}}
+\index{get\_detailed\_issue\_context@{get\_detailed\_issue\_context}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{get\_detailed\_issue\_context()}{get\_detailed\_issue\_context()}}
+{\footnotesize\ttfamily Dict\mbox{[}str, Any\mbox{]} penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+get\+\_\+detailed\+\_\+issue\+\_\+context (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{issue\+\_\+key }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Retrieve comprehensive details about a JIRA issue including context for better
+commit messages.
+
+This function fetches detailed information from a specified JIRA issue and
+constructs a dictionary containing various context fields such as the issue
+summary, description, type, status, priority, comments, URL, and additional
+custom fields like acceptance criteria and sprint information. It handles
+errors by logging appropriate warnings or errors.
+
+Args:
+ issue_key (str): The JIRA issue key (e.g., "PROJECT-123").
+
+Returns:
+ Dict[str, Any]: A dictionary containing business and technical context from the issue.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a}\label{classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!get\_issue\_details@{get\_issue\_details}}
+\index{get\_issue\_details@{get\_issue\_details}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{get\_issue\_details()}{get\_issue\_details()}}
+{\footnotesize\ttfamily Optional\mbox{[}Dict\mbox{[}str, Any\mbox{]}\mbox{]} penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+get\+\_\+issue\+\_\+details (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{issue\+\_\+key }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Retrieve details of a JIRA issue based on its key.
+
+This function fetches detailed information about a specified JIRA issue using
+the provided issue key. It first checks if the JIRA client is connected; if
+not, it logs a warning and returns `None`. If connected, it attempts to
+retrieve the issue from the JIRA server. On success, it constructs and returns
+a dictionary containing various details such as the issue's key, summary,
+status, description, assignee, reporter, type, priority, and URL. Errors during
+this process are logged, and `None` is returned.
+
+Args:
+ issue_key (str): The JIRA issue key (e.g., "PROJECT-123").
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8}\label{classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!is\_connected@{is\_connected}}
+\index{is\_connected@{is\_connected}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{is\_connected()}{is\_connected()}}
+{\footnotesize\ttfamily bool penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+is\+\_\+connected (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Check if the JIRA client is connected.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826}\label{classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!update\_issue\_status@{update\_issue\_status}}
+\index{update\_issue\_status@{update\_issue\_status}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{update\_issue\_status()}{update\_issue\_status()}}
+{\footnotesize\ttfamily bool penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+update\+\_\+issue\+\_\+status (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{issue\+\_\+key, }\item[{str}]{transition\+\_\+name }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Update the status of a JIRA issue.
+
+This method checks if the JIRA client is connected, retrieves available
+transitions for the given issue, finds the transition ID by name, and updates
+the issue's status accordingly. If any step fails or the specified transition
+is not found, appropriate logs are generated, and False is returned.
+
+Args:
+ issue_key (str): The key of the JIRA issue to be updated.
+ transition_name (str): The name of the desired transition.
+
+Returns:
+ bool: True if the status was successfully updated, False otherwise.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_afc5c90e53b702f9fc27e2ee7d3f991b9}\label{classpenify__hook_1_1jira__client_1_1JiraClient_afc5c90e53b702f9fc27e2ee7d3f991b9}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!jira\_api\_token@{jira\_api\_token}}
+\index{jira\_api\_token@{jira\_api\_token}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{jira\_api\_token}{jira\_api\_token}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+jira\+\_\+api\+\_\+token}
+
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_aefb3f96c79358cf3a95d96d3747235b6}\label{classpenify__hook_1_1jira__client_1_1JiraClient_aefb3f96c79358cf3a95d96d3747235b6}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!jira\_client@{jira\_client}}
+\index{jira\_client@{jira\_client}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{jira\_client}{jira\_client}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+jira\+\_\+client}
+
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_a3c0cfecff02a75cb7001509a595b8197}\label{classpenify__hook_1_1jira__client_1_1JiraClient_a3c0cfecff02a75cb7001509a595b8197}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!jira\_url@{jira\_url}}
+\index{jira\_url@{jira\_url}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{jira\_url}{jira\_url}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+jira\+\_\+url}
+
+\mbox{\Hypertarget{classpenify__hook_1_1jira__client_1_1JiraClient_ae56104d5aa7bda7bb26d169c4b46038c}\label{classpenify__hook_1_1jira__client_1_1JiraClient_ae56104d5aa7bda7bb26d169c4b46038c}}
+\index{penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}!jira\_user@{jira\_user}}
+\index{jira\_user@{jira\_user}!penify\_hook.jira\_client.JiraClient@{penify\_hook.jira\_client.JiraClient}}
+\doxysubsubsection{\texorpdfstring{jira\_user}{jira\_user}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client.\+jira\+\_\+user}
+
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{jira__client_8py}{jira\+\_\+client.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5
new file mode 100644
index 0000000..fd79a8c
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5
@@ -0,0 +1 @@
+6c94c8bb54063a87c9a021e499d2535a
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.pdf
new file mode 100644
index 0000000..b59615b
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5
new file mode 100644
index 0000000..4f76689
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5
@@ -0,0 +1 @@
+d9c961753cc4792464fe3c85cedbe856
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.pdf
new file mode 100644
index 0000000..f17348b
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5
new file mode 100644
index 0000000..bc6a797
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5
@@ -0,0 +1 @@
+74ab897115bdf73d0673ae4d3c453424
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.pdf
new file mode 100644
index 0000000..73b8554
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5
new file mode 100644
index 0000000..a70b9c4
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5
@@ -0,0 +1 @@
+5319eca6878b7d6832e9bdc8be03738a
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.pdf
new file mode 100644
index 0000000..4de59e3
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5
new file mode 100644
index 0000000..cd2ab30
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5
@@ -0,0 +1 @@
+59f65545c475e1236f381b97e10a73b2
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.pdf
new file mode 100644
index 0000000..3e7ccf1
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5
new file mode 100644
index 0000000..d1d416c
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5
@@ -0,0 +1 @@
+108eaf4e9eb179fe34b5c143d8f3b77f
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.pdf
new file mode 100644
index 0000000..5875948
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5
new file mode 100644
index 0000000..29d336d
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5
@@ -0,0 +1 @@
+be94ea6e8f451a00f89ca284d3ee8a3d
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.pdf
new file mode 100644
index 0000000..17b5f53
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5
new file mode 100644
index 0000000..4137dd0
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5
@@ -0,0 +1 @@
+4c42f4b9261fd8bafc0cdbd84c4a2d06
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.pdf
new file mode 100644
index 0000000..0962a4a
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5
new file mode 100644
index 0000000..95b147d
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5
@@ -0,0 +1 @@
+0798f9beeb60a44c1bc5ca62261ada05
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.pdf
new file mode 100644
index 0000000..9a7cd82
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5
new file mode 100644
index 0000000..95c2a13
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5
@@ -0,0 +1 @@
+82a924fb803bae4eea70d4d2949f0e40
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.pdf
new file mode 100644
index 0000000..8aeb218
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5
new file mode 100644
index 0000000..37101d3
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5
@@ -0,0 +1 @@
+7a6ed880c269c90b02697722d952c6fd
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.pdf
new file mode 100644
index 0000000..a1f2150
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5
new file mode 100644
index 0000000..19f1c1f
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5
@@ -0,0 +1 @@
+246e9f67fc708d577ce4f865ea93dfe6
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.pdf
new file mode 100644
index 0000000..c6e514d
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5
new file mode 100644
index 0000000..0cdb932
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5
@@ -0,0 +1 @@
+84c0ac4cc42a31fa0084643ff5dfef52
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.pdf
new file mode 100644
index 0000000..26ce94b
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5
new file mode 100644
index 0000000..054af3e
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5
@@ -0,0 +1 @@
+2778ffc1c7608101c6acfd0955cdbab0
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.pdf
new file mode 100644
index 0000000..f21afbc
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5
new file mode 100644
index 0000000..7549805
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5
@@ -0,0 +1 @@
+4958523d483bc2dacf73dab4fccf8adf
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.pdf
new file mode 100644
index 0000000..89e2285
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5
new file mode 100644
index 0000000..689761a
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5
@@ -0,0 +1 @@
+d563cdebf5480e94abacfee4e435799c
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.pdf b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.pdf
new file mode 100644
index 0000000..e493fed
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient.tex b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient.tex
new file mode 100644
index 0000000..eeaaef2
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient.tex
@@ -0,0 +1,134 @@
+\hypertarget{classpenify__hook_1_1llm__client_1_1LLMClient}{}\doxysection{penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient Class Reference}
+\label{classpenify__hook_1_1llm__client_1_1LLMClient}\index{penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}}
+
+
+Collaboration diagram for penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=258pt]{classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient_a76d92354f585ab4bb291169f9f530764}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, str \mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient_abc2cb6b1d6d9b5dc16401ca078ec8c10}{model}}=None, str api\+\_\+base=None, str api\+\_\+key=None)
+\item
+def \mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e}{litellm}} (self)
+\item
+Dict \mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000}{generate\+\_\+commit\+\_\+summary}} (self, str diff, str message, bool generate\+\_\+description, Dict repo\+\_\+details, Dict jira\+\_\+context=None)
+\end{DoxyCompactItemize}
+\doxysubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient_abc2cb6b1d6d9b5dc16401ca078ec8c10}{model}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Private Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient_a76c2e9805f805624ab9c55a9f1f8d362}{\+\_\+litellm}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+\begin{DoxyVerb}Client for interacting with LLM models using LiteLLM.
+\end{DoxyVerb}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1llm__client_1_1LLMClient_a76d92354f585ab4bb291169f9f530764}\label{classpenify__hook_1_1llm__client_1_1LLMClient_a76d92354f585ab4bb291169f9f530764}}
+\index{penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}!\_\_init\_\_@{\_\_init\_\_}}
+\index{\_\_init\_\_@{\_\_init\_\_}!penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}}
+\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str }]{model = {\ttfamily None}, }\item[{str }]{api\+\_\+base = {\ttfamily None}, }\item[{str }]{api\+\_\+key = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Initialize the LLM client.
+
+Args:
+ model: LLM model to use (e.g., "gpt-4", "ollama/llama2", etc.)
+ api_base: Base URL for API requests (e.g., "http://localhost:11434" for Ollama)
+ api_key: API key for the LLM service
+\end{DoxyVerb}
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000}\label{classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000}}
+\index{penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}!generate\_commit\_summary@{generate\_commit\_summary}}
+\index{generate\_commit\_summary@{generate\_commit\_summary}!penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}}
+\doxysubsubsection{\texorpdfstring{generate\_commit\_summary()}{generate\_commit\_summary()}}
+{\footnotesize\ttfamily Dict penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient.\+generate\+\_\+commit\+\_\+summary (\begin{DoxyParamCaption}\item[{}]{self, }\item[{str}]{diff, }\item[{str}]{message, }\item[{bool}]{generate\+\_\+description, }\item[{Dict}]{repo\+\_\+details, }\item[{Dict }]{jira\+\_\+context = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Generate a concise and descriptive commit summary based on Git diff, user
+instructions, repository details, and optional JIRA context.
+
+This function constructs a prompt for an LLM to produce a commit title and, if
+requested, a detailed description. The summary adheres to Semantic Commit
+Messages guidelines. If JIRA context is provided, it enriches the prompt with
+relevant issue information.
+
+Args:
+ diff (str): Git diff of changes.
+ message (str): User-provided commit message or instructions.
+ generate_description (bool): Flag indicating whether to include a detailed description in the summary.
+ repo_details (Dict): Details about the repository.
+ jira_context (Dict?): Optional JIRA issue context to enhance the summary.
+
+Returns:
+ Dict: A dictionary containing the title and description for the commit. If
+ `generate_description` is False, the 'description' key may be absent.
+
+Raises:
+ ValueError: If the LLM model is not configured.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e}\label{classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e}}
+\index{penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}!litellm@{litellm}}
+\index{litellm@{litellm}!penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}}
+\doxysubsubsection{\texorpdfstring{litellm()}{litellm()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient.\+litellm (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Returns the litellm module, loading it if necessary.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Member Data Documentation}
+\mbox{\Hypertarget{classpenify__hook_1_1llm__client_1_1LLMClient_a76c2e9805f805624ab9c55a9f1f8d362}\label{classpenify__hook_1_1llm__client_1_1LLMClient_a76c2e9805f805624ab9c55a9f1f8d362}}
+\index{penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}!\_litellm@{\_litellm}}
+\index{\_litellm@{\_litellm}!penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}}
+\doxysubsubsection{\texorpdfstring{\_litellm}{\_litellm}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient.\+\_\+litellm\hspace{0.3cm}{\ttfamily [private]}}
+
+\mbox{\Hypertarget{classpenify__hook_1_1llm__client_1_1LLMClient_abc2cb6b1d6d9b5dc16401ca078ec8c10}\label{classpenify__hook_1_1llm__client_1_1LLMClient_abc2cb6b1d6d9b5dc16401ca078ec8c10}}
+\index{penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}!model@{model}}
+\index{model@{model}!penify\_hook.llm\_client.LLMClient@{penify\_hook.llm\_client.LLMClient}}
+\doxysubsubsection{\texorpdfstring{model}{model}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient.\+model}
+
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{llm__client_8py}{llm\+\_\+client.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5
new file mode 100644
index 0000000..6db17d2
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5
@@ -0,0 +1 @@
+98e4897c5b45a162671e50e760d299ce
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.pdf b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.pdf
new file mode 100644
index 0000000..3cf5dac
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5
new file mode 100644
index 0000000..c5f4239
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5
@@ -0,0 +1 @@
+b9ba1c97807d802a29ce91d786445eb1
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.pdf b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.pdf
new file mode 100644
index 0000000..5b70aa8
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5
new file mode 100644
index 0000000..4a2ae5f
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5
@@ -0,0 +1 @@
+dc5241e4c3ad5601ac52862d2cb0fc00
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.pdf b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.pdf
new file mode 100644
index 0000000..22bb9da
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5
new file mode 100644
index 0000000..0fa3961
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5
@@ -0,0 +1 @@
+1877c6aa43a0000e92c849c9a84bae25
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.pdf b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.pdf
new file mode 100644
index 0000000..92779e9
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.tex b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.tex
new file mode 100644
index 0000000..7f24815
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.tex
@@ -0,0 +1,27 @@
+\hypertarget{classpenify__hook_1_1utils_1_1GitRepoNotFoundError}{}\doxysection{penify\+\_\+hook.\+utils.\+Git\+Repo\+Not\+Found\+Error Class Reference}
+\label{classpenify__hook_1_1utils_1_1GitRepoNotFoundError}\index{penify\_hook.utils.GitRepoNotFoundError@{penify\_hook.utils.GitRepoNotFoundError}}
+
+
+Inheritance diagram for penify\+\_\+hook.\+utils.\+Git\+Repo\+Not\+Found\+Error\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=222pt]{classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph}
+\end{center}
+\end{figure}
+
+
+Collaboration diagram for penify\+\_\+hook.\+utils.\+Git\+Repo\+Not\+Found\+Error\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=222pt]{classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph}
+\end{center}
+\end{figure}
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{utils_8py}{utils.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5
new file mode 100644
index 0000000..1be38be
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5
@@ -0,0 +1 @@
+fc4615bb344e1dfa7e3a4dfdff48f342
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.pdf b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.pdf
new file mode 100644
index 0000000..a937c60
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.pdf differ
diff --git a/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5
new file mode 100644
index 0000000..1be38be
--- /dev/null
+++ b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5
@@ -0,0 +1 @@
+fc4615bb344e1dfa7e3a4dfdff48f342
\ No newline at end of file
diff --git a/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.pdf b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.pdf
new file mode 100644
index 0000000..a937c60
Binary files /dev/null and b/docs/latex/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.pdf differ
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands.tex b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands.tex
new file mode 100644
index 0000000..6877977
--- /dev/null
+++ b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands.tex
@@ -0,0 +1,335 @@
+\hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands}{}\doxysection{tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands Class Reference}
+\label{classtests_1_1test__commit__commands_1_1TestCommitCommands}\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+
+
+Collaboration diagram for tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=247pt]{classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_abcd2354a2af4afe19e57877628d3acc2}{mock\+\_\+api\+\_\+client}} (self)
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a20e78370ff5bd6223cc1dd4323a86ea4}{mock\+\_\+llm\+\_\+client}} (self)
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a05adaa9a713ff1be657455d0667bc6be}{mock\+\_\+jira\+\_\+client}} (self)
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_aa9b25a4bf692b8736164695072a398f6}{mock\+\_\+commit\+\_\+doc\+\_\+gen}} (self)
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a2842f456a8c0f1bf0f4def17c183c04e}{mock\+\_\+git\+\_\+folder\+\_\+search}} (self)
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_afafbae3c9aeb0e50a75996256c02c8be}{mock\+\_\+print\+\_\+functions}} (self)
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0}{test\+\_\+commit\+\_\+code\+\_\+with\+\_\+llm\+\_\+client}} (self, mock\+\_\+error, mock\+\_\+warning, mock\+\_\+info, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a2842f456a8c0f1bf0f4def17c183c04e}{mock\+\_\+git\+\_\+folder\+\_\+search}}, mock\+\_\+doc\+\_\+gen, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a20e78370ff5bd6223cc1dd4323a86ea4}{mock\+\_\+llm\+\_\+client}}, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_abcd2354a2af4afe19e57877628d3acc2}{mock\+\_\+api\+\_\+client}})
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b}{test\+\_\+commit\+\_\+code\+\_\+with\+\_\+jira\+\_\+client}} (self, mock\+\_\+error, mock\+\_\+warning, mock\+\_\+info, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a2842f456a8c0f1bf0f4def17c183c04e}{mock\+\_\+git\+\_\+folder\+\_\+search}}, mock\+\_\+doc\+\_\+gen, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a05adaa9a713ff1be657455d0667bc6be}{mock\+\_\+jira\+\_\+client}}, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a20e78370ff5bd6223cc1dd4323a86ea4}{mock\+\_\+llm\+\_\+client}}, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_abcd2354a2af4afe19e57877628d3acc2}{mock\+\_\+api\+\_\+client}})
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e}{test\+\_\+commit\+\_\+code\+\_\+with\+\_\+jira\+\_\+connection\+\_\+failure}} (self, mock\+\_\+error, mock\+\_\+warning, mock\+\_\+info, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a2842f456a8c0f1bf0f4def17c183c04e}{mock\+\_\+git\+\_\+folder\+\_\+search}}, mock\+\_\+doc\+\_\+gen, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a05adaa9a713ff1be657455d0667bc6be}{mock\+\_\+jira\+\_\+client}}, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_abcd2354a2af4afe19e57877628d3acc2}{mock\+\_\+api\+\_\+client}})
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691}{test\+\_\+commit\+\_\+code\+\_\+error\+\_\+handling}} (self, mock\+\_\+print, mock\+\_\+exit, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a2842f456a8c0f1bf0f4def17c183c04e}{mock\+\_\+git\+\_\+folder\+\_\+search}}, mock\+\_\+doc\+\_\+gen, \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_abcd2354a2af4afe19e57877628d3acc2}{mock\+\_\+api\+\_\+client}})
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc}{test\+\_\+setup\+\_\+commit\+\_\+parser}} (self)
+\item
+def \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597}{test\+\_\+handle\+\_\+commit}} (self, mock\+\_\+print\+\_\+info, mock\+\_\+commit\+\_\+code, mock\+\_\+get\+\_\+token, mock\+\_\+get\+\_\+llm\+\_\+config, mock\+\_\+get\+\_\+jira\+\_\+config)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_abcd2354a2af4afe19e57877628d3acc2}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_abcd2354a2af4afe19e57877628d3acc2}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!mock\_api\_client@{mock\_api\_client}}
+\index{mock\_api\_client@{mock\_api\_client}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{mock\_api\_client()}{mock\_api\_client()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+mock\+\_\+api\+\_\+client (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Mocks an instance of APIClient using unittest.mock.
+
+This function creates a mock object for APIClient and yields it along
+with the mocked instance. It is useful for testing purposes where real
+API calls should be avoided.
+
+Yields:
+ tuple: A tuple containing the mock of APIClient and the mocked instance of
+ APIClient.
+\end{DoxyVerb}
+ \mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_aa9b25a4bf692b8736164695072a398f6}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_aa9b25a4bf692b8736164695072a398f6}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!mock\_commit\_doc\_gen@{mock\_commit\_doc\_gen}}
+\index{mock\_commit\_doc\_gen@{mock\_commit\_doc\_gen}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{mock\_commit\_doc\_gen()}{mock\_commit\_doc\_gen()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+mock\+\_\+commit\+\_\+doc\+\_\+gen (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Mocks the CommitDocGenHook class and returns a MagicMock instance.
+
+This function uses the `patch` decorator from the `unittest.mock` module
+to create a mock of the `CommitDocGenHook` class. It then sets up this
+mock to return a new `MagicMock` instance when invoked. The function
+yields both the mock object and the mocked instance, allowing for easy
+testing of functions that rely on `CommitDocGenHook`.
+
+Returns:
+ tuple: A tuple containing two elements:
+ - mock (patch): The patch object used to mock the `CommitDocGenHook`
+ class.
+ - doc_gen_instance (MagicMock): The mocked instance of
+ `CommitDocGenHook`.
+\end{DoxyVerb}
+ \mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_a2842f456a8c0f1bf0f4def17c183c04e}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_a2842f456a8c0f1bf0f4def17c183c04e}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!mock\_git\_folder\_search@{mock\_git\_folder\_search}}
+\index{mock\_git\_folder\_search@{mock\_git\_folder\_search}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{mock\_git\_folder\_search()}{mock\_git\_folder\_search()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+mock\+\_\+git\+\_\+folder\+\_\+search (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Mock the `recursive_search_git_folder` function to return a predefined
+git folder path.
+
+This function uses the `patch` decorator from the `unittest.mock` module
+to intercept calls to `penify_hook.utils.recursive_search_git_folder`.
+When called, it will return '/mock/git/folder' instead of performing an
+actual search. This is useful for testing purposes where you need a
+consistent response without interacting with the file system.
+
+Yields:
+ MagicMock: A mock object that simulates the `recursive_search_git_folder` function.
+\end{DoxyVerb}
+ \mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_a05adaa9a713ff1be657455d0667bc6be}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_a05adaa9a713ff1be657455d0667bc6be}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!mock\_jira\_client@{mock\_jira\_client}}
+\index{mock\_jira\_client@{mock\_jira\_client}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{mock\_jira\_client()}{mock\_jira\_client()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+mock\+\_\+jira\+\_\+client (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Create a mock JIRA client for testing purposes.
+
+This function yields a tuple containing a mock JIRA client instance and
+its `is_connected` method. The mock client is configured to simulate an
+active connection. This is useful for unit tests that require
+interaction with a JIRA client without making actual network calls.
+
+Yields:
+ tuple: A tuple containing the mocked JIRA client instance and its
+ `is_connected` method.
+\end{DoxyVerb}
+ \mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_a20e78370ff5bd6223cc1dd4323a86ea4}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_a20e78370ff5bd6223cc1dd4323a86ea4}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!mock\_llm\_client@{mock\_llm\_client}}
+\index{mock\_llm\_client@{mock\_llm\_client}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{mock\_llm\_client()}{mock\_llm\_client()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+mock\+\_\+llm\+\_\+client (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Mock an instance of LLMClient for testing purposes.
+
+This function yields a mock object representing an instance of
+LLMClient, which can be used to simulate interactions with a language
+model during testing. The mock is patched to replace the actual
+LLMClient class from the penify_hook module.
+
+Yields:
+ tuple: A tuple containing two elements:
+ - mock (MagicMock): The mock object for LLMClient.
+ - llm_client_instance (MagicMock): An instance of the mocked LLMClient.
+\end{DoxyVerb}
+ \mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_afafbae3c9aeb0e50a75996256c02c8be}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_afafbae3c9aeb0e50a75996256c02c8be}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!mock\_print\_functions@{mock\_print\_functions}}
+\index{mock\_print\_functions@{mock\_print\_functions}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{mock\_print\_functions()}{mock\_print\_functions()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+mock\+\_\+print\+\_\+functions (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Mocks the print functions from `penify_hook.ui_utils` for testing
+purposes.
+
+This function uses Python's `unittest.mock.patch` to replace the actual
+print functions (`print`, `print_warning`, and `print_error`) with mock
+objects. These mock objects can be used in tests to capture calls made
+to these print functions without actually printing anything.
+
+Yields:
+ tuple: A tuple containing three mock objects corresponding to `print_info`,
+ `print_warning`,
+ and `print_error`.
+\end{DoxyVerb}
+ \mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!test\_commit\_code\_error\_handling@{test\_commit\_code\_error\_handling}}
+\index{test\_commit\_code\_error\_handling@{test\_commit\_code\_error\_handling}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{test\_commit\_code\_error\_handling()}{test\_commit\_code\_error\_handling()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+test\+\_\+commit\+\_\+code\+\_\+error\+\_\+handling (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+print, }\item[{}]{mock\+\_\+exit, }\item[{}]{mock\+\_\+git\+\_\+folder\+\_\+search, }\item[{}]{mock\+\_\+doc\+\_\+gen, }\item[{}]{mock\+\_\+api\+\_\+client }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the error handling in the test_commit_code function.
+
+This function sets up mocks to simulate exceptions and test the error
+handling of the commit_code function. It verifies that the function
+correctly prints an error message and exits with a status code of 1 when
+an exception occurs during documentation generation.
+
+Args:
+ mock_print (MagicMock): Mock for the print function, used to verify error message output.
+ mock_exit (MagicMock): Mock for the sys.exit function, used to verify exit behavior.
+ mock_git_folder_search (MagicMock): Mock for the git_folder_search function, returning a mock Git folder
+ path.
+ mock_doc_gen (MagicMock): Mock for the doc_gen function, simulating an exception during
+ documentation generation.
+ mock_api_client (MagicMock): Mock for the API client class, not directly used but referenced in the
+ function signature.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!test\_commit\_code\_with\_jira\_client@{test\_commit\_code\_with\_jira\_client}}
+\index{test\_commit\_code\_with\_jira\_client@{test\_commit\_code\_with\_jira\_client}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{test\_commit\_code\_with\_jira\_client()}{test\_commit\_code\_with\_jira\_client()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+test\+\_\+commit\+\_\+code\+\_\+with\+\_\+jira\+\_\+client (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+error, }\item[{}]{mock\+\_\+warning, }\item[{}]{mock\+\_\+info, }\item[{}]{mock\+\_\+git\+\_\+folder\+\_\+search, }\item[{}]{mock\+\_\+doc\+\_\+gen, }\item[{}]{mock\+\_\+jira\+\_\+client, }\item[{}]{mock\+\_\+llm\+\_\+client, }\item[{}]{mock\+\_\+api\+\_\+client }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test committing code using a JIRA client.
+
+This function tests the commit_code function with various parameters,
+including API and JIRA credentials. It sets up mock objects for
+dependencies such as the JIRA client, LLM client, and doc generator to
+simulate the behavior of the real classes. The function then calls
+commit_code and verifies that the JIRA client and doc generator are
+called with the correct parameters.
+
+Args:
+ mock_error (MagicMock): A MagicMock object for simulating error logging.
+ mock_warning (MagicMock): A MagicMock object for simulating warning logging.
+ mock_info (MagicMock): A MagicMock object for simulating info logging.
+ mock_git_folder_search (MagicMock): A MagicMock object for simulating the git folder search function.
+ mock_doc_gen (MagicMock): A MagicMock object for simulating the doc generator function.
+ mock_jira_client (MagicMock): A MagicMock object for simulating the JIRA client class.
+ mock_llm_client (MagicMock): A MagicMock object for simulating the LLM client class.
+ mock_api_client (MagicMock): A MagicMock object for simulating the API client class.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!test\_commit\_code\_with\_jira\_connection\_failure@{test\_commit\_code\_with\_jira\_connection\_failure}}
+\index{test\_commit\_code\_with\_jira\_connection\_failure@{test\_commit\_code\_with\_jira\_connection\_failure}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{test\_commit\_code\_with\_jira\_connection\_failure()}{test\_commit\_code\_with\_jira\_connection\_failure()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+test\+\_\+commit\+\_\+code\+\_\+with\+\_\+jira\+\_\+connection\+\_\+failure (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+error, }\item[{}]{mock\+\_\+warning, }\item[{}]{mock\+\_\+info, }\item[{}]{mock\+\_\+git\+\_\+folder\+\_\+search, }\item[{}]{mock\+\_\+doc\+\_\+gen, }\item[{}]{mock\+\_\+jira\+\_\+client, }\item[{}]{mock\+\_\+api\+\_\+client }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the commit_code function when JIRA connection fails.
+
+This function tests the scenario where the JIRA connection fails during
+a code commit. It sets up various mocks to simulate different components
+of the system and then calls the `commit_code` function with specific
+parameters. The function is expected to handle the JIRA connection
+failure gracefully by logging an appropriate warning.
+
+Args:
+ mock_error (MagicMock): Mock for error logging.
+ mock_warning (MagicMock): Mock for warning logging.
+ mock_info (MagicMock): Mock for info logging.
+ mock_git_folder_search (MagicMock): Mock for searching the Git folder.
+ mock_doc_gen (MagicMock): Mock for generating documentation.
+ mock_jira_client (MagicMock): Mock for creating a JIRA client.
+ mock_api_client (MagicMock): Mock for creating an API client.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!test\_commit\_code\_with\_llm\_client@{test\_commit\_code\_with\_llm\_client}}
+\index{test\_commit\_code\_with\_llm\_client@{test\_commit\_code\_with\_llm\_client}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{test\_commit\_code\_with\_llm\_client()}{test\_commit\_code\_with\_llm\_client()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+test\+\_\+commit\+\_\+code\+\_\+with\+\_\+llm\+\_\+client (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+error, }\item[{}]{mock\+\_\+warning, }\item[{}]{mock\+\_\+info, }\item[{}]{mock\+\_\+git\+\_\+folder\+\_\+search, }\item[{}]{mock\+\_\+doc\+\_\+gen, }\item[{}]{mock\+\_\+llm\+\_\+client, }\item[{}]{mock\+\_\+api\+\_\+client }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test committing code using an LLM client.
+
+This function sets up mock objects for various components and then calls
+the `commit_code` function with specified parameters. It verifies that
+the correct mocks are created and called with the appropriate arguments.
+
+Args:
+ mock_error (MagicMock): Mock object for error handling.
+ mock_warning (MagicMock): Mock object for warning logging.
+ mock_info (MagicMock): Mock object for info logging.
+ mock_git_folder_search (MagicMock): Mock object to simulate git folder search.
+ mock_doc_gen (MagicMock): Mock object for document generation.
+ mock_llm_client (MagicMock): Mock object for LLM client interaction.
+ mock_api_client (MagicMock): Mock object for API client interaction.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!test\_handle\_commit@{test\_handle\_commit}}
+\index{test\_handle\_commit@{test\_handle\_commit}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{test\_handle\_commit()}{test\_handle\_commit()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+test\+\_\+handle\+\_\+commit (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+print\+\_\+info, }\item[{}]{mock\+\_\+commit\+\_\+code, }\item[{}]{mock\+\_\+get\+\_\+token, }\item[{}]{mock\+\_\+get\+\_\+llm\+\_\+config, }\item[{}]{mock\+\_\+get\+\_\+jira\+\_\+config }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the handle_commit function with various mock objects.
+
+This function sets up mocks for retrieving LLM configuration, JIRA
+configuration, and commit code. It then creates an argument object and
+calls the handle_commit function. Finally, it verifies that the mock
+functions were called with the expected arguments.
+
+Args:
+ mock_print_info (MagicMock): Mock object for printing information.
+ mock_commit_code (MagicMock): Mock object for committing code.
+ mock_get_token (MagicMock): Mock object for retrieving API token.
+ mock_get_llm_config (MagicMock): Mock object for retrieving LLM configuration.
+ mock_get_jira_config (MagicMock): Mock object for retrieving JIRA configuration.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc}\label{classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc}}
+\index{tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}!test\_setup\_commit\_parser@{test\_setup\_commit\_parser}}
+\index{test\_setup\_commit\_parser@{test\_setup\_commit\_parser}!tests.test\_commit\_commands.TestCommitCommands@{tests.test\_commit\_commands.TestCommitCommands}}
+\doxysubsubsection{\texorpdfstring{test\_setup\_commit\_parser()}{test\_setup\_commit\_parser()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands.\+test\+\_\+setup\+\_\+commit\+\_\+parser (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Set up the argument parser for the commit command.
+
+This function configures an argument parser to handle various options
+for committing changes. It adds three arguments: - '-m' or '--message':
+An optional argument to specify a contextual commit message with a
+default value of "N/A". - '-e' or '--terminal': A boolean flag to open
+an edit terminal before committing. - '-d' or '--description': A boolean
+flag that, when set to False, indicates the generation of a commit
+message with title and description.
+
+Args:
+ parser (MagicMock): The argument parser to be configured.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph}
+\end{center}
+\end{figure}
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{test__commit__commands_8py}{test\+\_\+commit\+\_\+commands.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5
new file mode 100644
index 0000000..9d383d8
--- /dev/null
+++ b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5
@@ -0,0 +1 @@
+01c384c51b9b9d20ecd5af3519740055
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.pdf b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.pdf
new file mode 100644
index 0000000..a083f0b
Binary files /dev/null and b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.pdf differ
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5
new file mode 100644
index 0000000..0bcb06b
--- /dev/null
+++ b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5
@@ -0,0 +1 @@
+b4207e4a0a9cc4b560c2bdd086fa6992
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.pdf b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.pdf
new file mode 100644
index 0000000..61b6e4b
Binary files /dev/null and b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5
new file mode 100644
index 0000000..560cecf
--- /dev/null
+++ b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5
@@ -0,0 +1 @@
+ee848429cf8a98c730ddc19e4e1345b4
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.pdf b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.pdf
new file mode 100644
index 0000000..87e1dd5
Binary files /dev/null and b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5
new file mode 100644
index 0000000..892a6cf
--- /dev/null
+++ b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5
@@ -0,0 +1 @@
+04d529f303db72fc9a1fcdac8b95a8fb
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.pdf b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.pdf
new file mode 100644
index 0000000..e6e1e37
Binary files /dev/null and b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5
new file mode 100644
index 0000000..16564c3
--- /dev/null
+++ b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5
@@ -0,0 +1 @@
+bf3e55821a05a3419069ce0a3c280436
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.pdf b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.pdf
new file mode 100644
index 0000000..8b68e97
Binary files /dev/null and b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5
new file mode 100644
index 0000000..bfc64bc
--- /dev/null
+++ b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5
@@ -0,0 +1 @@
+b030395a323a2c2b33a5d701f4a8d16f
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.pdf b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.pdf
new file mode 100644
index 0000000..051796a
Binary files /dev/null and b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5
new file mode 100644
index 0000000..ba887dd
--- /dev/null
+++ b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5
@@ -0,0 +1 @@
+ec33c0d0af8706cda57456821aa23353
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.pdf b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.pdf
new file mode 100644
index 0000000..058cddb
Binary files /dev/null and b/docs/latex/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands.tex b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands.tex
new file mode 100644
index 0000000..d4efe16
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands.tex
@@ -0,0 +1,384 @@
+\hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands}{}\doxysection{tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands Class Reference}
+\label{classtests_1_1test__config__commands_1_1TestConfigCommands}\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+
+
+Collaboration diagram for tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=239pt]{classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a}{test\+\_\+get\+\_\+penify\+\_\+config\+\_\+existing\+\_\+dir}} (self, mock\+\_\+file\+\_\+open, mock\+\_\+makedirs, mock\+\_\+path, mock\+\_\+git\+\_\+folder)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948}{test\+\_\+get\+\_\+penify\+\_\+config\+\_\+new\+\_\+dir}} (self, mock\+\_\+file\+\_\+open, mock\+\_\+makedirs, mock\+\_\+path, mock\+\_\+git\+\_\+folder)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167}{test\+\_\+get\+\_\+llm\+\_\+config\+\_\+exists}} (self, mock\+\_\+file\+\_\+open, mock\+\_\+get\+\_\+config)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd}{test\+\_\+get\+\_\+llm\+\_\+config\+\_\+empty}} (self, mock\+\_\+file\+\_\+open, mock\+\_\+get\+\_\+config)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd}{test\+\_\+get\+\_\+llm\+\_\+config\+\_\+invalid\+\_\+json}} (self, mock\+\_\+print, mock\+\_\+file\+\_\+open, mock\+\_\+get\+\_\+config)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf}{test\+\_\+get\+\_\+jira\+\_\+config\+\_\+exists}} (self, mock\+\_\+file\+\_\+open, mock\+\_\+get\+\_\+config)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9}{test\+\_\+save\+\_\+llm\+\_\+config\+\_\+success}} (self, mock\+\_\+print, mock\+\_\+json\+\_\+dump, mock\+\_\+file\+\_\+open, mock\+\_\+get\+\_\+config)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac}{test\+\_\+save\+\_\+llm\+\_\+config\+\_\+failure}} (self, mock\+\_\+print, mock\+\_\+file\+\_\+open, mock\+\_\+get\+\_\+config)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375}{test\+\_\+save\+\_\+jira\+\_\+config\+\_\+success}} (self, mock\+\_\+print, mock\+\_\+json\+\_\+dump, mock\+\_\+file\+\_\+open, mock\+\_\+path)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232}{test\+\_\+get\+\_\+token\+\_\+from\+\_\+env}} (self, mock\+\_\+file\+\_\+open, mock\+\_\+path, mock\+\_\+getenv)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c}{test\+\_\+get\+\_\+token\+\_\+from\+\_\+config}} (self, mock\+\_\+file\+\_\+open, mock\+\_\+path, mock\+\_\+getenv)
+\item
+def \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436}{test\+\_\+get\+\_\+token\+\_\+not\+\_\+found}} (self, mock\+\_\+file\+\_\+open, mock\+\_\+path, mock\+\_\+getenv)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_jira\_config\_exists@{test\_get\_jira\_config\_exists}}
+\index{test\_get\_jira\_config\_exists@{test\_get\_jira\_config\_exists}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_jira\_config\_exists()}{test\_get\_jira\_config\_exists()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+jira\+\_\+config\+\_\+exists (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+get\+\_\+config }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test that get_jira_config returns the correct JIRA configuration when
+the configuration file exists.
+
+It sets up a mock for the configuration file to simulate its existence
+and verifies that the function reads from the correct file and returns
+the expected JIRA configuration dictionary. Additionally, it checks that
+the mock file open is called with the appropriate arguments.
+
+Args:
+ mock_file_open (MagicMock): A mock for the `open` function.
+ mock_get_config (MagicMock): A mock for the `get_config` function, which is expected to return a mock
+ configuration file object.
+
+Returns:
+ None: This test function does not explicitly return anything. Its assertions
+ serve as the verification of its correctness.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_llm\_config\_empty@{test\_get\_llm\_config\_empty}}
+\index{test\_get\_llm\_config\_empty@{test\_get\_llm\_config\_empty}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_llm\_config\_empty()}{test\_get\_llm\_config\_empty()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+llm\+\_\+config\+\_\+empty (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+get\+\_\+config }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the behavior of get_llm_config when called with an empty
+configuration file.
+
+This function sets up a mock configuration file that exists but returns
+no content. It then calls the `get_llm_config` function and asserts that
+it returns an empty dictionary and that the file open method was called
+exactly once with the correct arguments.
+
+Args:
+ mock_file_open (MagicMock): A MagicMock object simulating the built-in open function.
+ mock_get_config (MagicMock): A MagicMock object simulating the get_config function.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_llm\_config\_exists@{test\_get\_llm\_config\_exists}}
+\index{test\_get\_llm\_config\_exists@{test\_get\_llm\_config\_exists}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_llm\_config\_exists()}{test\_get\_llm\_config\_exists()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+llm\+\_\+config\+\_\+exists (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+get\+\_\+config }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the get_llm_config function when the configuration file exists.
+
+This function sets up a mock configuration file that exists and returns
+it when called. It then calls the get_llm_config function and asserts
+that it returns the correct configuration dictionary. Additionally, it
+checks that the mock_file_open function was called with the correct
+arguments.
+
+Args:
+ mock_file_open (MagicMock): A mock for the open() function.
+ mock_get_config (MagicMock): A mock for the get_config() function.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_llm\_config\_invalid\_json@{test\_get\_llm\_config\_invalid\_json}}
+\index{test\_get\_llm\_config\_invalid\_json@{test\_get\_llm\_config\_invalid\_json}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_llm\_config\_invalid\_json()}{test\_get\_llm\_config\_invalid\_json()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+llm\+\_\+config\+\_\+invalid\+\_\+json (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+print, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+get\+\_\+config }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test function to verify the behavior of get_llm_config when reading an
+invalid JSON file.
+
+It sets up a mock configuration file that exists but contains invalid
+JSON. The function is expected to handle this gracefully by printing an
+error message and returning an empty dictionary.
+
+Args:
+ mock_print (MagicMock): Mock for the print function.
+ mock_file_open (MagicMock): Mock for the open function.
+ mock_get_config (MagicMock): Mock for the get_config function, which returns the mock configuration
+ file.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_penify\_config\_existing\_dir@{test\_get\_penify\_config\_existing\_dir}}
+\index{test\_get\_penify\_config\_existing\_dir@{test\_get\_penify\_config\_existing\_dir}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_penify\_config\_existing\_dir()}{test\_get\_penify\_config\_existing\_dir()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+penify\+\_\+config\+\_\+existing\+\_\+dir (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+makedirs, }\item[{}]{mock\+\_\+path, }\item[{}]{mock\+\_\+git\+\_\+folder }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the get_penify_config function when the .penify config directory
+exists.
+
+It should not create a new directory and assert that all mocked
+functions were called correctly.
+
+Args:
+ mock_file_open (MagicMock): A MagicMock object simulating the open() function.
+ mock_makedirs (MagicMock): A MagicMock object simulating the os.makedirs() function.
+ mock_path (MagicMock): A MagicMock object simulating the Path class from pathlib module.
+ mock_git_folder (MagicMock): A MagicMock object simulating the git_folder_search() function.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_penify\_config\_new\_dir@{test\_get\_penify\_config\_new\_dir}}
+\index{test\_get\_penify\_config\_new\_dir@{test\_get\_penify\_config\_new\_dir}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_penify\_config\_new\_dir()}{test\_get\_penify\_config\_new\_dir()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+penify\+\_\+config\+\_\+new\+\_\+dir (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+makedirs, }\item[{}]{mock\+\_\+path, }\item[{}]{mock\+\_\+git\+\_\+folder }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the behavior of get_penify_config when the .penify directory does
+not exist.
+
+This function mocks various system calls to simulate a scenario where
+the .penify directory is not present. It then asserts that the
+appropriate actions are taken to create the directory and write an empty
+JSON file.
+
+Args:
+ mock_file_open (MagicMock): A MagicMock object simulating the `open` function.
+ mock_makedirs (MagicMock): A MagicMock object simulating the `os.makedirs` function.
+ mock_path (MagicMock): A MagicMock object simulating the `Path` class from `pathlib`.
+ mock_git_folder (MagicMock): A MagicMock object simulating a git folder search function.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_token\_from\_config@{test\_get\_token\_from\_config}}
+\index{test\_get\_token\_from\_config@{test\_get\_token\_from\_config}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_token\_from\_config()}{test\_get\_token\_from\_config()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+token\+\_\+from\+\_\+config (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+path, }\item[{}]{mock\+\_\+getenv }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test retrieving a token from the configuration.
+
+This function sets up mocks for environment variables and configuration
+files, calls the `get_token` function, and asserts its behavior. It
+verifies that when the environment variable is not found, the function
+reads a token from a configuration file located in the user's home
+directory.
+
+Args:
+ mock_file_open (MagicMock): A mock for the `open` function.
+ mock_path (MagicMock): A mock for the `pathlib.Path` class.
+ mock_getenv (MagicMock): A mock for the `os.getenv` function.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_token\_from\_env@{test\_get\_token\_from\_env}}
+\index{test\_get\_token\_from\_env@{test\_get\_token\_from\_env}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_token\_from\_env()}{test\_get\_token\_from\_env()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+token\+\_\+from\+\_\+env (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+path, }\item[{}]{mock\+\_\+getenv }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test retrieving a token from the environment variable.
+
+This function tests the behavior of `get_token` when an environment
+variable is set. It verifies that if the 'PENIFY_API_TOKEN' environment
+variable exists, the function returns its value without attempting to
+read a file.
+
+Args:
+ mock_file_open (MagicMock): A MagicMock object for simulating file operations.
+ mock_path (MagicMock): A MagicMock object for simulating path operations.
+ mock_getenv (MagicMock): A MagicMock object for simulating environment variable retrieval.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_get\_token\_not\_found@{test\_get\_token\_not\_found}}
+\index{test\_get\_token\_not\_found@{test\_get\_token\_not\_found}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_get\_token\_not\_found()}{test\_get\_token\_not\_found()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+get\+\_\+token\+\_\+not\+\_\+found (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+path, }\item[{}]{mock\+\_\+getenv }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the get_token function when the API token environment variable is
+not found.
+
+This function tests the scenario where the `PENIFY_API_TOKEN`
+environment variable is not set. It mocks the environment variable to
+return `None`, and verifies that the function returns `None`. The test
+also checks that the environment variable is accessed once and that a
+file open operation is attempted on a configuration file located in the
+user's home directory.
+
+Args:
+ mock_file_open (MagicMock): Mock for the built-in `open` function.
+ mock_path (MagicMock): Mock for the `pathlib.Path` module.
+ mock_getenv (MagicMock): Mock for the `os.getenv` function.
+
+Returns:
+ None: The function does not return anything; it asserts conditions to verify
+ correctness.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_save\_jira\_config\_success@{test\_save\_jira\_config\_success}}
+\index{test\_save\_jira\_config\_success@{test\_save\_jira\_config\_success}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_save\_jira\_config\_success()}{test\_save\_jira\_config\_success()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+save\+\_\+jira\+\_\+config\+\_\+success (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+print, }\item[{}]{mock\+\_\+json\+\_\+dump, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+path }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the save_jira_config function to ensure it saves JIRA configuration
+successfully.
+
+This function sets up mocks for various dependencies and tests the
+functionality of saving a JIRA configuration. It asserts that the
+function returns `True`, the JSON dump is called with the correct
+configuration, and the print statement contains the expected message.
+
+Args:
+ mock_print (MagicMock): Mock for the print function.
+ mock_json_dump (MagicMock): Mock for the json.dump function.
+ mock_file_open (MagicMock): Mock for the open function.
+ mock_path (MagicMock): Mock for the path module.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_save\_llm\_config\_failure@{test\_save\_llm\_config\_failure}}
+\index{test\_save\_llm\_config\_failure@{test\_save\_llm\_config\_failure}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_save\_llm\_config\_failure()}{test\_save\_llm\_config\_failure()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+save\+\_\+llm\+\_\+config\+\_\+failure (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+print, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+get\+\_\+config }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test function to verify that the save_llm_config function returns False
+and prints an error message when it fails to save the LLM configuration
+due to a permission error.
+
+It sets up a mock configuration file that exists and calls the
+save_llm_config function with valid parameters. The function is expected
+to return False and print "Error saving LLM configuration: Permission
+denied" in case of a failure.
+
+Args:
+ self (TestLLMConfig): An instance of the test class.
+ mock_print (MagicMock): A MagicMock object representing the print function, which will be used
+ to assert that it was called with the expected error message.
+ mock_file_open (MagicMock): A MagicMock object representing the open function, which is not used in
+ this test but is included as a parameter for completeness.
+ mock_get_config (MagicMock): A MagicMock object representing the get_config function, which will be
+ used to return the mock configuration file.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9}\label{classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9}}
+\index{tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}!test\_save\_llm\_config\_success@{test\_save\_llm\_config\_success}}
+\index{test\_save\_llm\_config\_success@{test\_save\_llm\_config\_success}!tests.test\_config\_commands.TestConfigCommands@{tests.test\_config\_commands.TestConfigCommands}}
+\doxysubsubsection{\texorpdfstring{test\_save\_llm\_config\_success()}{test\_save\_llm\_config\_success()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands.\+test\+\_\+save\+\_\+llm\+\_\+config\+\_\+success (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+print, }\item[{}]{mock\+\_\+json\+\_\+dump, }\item[{}]{mock\+\_\+file\+\_\+open, }\item[{}]{mock\+\_\+get\+\_\+config }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the save_llm_config function successfully.
+
+This function tests that the save_llm_config function correctly saves an
+LLM configuration and handles various mock objects and side effects. It
+ensures that the function returns True upon successful execution, writes
+the expected configuration to a file, and prints a confirmation message.
+
+Args:
+ mock_print (MagicMock): A mock object for the print function.
+ mock_json_dump (MagicMock): A mock object for json.dump.
+ mock_file_open (MagicMock): A mock object for file opening.
+ mock_get_config (MagicMock): A mock object to return a configuration file mock.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph}
+\end{center}
+\end{figure}
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{test__config__commands_8py}{test\+\_\+config\+\_\+commands.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5
new file mode 100644
index 0000000..eb46690
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5
@@ -0,0 +1 @@
+2db6cf58d997b43a776fb21752d4aa29
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.pdf
new file mode 100644
index 0000000..31d84ef
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5
new file mode 100644
index 0000000..f0c10d1
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5
@@ -0,0 +1 @@
+ec72b7094cae9497ce7ecd6e5b1465fa
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.pdf
new file mode 100644
index 0000000..1825081
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5
new file mode 100644
index 0000000..2481d46
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5
@@ -0,0 +1 @@
+573ce7b19062640c5f6e81c7b952ccc6
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.pdf
new file mode 100644
index 0000000..f2534b5
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5
new file mode 100644
index 0000000..fc5ed8e
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5
@@ -0,0 +1 @@
+142d84ea13e73e204d9d01d0e00b0d71
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.pdf
new file mode 100644
index 0000000..cc528f6
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5
new file mode 100644
index 0000000..ed548b1
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5
@@ -0,0 +1 @@
+f1019232940cd3a7a81ee8d607905541
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.pdf
new file mode 100644
index 0000000..98a3edb
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5
new file mode 100644
index 0000000..792b59c
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5
@@ -0,0 +1 @@
+03d53e62697311ea7b9a43f7827d29c5
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.pdf
new file mode 100644
index 0000000..dcbd7f4
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5
new file mode 100644
index 0000000..ab1decd
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5
@@ -0,0 +1 @@
+0139477054b3cfbf20ff3570dd3062bf
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.pdf
new file mode 100644
index 0000000..3ff28a3
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5
new file mode 100644
index 0000000..e42c089
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5
@@ -0,0 +1 @@
+a3362b573c3e3033972de2c850c0679a
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.pdf
new file mode 100644
index 0000000..468eb4b
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5
new file mode 100644
index 0000000..483383b
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5
@@ -0,0 +1 @@
+6623d4f0bccfce20d750d1e6830f6bba
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.pdf
new file mode 100644
index 0000000..2f93716
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5
new file mode 100644
index 0000000..8b1c575
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5
@@ -0,0 +1 @@
+f096c5ec7ace89525adfbcec7d3a4ca9
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.pdf
new file mode 100644
index 0000000..8be1b64
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5
new file mode 100644
index 0000000..e4950a9
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5
@@ -0,0 +1 @@
+a8e18e621bb6b89f2a1b847642cd5a0d
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.pdf
new file mode 100644
index 0000000..0c83abd
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5
new file mode 100644
index 0000000..64be669
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5
@@ -0,0 +1 @@
+8fc60631824470ca6b54faab7f384a96
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.pdf
new file mode 100644
index 0000000..c5c3ba5
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5
new file mode 100644
index 0000000..5517a0b
--- /dev/null
+++ b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5
@@ -0,0 +1 @@
+5b59f0d15af0ea4040d846fc1f89d18a
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.pdf b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.pdf
new file mode 100644
index 0000000..16c4787
Binary files /dev/null and b/docs/latex/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig.tex b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig.tex
new file mode 100644
index 0000000..ae256da
--- /dev/null
+++ b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig.tex
@@ -0,0 +1,82 @@
+\hypertarget{classtests_1_1test__web__config_1_1TestWebConfig}{}\doxysection{tests.\+test\+\_\+web\+\_\+config.\+Test\+Web\+Config Class Reference}
+\label{classtests_1_1test__web__config_1_1TestWebConfig}\index{tests.test\_web\_config.TestWebConfig@{tests.test\_web\_config.TestWebConfig}}
+
+
+Collaboration diagram for tests.\+test\+\_\+web\+\_\+config.\+Test\+Web\+Config\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=225pt]{classtests_1_1test__web__config_1_1TestWebConfig__coll__graph}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35}{test\+\_\+config\+\_\+llm\+\_\+web\+\_\+server\+\_\+setup}} (self, mock\+\_\+resource\+\_\+filename, mock\+\_\+server, mock\+\_\+webbrowser)
+\item
+def \mbox{\hyperlink{classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a}{test\+\_\+config\+\_\+jira\+\_\+web\+\_\+server\+\_\+setup}} (self, mock\+\_\+resource\+\_\+filename, mock\+\_\+server, mock\+\_\+webbrowser)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a}\label{classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a}}
+\index{tests.test\_web\_config.TestWebConfig@{tests.test\_web\_config.TestWebConfig}!test\_config\_jira\_web\_server\_setup@{test\_config\_jira\_web\_server\_setup}}
+\index{test\_config\_jira\_web\_server\_setup@{test\_config\_jira\_web\_server\_setup}!tests.test\_web\_config.TestWebConfig@{tests.test\_web\_config.TestWebConfig}}
+\doxysubsubsection{\texorpdfstring{test\_config\_jira\_web\_server\_setup()}{test\_config\_jira\_web\_server\_setup()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+web\+\_\+config.\+Test\+Web\+Config.\+test\+\_\+config\+\_\+jira\+\_\+web\+\_\+server\+\_\+setup (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+resource\+\_\+filename, }\item[{}]{mock\+\_\+server, }\item[{}]{mock\+\_\+webbrowser }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the configuration and setup of a JIRA web server.
+
+This function tests the entire process of setting up a JIRA web server,
+including mocking necessary resources, configuring the server to shut
+down after handling one request, and verifying that the web browser is
+opened with the correct URL. The function uses several mocks to simulate
+external dependencies such as resource files, servers, and web browsers.
+
+Args:
+ mock_resource_filename (MagicMock): A MagicMock object for simulating the `resource_filename` function.
+ mock_server (MagicMock): A MagicMock object for simulating the server setup.
+ mock_webbrowser (MagicMock): A MagicMock object for simulating the web browser opening.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35}\label{classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35}}
+\index{tests.test\_web\_config.TestWebConfig@{tests.test\_web\_config.TestWebConfig}!test\_config\_llm\_web\_server\_setup@{test\_config\_llm\_web\_server\_setup}}
+\index{test\_config\_llm\_web\_server\_setup@{test\_config\_llm\_web\_server\_setup}!tests.test\_web\_config.TestWebConfig@{tests.test\_web\_config.TestWebConfig}}
+\doxysubsubsection{\texorpdfstring{test\_config\_llm\_web\_server\_setup()}{test\_config\_llm\_web\_server\_setup()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+web\+\_\+config.\+Test\+Web\+Config.\+test\+\_\+config\+\_\+llm\+\_\+web\+\_\+server\+\_\+setup (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{mock\+\_\+resource\+\_\+filename, }\item[{}]{mock\+\_\+server, }\item[{}]{mock\+\_\+webbrowser }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Set up and test the web server configuration for an LLM (Large Language
+Model) web interface.
+
+This function configures a mock web server for testing purposes,
+including setting up resource filenames, mocking server behavior, and
+verifying that the web browser is opened and the server starts
+correctly. The function uses various mocks to simulate external
+dependencies such as `resource_filename` and `server`.
+
+Args:
+ mock_resource_filename (MagicMock): A MagicMock object simulating the `resource_filename` function.
+ mock_server (MagicMock): A MagicMock object simulating the context manager for the web server.
+ mock_webbrowser (MagicMock): A MagicMock object simulating the `webbrowser` module.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph}
+\end{center}
+\end{figure}
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{test__web__config_8py}{test\+\_\+web\+\_\+config.\+py}}\end{DoxyCompactItemize}
diff --git a/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5
new file mode 100644
index 0000000..f0a528b
--- /dev/null
+++ b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5
@@ -0,0 +1 @@
+ab8cbd57a4ebb302c58c19a4efbc1c6e
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.pdf b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.pdf
new file mode 100644
index 0000000..4e78b3d
Binary files /dev/null and b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.pdf differ
diff --git a/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5
new file mode 100644
index 0000000..0562557
--- /dev/null
+++ b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5
@@ -0,0 +1 @@
+ec26a3b9a81024c5143a2b7c2ee67936
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.pdf b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.pdf
new file mode 100644
index 0000000..0b7c2e7
Binary files /dev/null and b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.pdf differ
diff --git a/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5
new file mode 100644
index 0000000..4b88b9f
--- /dev/null
+++ b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5
@@ -0,0 +1 @@
+8ee149c998fe22f7ba6638bf1cf94e3b
\ No newline at end of file
diff --git a/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.pdf b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.pdf
new file mode 100644
index 0000000..772f8b8
Binary files /dev/null and b/docs/latex/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.pdf differ
diff --git a/docs/latex/commit-commands_8md.tex b/docs/latex/commit-commands_8md.tex
new file mode 100644
index 0000000..1a0ba6c
--- /dev/null
+++ b/docs/latex/commit-commands_8md.tex
@@ -0,0 +1,2 @@
+\hypertarget{commit-commands_8md}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/docs/commit-\/commands.md File Reference}
+\label{commit-commands_8md}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/commit-\/commands.md@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/commit-\/commands.md}}
diff --git a/docs/latex/commit__analyzer_8py.tex b/docs/latex/commit__analyzer_8py.tex
new file mode 100644
index 0000000..5f1717f
--- /dev/null
+++ b/docs/latex/commit__analyzer_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{commit__analyzer_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commit\+\_\+analyzer.py File Reference}
+\label{commit__analyzer_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commit\_analyzer.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commit\_analyzer.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook}{penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commit__analyzer}{penify\+\_\+hook.\+commit\+\_\+analyzer}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/commit__commands_8py.tex b/docs/latex/commit__commands_8py.tex
new file mode 100644
index 0000000..dde5bab
--- /dev/null
+++ b/docs/latex/commit__commands_8py.tex
@@ -0,0 +1,20 @@
+\hypertarget{commit__commands_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/commit\+\_\+commands.py File Reference}
+\label{commit__commands_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/commit\_commands.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/commit\_commands.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands}{penify\+\_\+hook.\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands}{penify\+\_\+hook.\+commands.\+commit\+\_\+commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a}{penify\+\_\+hook.\+commands.\+commit\+\_\+commands.\+commit\+\_\+code}} (api\+\_\+url, token, message, open\+\_\+terminal, generate\+\_\+description, llm\+\_\+model=None, llm\+\_\+api\+\_\+base=None, llm\+\_\+api\+\_\+key=None, jira\+\_\+url=None, jira\+\_\+user=None, jira\+\_\+api\+\_\+token=None)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c}{penify\+\_\+hook.\+commands.\+commit\+\_\+commands.\+setup\+\_\+commit\+\_\+parser}} (parser)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23}{penify\+\_\+hook.\+commands.\+commit\+\_\+commands.\+handle\+\_\+commit}} (args)
+\end{DoxyCompactItemize}
diff --git a/docs/latex/config-commands_8md.tex b/docs/latex/config-commands_8md.tex
new file mode 100644
index 0000000..05a13f5
--- /dev/null
+++ b/docs/latex/config-commands_8md.tex
@@ -0,0 +1,2 @@
+\hypertarget{config-commands_8md}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/docs/config-\/commands.md File Reference}
+\label{config-commands_8md}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/config-\/commands.md@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/config-\/commands.md}}
diff --git a/docs/latex/config__command_8py.tex b/docs/latex/config__command_8py.tex
new file mode 100644
index 0000000..c3a8e6d
--- /dev/null
+++ b/docs/latex/config__command_8py.tex
@@ -0,0 +1,16 @@
+\hypertarget{config__command_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/config\+\_\+command.py File Reference}
+\label{config__command_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/config\_command.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/config\_command.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1config__command}{penify\+\_\+hook.\+config\+\_\+command}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e}{penify\+\_\+hook.\+config\+\_\+command.\+setup\+\_\+config\+\_\+parser}} (parent\+\_\+parser)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde}{penify\+\_\+hook.\+config\+\_\+command.\+handle\+\_\+config}} (args)
+\end{DoxyCompactItemize}
diff --git a/docs/latex/config__commands_8py.tex b/docs/latex/config__commands_8py.tex
new file mode 100644
index 0000000..ab69910
--- /dev/null
+++ b/docs/latex/config__commands_8py.tex
@@ -0,0 +1,41 @@
+\hypertarget{config__commands_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/config\+\_\+commands.py File Reference}
+\label{config__commands_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/config\_commands.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/config\_commands.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands}{penify\+\_\+hook.\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands}{penify\+\_\+hook.\+commands.\+config\+\_\+commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+None \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+load\+\_\+env\+\_\+files}} ()
+\item
+Path \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+penify\+\_\+config}} ()
+\item
+Any \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+env\+\_\+var\+\_\+or\+\_\+default}} (str env\+\_\+var, Any default=None)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+save\+\_\+llm\+\_\+config}} (model, api\+\_\+base, api\+\_\+key)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+save\+\_\+jira\+\_\+config}} (url, username, api\+\_\+token)
+\item
+Dict\mbox{[}str, str\mbox{]} \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+llm\+\_\+config}} ()
+\item
+Dict\mbox{[}str, str\mbox{]} \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+jira\+\_\+config}} ()
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+config\+\_\+llm\+\_\+web}} ()
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+config\+\_\+jira\+\_\+web}} ()
+\item
+Optional\mbox{[}str\mbox{]} \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+token}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+bool \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a152642ab83cf6219b604bda6122aba67}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+DOTENV\+\_\+\+AVAILABLE}} = True
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a4b202072a3a3b8515c9c254622e9c880}{penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+path}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/conftest_8py.tex b/docs/latex/conftest_8py.tex
new file mode 100644
index 0000000..f2aff9d
--- /dev/null
+++ b/docs/latex/conftest_8py.tex
@@ -0,0 +1,9 @@
+\hypertarget{conftest_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/conftest.py File Reference}
+\label{conftest_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/conftest.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/conftest.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacetests}{tests}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1conftest}{tests.\+conftest}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/constants_8py.tex b/docs/latex/constants_8py.tex
new file mode 100644
index 0000000..234d12a
--- /dev/null
+++ b/docs/latex/constants_8py.tex
@@ -0,0 +1,16 @@
+\hypertarget{constants_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/constants.py File Reference}
+\label{constants_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/constants.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/constants.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1constants}{penify\+\_\+hook.\+constants}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1constants_af198b5d1fc2f44657a2061aa324af3e0}{penify\+\_\+hook.\+constants.\+API\+\_\+\+URL}} = \textquotesingle{}http\+://localhost\+:8000/api\textquotesingle{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1constants_a316c5a606e4440fb8224c6544c3a15f0}{penify\+\_\+hook.\+constants.\+DASHBOARD\+\_\+\+URL}} = \char`\"{}https\+://dashboard.\+penify.\+dev/auth/localhost/login\char`\"{}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/detailed-usage_8md.tex b/docs/latex/detailed-usage_8md.tex
new file mode 100644
index 0000000..1d1e762
--- /dev/null
+++ b/docs/latex/detailed-usage_8md.tex
@@ -0,0 +1,2 @@
+\hypertarget{detailed-usage_8md}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/docs/detailed-\/usage.md File Reference}
+\label{detailed-usage_8md}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/detailed-\/usage.md@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/detailed-\/usage.md}}
diff --git a/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c.tex b/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c.tex
new file mode 100644
index 0000000..eefbfc9
--- /dev/null
+++ b/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c.tex
@@ -0,0 +1,25 @@
+\hypertarget{dir_063e2d5fe58a131099a7fe4200cca78c}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests Directory Reference}
+\label{dir_063e2d5fe58a131099a7fe4200cca78c}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests Directory Reference@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests Directory Reference}}
+Directory dependency graph for tests\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=166pt]{dir_063e2d5fe58a131099a7fe4200cca78c_dep}
+\end{center}
+\end{figure}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{tests_2____init_____8py}{\+\_\+\+\_\+init\+\_\+\+\_\+.\+py}}
+\item
+file \mbox{\hyperlink{conftest_8py}{conftest.\+py}}
+\item
+file \mbox{\hyperlink{test__commit__commands_8py}{test\+\_\+commit\+\_\+commands.\+py}}
+\item
+file \mbox{\hyperlink{test__config__commands_8py}{test\+\_\+config\+\_\+commands.\+py}}
+\item
+file \mbox{\hyperlink{test__doc__commands_8py}{test\+\_\+doc\+\_\+commands.\+py}}
+\item
+file \mbox{\hyperlink{test__web__config_8py}{test\+\_\+web\+\_\+config.\+py}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 b/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5
new file mode 100644
index 0000000..afb9081
--- /dev/null
+++ b/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5
@@ -0,0 +1 @@
+fdbdbdbe253c547a3b41063e5036418d
\ No newline at end of file
diff --git a/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c_dep.pdf b/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c_dep.pdf
new file mode 100644
index 0000000..f1b5bad
Binary files /dev/null and b/docs/latex/dir_063e2d5fe58a131099a7fe4200cca78c_dep.pdf differ
diff --git a/docs/latex/dir_1648a057408aae8db85b8e3797335623.tex b/docs/latex/dir_1648a057408aae8db85b8e3797335623.tex
new file mode 100644
index 0000000..081b62d
--- /dev/null
+++ b/docs/latex/dir_1648a057408aae8db85b8e3797335623.tex
@@ -0,0 +1,10 @@
+\hypertarget{dir_1648a057408aae8db85b8e3797335623}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/docs Directory Reference}
+\label{dir_1648a057408aae8db85b8e3797335623}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs Directory Reference@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs Directory Reference}}
+Directory dependency graph for docs\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=166pt]{dir_1648a057408aae8db85b8e3797335623_dep}
+\end{center}
+\end{figure}
diff --git a/docs/latex/dir_1648a057408aae8db85b8e3797335623_dep.md5 b/docs/latex/dir_1648a057408aae8db85b8e3797335623_dep.md5
new file mode 100644
index 0000000..2214ec5
--- /dev/null
+++ b/docs/latex/dir_1648a057408aae8db85b8e3797335623_dep.md5
@@ -0,0 +1 @@
+103c12b563793db32ed50b111f45bada
\ No newline at end of file
diff --git a/docs/latex/dir_1648a057408aae8db85b8e3797335623_dep.pdf b/docs/latex/dir_1648a057408aae8db85b8e3797335623_dep.pdf
new file mode 100644
index 0000000..a735ea4
Binary files /dev/null and b/docs/latex/dir_1648a057408aae8db85b8e3797335623_dep.pdf differ
diff --git a/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23.tex b/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23.tex
new file mode 100644
index 0000000..94ac70c
--- /dev/null
+++ b/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23.tex
@@ -0,0 +1,25 @@
+\hypertarget{dir_624fa2a8bce97f0444ac5cca335d4e23}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands Directory Reference}
+\label{dir_624fa2a8bce97f0444ac5cca335d4e23}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands Directory Reference@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands Directory Reference}}
+Directory dependency graph for commands\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=184pt]{dir_624fa2a8bce97f0444ac5cca335d4e23_dep}
+\end{center}
+\end{figure}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{penify__hook_2commands_2____init_____8py}{\+\_\+\+\_\+init\+\_\+\+\_\+.\+py}}
+\item
+file \mbox{\hyperlink{auth__commands_8py}{auth\+\_\+commands.\+py}}
+\item
+file \mbox{\hyperlink{commit__commands_8py}{commit\+\_\+commands.\+py}}
+\item
+file \mbox{\hyperlink{config__commands_8py}{config\+\_\+commands.\+py}}
+\item
+file \mbox{\hyperlink{doc__commands_8py}{doc\+\_\+commands.\+py}}
+\item
+file \mbox{\hyperlink{hook__commands_8py}{hook\+\_\+commands.\+py}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 b/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5
new file mode 100644
index 0000000..597f466
--- /dev/null
+++ b/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5
@@ -0,0 +1 @@
+1c8b9302d49050442030c2a1fe004137
\ No newline at end of file
diff --git a/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.pdf b/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.pdf
new file mode 100644
index 0000000..93673cf
Binary files /dev/null and b/docs/latex/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.pdf differ
diff --git a/docs/latex/dir_b3b22d2ab7966b65f6b237e3231b41be.tex b/docs/latex/dir_b3b22d2ab7966b65f6b237e3231b41be.tex
new file mode 100644
index 0000000..a19fe27
--- /dev/null
+++ b/docs/latex/dir_b3b22d2ab7966b65f6b237e3231b41be.tex
@@ -0,0 +1,16 @@
+\hypertarget{dir_b3b22d2ab7966b65f6b237e3231b41be}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli Directory Reference}
+\label{dir_b3b22d2ab7966b65f6b237e3231b41be}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli Directory Reference@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli Directory Reference}}
+\doxysubsection*{Directories}
+\begin{DoxyCompactItemize}
+\item
+directory \mbox{\hyperlink{dir_1648a057408aae8db85b8e3797335623}{docs}}
+\item
+directory \mbox{\hyperlink{dir_f88c3381c1861b3f7ca1f3d63cf244b5}{penify\+\_\+hook}}
+\item
+directory \mbox{\hyperlink{dir_063e2d5fe58a131099a7fe4200cca78c}{tests}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{setup_8py}{setup.\+py}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5.tex b/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5.tex
new file mode 100644
index 0000000..5dadcb6
--- /dev/null
+++ b/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5.tex
@@ -0,0 +1,48 @@
+\hypertarget{dir_f88c3381c1861b3f7ca1f3d63cf244b5}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook Directory Reference}
+\label{dir_f88c3381c1861b3f7ca1f3d63cf244b5}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook Directory Reference@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook Directory Reference}}
+Directory dependency graph for penify\+\_\+hook\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=294pt]{dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep}
+\end{center}
+\end{figure}
+\doxysubsection*{Directories}
+\begin{DoxyCompactItemize}
+\item
+directory \mbox{\hyperlink{dir_624fa2a8bce97f0444ac5cca335d4e23}{commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{penify__hook_2____init_____8py}{\+\_\+\+\_\+init\+\_\+\+\_\+.\+py}}
+\item
+file \mbox{\hyperlink{api__client_8py}{api\+\_\+client.\+py}}
+\item
+file \mbox{\hyperlink{base__analyzer_8py}{base\+\_\+analyzer.\+py}}
+\item
+file \mbox{\hyperlink{commit__analyzer_8py}{commit\+\_\+analyzer.\+py}}
+\item
+file \mbox{\hyperlink{config__command_8py}{config\+\_\+command.\+py}}
+\item
+file \mbox{\hyperlink{constants_8py}{constants.\+py}}
+\item
+file \mbox{\hyperlink{file__analyzer_8py}{file\+\_\+analyzer.\+py}}
+\item
+file \mbox{\hyperlink{folder__analyzer_8py}{folder\+\_\+analyzer.\+py}}
+\item
+file \mbox{\hyperlink{git__analyzer_8py}{git\+\_\+analyzer.\+py}}
+\item
+file \mbox{\hyperlink{jira__client_8py}{jira\+\_\+client.\+py}}
+\item
+file \mbox{\hyperlink{llm__client_8py}{llm\+\_\+client.\+py}}
+\item
+file \mbox{\hyperlink{login__command_8py}{login\+\_\+command.\+py}}
+\item
+file \mbox{\hyperlink{main_8py}{main.\+py}}
+\item
+file \mbox{\hyperlink{ui__utils_8py}{ui\+\_\+utils.\+py}}
+\item
+file \mbox{\hyperlink{utils_8py}{utils.\+py}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 b/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5
new file mode 100644
index 0000000..577134d
--- /dev/null
+++ b/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5
@@ -0,0 +1 @@
+81055f3442546e3f091686cb9eef1bc5
\ No newline at end of file
diff --git a/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.pdf b/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.pdf
new file mode 100644
index 0000000..d8df7e3
Binary files /dev/null and b/docs/latex/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.pdf differ
diff --git a/docs/latex/doc__commands_8md.tex b/docs/latex/doc__commands_8md.tex
new file mode 100644
index 0000000..455e296
--- /dev/null
+++ b/docs/latex/doc__commands_8md.tex
@@ -0,0 +1,2 @@
+\hypertarget{doc__commands_8md}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/docs/doc\+\_\+commands.md File Reference}
+\label{doc__commands_8md}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/doc\_commands.md@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/doc\_commands.md}}
diff --git a/docs/latex/doc__commands_8py.tex b/docs/latex/doc__commands_8py.tex
new file mode 100644
index 0000000..a41f1c7
--- /dev/null
+++ b/docs/latex/doc__commands_8py.tex
@@ -0,0 +1,25 @@
+\hypertarget{doc__commands_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/doc\+\_\+commands.py File Reference}
+\label{doc__commands_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/doc\_commands.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/doc\_commands.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands}{penify\+\_\+hook.\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands}{penify\+\_\+hook.\+commands.\+doc\+\_\+commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25}{penify\+\_\+hook.\+commands.\+doc\+\_\+commands.\+generate\+\_\+doc}} (api\+\_\+url, token, location=None)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0}{penify\+\_\+hook.\+commands.\+doc\+\_\+commands.\+setup\+\_\+docgen\+\_\+parser}} (parser)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704}{penify\+\_\+hook.\+commands.\+doc\+\_\+commands.\+handle\+\_\+docgen}} (args)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands_a3e42540047da37565afffeaf106cb948}{penify\+\_\+hook.\+commands.\+doc\+\_\+commands.\+docgen\+\_\+description}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/doxygen.sty b/docs/latex/doxygen.sty
new file mode 100644
index 0000000..bde67ed
--- /dev/null
+++ b/docs/latex/doxygen.sty
@@ -0,0 +1,596 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+
+% Packages used by this style file
+\RequirePackage{alltt}
+%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
+\RequirePackage{calc}
+\RequirePackage{float}
+%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
+\RequirePackage{verbatim}
+\RequirePackage[table]{xcolor}
+\RequirePackage{longtable_doxygen}
+\RequirePackage{tabu_doxygen}
+\RequirePackage{fancyvrb}
+\RequirePackage{tabularx}
+\RequirePackage{multicol}
+\RequirePackage{multirow}
+\RequirePackage{hanging}
+\RequirePackage{ifpdf}
+\RequirePackage{adjustbox}
+\RequirePackage{amssymb}
+\RequirePackage{stackengine}
+\RequirePackage{enumitem}
+\RequirePackage{alphalph}
+\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis
+\RequirePackage{enumitem}
+
+%---------- Internal commands used in this style file ----------------
+
+\newcommand{\ensurespace}[1]{%
+ \begingroup%
+ \setlength{\dimen@}{#1}%
+ \vskip\z@\@plus\dimen@%
+ \penalty -100\vskip\z@\@plus -\dimen@%
+ \vskip\dimen@%
+ \penalty 9999%
+ \vskip -\dimen@%
+ \vskip\z@skip% hide the previous |\vskip| from |\addvspace|
+ \endgroup%
+}
+
+\newcommand{\DoxyHorRuler}[1]{%
+ \setlength{\parskip}{0ex plus 0ex minus 0ex}%
+ \ifthenelse{#1=0}%
+ {%
+ \hrule%
+ }%
+ {%
+ \hrulefilll%
+ }%
+}
+\newcommand{\DoxyLabelFont}{}
+\newcommand{\entrylabel}[1]{%
+ {%
+ \parbox[b]{\labelwidth-4pt}{%
+ \makebox[0pt][l]{\DoxyLabelFont#1}%
+ \vspace{1.5\baselineskip}%
+ }%
+ }%
+}
+
+\newenvironment{DoxyDesc}[1]{%
+ \ensurespace{4\baselineskip}%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ %\setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+\newsavebox{\xrefbox}
+\newlength{\xreflength}
+\newcommand{\xreflabel}[1]{%
+ \sbox{\xrefbox}{#1}%
+ \setlength{\xreflength}{\wd\xrefbox}%
+ \ifthenelse{\xreflength>\labelwidth}{%
+ \begin{minipage}{\textwidth}%
+ \setlength{\parindent}{0pt}%
+ \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
+ \end{minipage}%
+ }{%
+ \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
+ }%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by
...
+\newenvironment{DoxyPre}{%
+ \small%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output.
+\newlength{\CodeWidthChar}
+\newlength{\CodeHeightChar}
+\settowidth{\CodeWidthChar}{?}
+\settoheight{\CodeHeightChar}{?}
+% Necessary for hanging indent
+\newlength{\DoxyCodeWidth}
+
+\newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par}
+
+\newcommand\NiceSpace{%
+ \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}[1]{%
+ \par%
+ \scriptsize%
+ \normalfont\ttfamily%
+ \rightskip0pt plus 1fil%
+ \settowidth{\DoxyCodeWidth}{000000}%
+ \settowidth{\CodeWidthChar}{?}%
+ \settoheight{\CodeHeightChar}{?}%
+ \setlength{\parskip}{0ex plus 0ex minus 0ex}%
+ \ifthenelse{\equal{#1}{0}}
+ {
+ {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces%
+ }
+ {
+ {\lccode`~32 \lowercase{\global\let~}}\obeyspaces%
+ }
+
+}{%
+ \normalfont%
+ \normalsize%
+ \settowidth{\CodeWidthChar}{?}%
+ \settoheight{\CodeHeightChar}{?}%
+}
+
+% Redefining not defined characters, i.e. "Replacement Character" in tex output.
+\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
+ \textcolor{white}{\sffamily\bfseries\small ?}}{%
+ \rotatebox{45}{$\blacksquare$}}}}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}[1]{%
+ \DoxyCode{#1}%
+}{%
+ \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+ \par%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+ \DoxyVerb%
+}{%
+ \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or ...
)
+\setlistdepth{12}
+\newlist{DoxyEnumerate}{enumerate}{12}
+\setlist[DoxyEnumerate,1]{label=\arabic*.}
+\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,3]{label=\roman*.}
+\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.}
+\setlist[DoxyEnumerate,5]{label=\arabic*.}
+\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,7]{label=\roman*.}
+\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.}
+\setlist[DoxyEnumerate,9]{label=\arabic*.}
+\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,11]{label=\roman*.}
+\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.}
+
+% Used by bullet lists (using '-', @li, @arg, or )
+\setlistdepth{12}
+\newlist{DoxyItemize}{itemize}{12}
+\setlist[DoxyItemize]{label=\textperiodcentered}
+
+\setlist[DoxyItemize,1]{label=\textbullet}
+\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash}
+\setlist[DoxyItemize,3]{label=\textasteriskcentered}
+\setlist[DoxyItemize,4]{label=\textperiodcentered}
+
+% Used by description lists (using ...
)
+\newenvironment{DoxyDescription}{%
+ \description%
+}{%
+ \enddescription%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+ \begin{figure}[H]%
+ \centering%
+}{%
+ \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+ \begin{center}%
+}{%
+ \end{center}%
+}
+
+% Used by @image
+% (only if inline is specified)
+\newenvironment{DoxyInlineImage}{%
+}{%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @copyright
+\newenvironment{DoxyCopyright}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @return and @returns
+\newenvironment{DoxyReturn}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[2][]{%
+ \tabulinesep=1mm%
+ \par%
+ \ifthenelse{\equal{#1}{}}%
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description
+ {\ifthenelse{\equal{#1}{1}}%
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc
+ }
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for fields of simple structs
+\newenvironment{DoxyFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for fields simple class style enums
+\newenvironment{DoxyEnumFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for parameters within a detailed function description
+\newenvironment{DoxyParamCaption}{%
+ \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}%
+}{%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for member lists
+\newenvironment{DoxyCompactItemize}{%
+ \begin{itemize}%
+ \setlength{\itemsep}{-3pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \setlength{\partopsep}{0pt}%
+}{%
+ \end{itemize}%
+}
+
+% Used for member descriptions
+\newenvironment{DoxyCompactList}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \renewcommand{\makelabel}{\hfill}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used for reference lists (@bug, @deprecated, @todo, etc.)
+\newenvironment{DoxyRefList}{%
+ \begin{list}{}{%
+ \setlength{\labelwidth}{10pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \renewcommand{\makelabel}{\xreflabel}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by @bug, @deprecated, @todo, etc.
+\newenvironment{DoxyRefDesc}[1]{%
+ \begin{list}{}{%
+ \renewcommand\makelabel[1]{\textbf{##1}}%
+ \settowidth\labelwidth{\makelabel{#1}}%
+ \setlength\leftmargin{\labelwidth+\labelsep}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists and simple sections
+\newenvironment{Desc}
+{\begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }
+}{%
+ \end{list}%
+}
+
+% Used by tables
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
+\newenvironment{TabularC}[1]%
+{\tabulinesep=1mm
+\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}%
+{\end{longtabu*}\par}%
+
+\newenvironment{TabularNC}[1]%
+{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}%
+{\end{tabu}\par}%
+
+% Used for member group headers
+\newenvironment{Indent}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ }%
+ \item[]\ignorespaces%
+}{%
+ \unskip%
+ \end{list}%
+}
+
+% Used when hyperlinks are turned off
+\newcommand{\doxyref}[3]{%
+ \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used to link to a table when hyperlinks are turned on
+\newcommand{\doxytablelink}[2]{%
+ \ref{#1}%
+}
+
+% Used to link to a table when hyperlinks are turned off
+\newcommand{\doxytableref}[3]{%
+ \ref{#3}%
+}
+
+% Used by @addindex
+\newcommand{\lcurly}{\{}
+\newcommand{\rcurly}{\}}
+
+% Colors used for syntax highlighting
+\definecolor{comment}{rgb}{0.5,0.0,0.0}
+\definecolor{keyword}{rgb}{0.0,0.5,0.0}
+\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
+\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
+\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
+\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
+\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
+\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
+\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
+\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
+\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
+
+% Color used for table heading
+\newcommand{\tableheadbgcolor}{lightgray}%
+
+% Version of hypertarget with correct landing location
+\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}}
+
+% possibility to have sections etc. be within the margins
+% unfortunately had to copy part of book.cls and add \raggedright
+\makeatletter
+\newcommand\doxysection{\@startsection {section}{1}{\z@}%
+ {-3.5ex \@plus -1ex \@minus -.2ex}%
+ {2.3ex \@plus.2ex}%
+ {\raggedright\normalfont\Large\bfseries}}
+\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\large\bfseries}}
+\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxyparagraph{\@startsection{paragraph}{4}{\z@}%
+ {3.25ex \@plus1ex \@minus.2ex}%
+ {-1em}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxysubparagraph{\@startsection{subparagraph}{5}{\parindent}%
+ {3.25ex \@plus1ex \@minus .2ex}%
+ {-1em}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\makeatother
+% Define caption that is also suitable in a table
+\makeatletter
+\def\doxyfigcaption{%
+\H@refstepcounter{figure}%
+\@dblarg{\@caption{figure}}}
+\makeatother
+
+% Define alpha enumarative names for counters > 26
+\makeatletter
+\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname}
+\def\@enumalphalphcnt#1{\alphalph{#1}}
+\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname}
+\def\@enumAlphAlphcnt#1{\AlphAlph{#1}}
+\makeatother
+\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa}
+\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA}
diff --git a/docs/latex/example-workflows_8md.tex b/docs/latex/example-workflows_8md.tex
new file mode 100644
index 0000000..14af800
--- /dev/null
+++ b/docs/latex/example-workflows_8md.tex
@@ -0,0 +1,2 @@
+\hypertarget{example-workflows_8md}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/docs/example-\/workflows.md File Reference}
+\label{example-workflows_8md}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/example-\/workflows.md@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/example-\/workflows.md}}
diff --git a/docs/latex/file__analyzer_8py.tex b/docs/latex/file__analyzer_8py.tex
new file mode 100644
index 0000000..1b93968
--- /dev/null
+++ b/docs/latex/file__analyzer_8py.tex
@@ -0,0 +1,19 @@
+\hypertarget{file__analyzer_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/file\+\_\+analyzer.py File Reference}
+\label{file__analyzer_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/file\_analyzer.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/file\_analyzer.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook}{penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1file__analyzer}{penify\+\_\+hook.\+file\+\_\+analyzer}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1file__analyzer_af419a4965f079d58cac5a5281ddb1828}{penify\+\_\+hook.\+file\+\_\+analyzer.\+logger}} = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)
+\end{DoxyCompactItemize}
diff --git a/docs/latex/files.tex b/docs/latex/files.tex
new file mode 100644
index 0000000..ca98dd1
--- /dev/null
+++ b/docs/latex/files.tex
@@ -0,0 +1,31 @@
+\doxysection{File List}
+Here is a list of all files with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/\mbox{\hyperlink{setup_8py}{setup.\+py}} }{\pageref{setup_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{penify__hook_2____init_____8py}{\+\_\+\+\_\+init\+\_\+\+\_\+.\+py}} }{\pageref{penify__hook_2____init_____8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{api__client_8py}{api\+\_\+client.\+py}} }{\pageref{api__client_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{base__analyzer_8py}{base\+\_\+analyzer.\+py}} }{\pageref{base__analyzer_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{commit__analyzer_8py}{commit\+\_\+analyzer.\+py}} }{\pageref{commit__analyzer_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{config__command_8py}{config\+\_\+command.\+py}} }{\pageref{config__command_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{constants_8py}{constants.\+py}} }{\pageref{constants_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{file__analyzer_8py}{file\+\_\+analyzer.\+py}} }{\pageref{file__analyzer_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{folder__analyzer_8py}{folder\+\_\+analyzer.\+py}} }{\pageref{folder__analyzer_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{git__analyzer_8py}{git\+\_\+analyzer.\+py}} }{\pageref{git__analyzer_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{jira__client_8py}{jira\+\_\+client.\+py}} }{\pageref{jira__client_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{llm__client_8py}{llm\+\_\+client.\+py}} }{\pageref{llm__client_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{login__command_8py}{login\+\_\+command.\+py}} }{\pageref{login__command_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{main_8py}{main.\+py}} }{\pageref{main_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{ui__utils_8py}{ui\+\_\+utils.\+py}} }{\pageref{ui__utils_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\mbox{\hyperlink{utils_8py}{utils.\+py}} }{\pageref{utils_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/\mbox{\hyperlink{penify__hook_2commands_2____init_____8py}{\+\_\+\+\_\+init\+\_\+\+\_\+.\+py}} }{\pageref{penify__hook_2commands_2____init_____8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/\mbox{\hyperlink{auth__commands_8py}{auth\+\_\+commands.\+py}} }{\pageref{auth__commands_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/\mbox{\hyperlink{commit__commands_8py}{commit\+\_\+commands.\+py}} }{\pageref{commit__commands_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/\mbox{\hyperlink{config__commands_8py}{config\+\_\+commands.\+py}} }{\pageref{config__commands_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/\mbox{\hyperlink{doc__commands_8py}{doc\+\_\+commands.\+py}} }{\pageref{doc__commands_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/\mbox{\hyperlink{hook__commands_8py}{hook\+\_\+commands.\+py}} }{\pageref{hook__commands_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{tests_2____init_____8py}{\+\_\+\+\_\+init\+\_\+\+\_\+.\+py}} }{\pageref{tests_2____init_____8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{conftest_8py}{conftest.\+py}} }{\pageref{conftest_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{test__commit__commands_8py}{test\+\_\+commit\+\_\+commands.\+py}} }{\pageref{test__commit__commands_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{test__config__commands_8py}{test\+\_\+config\+\_\+commands.\+py}} }{\pageref{test__config__commands_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{test__doc__commands_8py}{test\+\_\+doc\+\_\+commands.\+py}} }{\pageref{test__doc__commands_8py}}{}
+\item\contentsline{section}{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\mbox{\hyperlink{test__web__config_8py}{test\+\_\+web\+\_\+config.\+py}} }{\pageref{test__web__config_8py}}{}
+\end{DoxyCompactList}
diff --git a/docs/latex/folder__analyzer_8py.tex b/docs/latex/folder__analyzer_8py.tex
new file mode 100644
index 0000000..bfb3c69
--- /dev/null
+++ b/docs/latex/folder__analyzer_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{folder__analyzer_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/folder\+\_\+analyzer.py File Reference}
+\label{folder__analyzer_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/folder\_analyzer.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/folder\_analyzer.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook}{penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1folder__analyzer}{penify\+\_\+hook.\+folder\+\_\+analyzer}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/git__analyzer_8py.tex b/docs/latex/git__analyzer_8py.tex
new file mode 100644
index 0000000..d53ed2b
--- /dev/null
+++ b/docs/latex/git__analyzer_8py.tex
@@ -0,0 +1,19 @@
+\hypertarget{git__analyzer_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/git\+\_\+analyzer.py File Reference}
+\label{git__analyzer_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/git\_analyzer.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/git\_analyzer.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook}{penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1git__analyzer}{penify\+\_\+hook.\+git\+\_\+analyzer}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1git__analyzer_ac4ce143fdca789a79c66852c37d7363a}{penify\+\_\+hook.\+git\+\_\+analyzer.\+logger}} = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)
+\end{DoxyCompactItemize}
diff --git a/docs/latex/hierarchy.tex b/docs/latex/hierarchy.tex
new file mode 100644
index 0000000..da5b034
--- /dev/null
+++ b/docs/latex/hierarchy.tex
@@ -0,0 +1,20 @@
+\doxysection{Class Hierarchy}
+This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList}
+\item \contentsline{section}{penify\+\_\+hook.\+api\+\_\+client.\+APIClient}{\pageref{classpenify__hook_1_1api__client_1_1APIClient}}{}
+\item \contentsline{section}{penify\+\_\+hook.\+base\+\_\+analyzer.\+Base\+Analyzer}{\pageref{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{penify\+\_\+hook.\+commit\+\_\+analyzer.\+Commit\+Doc\+Gen\+Hook}{\pageref{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook}}{}
+\item \contentsline{section}{penify\+\_\+hook.\+file\+\_\+analyzer.\+File\+Analyzer\+Gen\+Hook}{\pageref{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook}}{}
+\item \contentsline{section}{penify\+\_\+hook.\+folder\+\_\+analyzer.\+Folder\+Analyzer\+Gen\+Hook}{\pageref{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook}}{}
+\item \contentsline{section}{penify\+\_\+hook.\+git\+\_\+analyzer.\+Git\+Doc\+Gen\+Hook}{\pageref{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook}}{}
+\end{DoxyCompactList}
+\item \contentsline{section}{Exception}{\pageref{classException}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{penify\+\_\+hook.\+utils.\+Git\+Repo\+Not\+Found\+Error}{\pageref{classpenify__hook_1_1utils_1_1GitRepoNotFoundError}}{}
+\end{DoxyCompactList}
+\item \contentsline{section}{penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client}{\pageref{classpenify__hook_1_1jira__client_1_1JiraClient}}{}
+\item \contentsline{section}{penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient}{\pageref{classpenify__hook_1_1llm__client_1_1LLMClient}}{}
+\item \contentsline{section}{tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands}{\pageref{classtests_1_1test__commit__commands_1_1TestCommitCommands}}{}
+\item \contentsline{section}{tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands}{\pageref{classtests_1_1test__config__commands_1_1TestConfigCommands}}{}
+\item \contentsline{section}{tests.\+test\+\_\+web\+\_\+config.\+Test\+Web\+Config}{\pageref{classtests_1_1test__web__config_1_1TestWebConfig}}{}
+\end{DoxyCompactList}
diff --git a/docs/latex/hook__commands_8py.tex b/docs/latex/hook__commands_8py.tex
new file mode 100644
index 0000000..4794846
--- /dev/null
+++ b/docs/latex/hook__commands_8py.tex
@@ -0,0 +1,25 @@
+\hypertarget{hook__commands_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/hook\+\_\+commands.py File Reference}
+\label{hook__commands_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/hook\_commands.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/hook\_commands.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands}{penify\+\_\+hook.\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands}{penify\+\_\+hook.\+commands.\+hook\+\_\+commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2}{penify\+\_\+hook.\+commands.\+hook\+\_\+commands.\+install\+\_\+git\+\_\+hook}} (location, token)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d}{penify\+\_\+hook.\+commands.\+hook\+\_\+commands.\+uninstall\+\_\+git\+\_\+hook}} (location)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands_ae82fd46e5a9219da1478b0476b8214b1}{penify\+\_\+hook.\+commands.\+hook\+\_\+commands.\+HOOK\+\_\+\+FILENAME}} = \char`\"{}post-\/commit\char`\"{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands_a6a45aad71c8d32ce11a6dff8cee8bee7}{penify\+\_\+hook.\+commands.\+hook\+\_\+commands.\+HOOK\+\_\+\+TEMPLATE}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/jira__client_8py.tex b/docs/latex/jira__client_8py.tex
new file mode 100644
index 0000000..f26bf5b
--- /dev/null
+++ b/docs/latex/jira__client_8py.tex
@@ -0,0 +1,19 @@
+\hypertarget{jira__client_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/jira\+\_\+client.py File Reference}
+\label{jira__client_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/jira\_client.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/jira\_client.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient}{penify\+\_\+hook.\+jira\+\_\+client.\+Jira\+Client}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1jira__client}{penify\+\_\+hook.\+jira\+\_\+client}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+bool \mbox{\hyperlink{namespacepenify__hook_1_1jira__client_a5593ea3415081eca1eea92e4c1ad1aa2}{penify\+\_\+hook.\+jira\+\_\+client.\+JIRA\+\_\+\+AVAILABLE}} = True
+\end{DoxyCompactItemize}
diff --git a/docs/latex/llm__client_8py.tex b/docs/latex/llm__client_8py.tex
new file mode 100644
index 0000000..990979d
--- /dev/null
+++ b/docs/latex/llm__client_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{llm__client_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/llm\+\_\+client.py File Reference}
+\label{llm__client_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/llm\_client.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/llm\_client.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient}{penify\+\_\+hook.\+llm\+\_\+client.\+LLMClient}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1llm__client}{penify\+\_\+hook.\+llm\+\_\+client}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/login__command_8py.tex b/docs/latex/login__command_8py.tex
new file mode 100644
index 0000000..a7c9bec
--- /dev/null
+++ b/docs/latex/login__command_8py.tex
@@ -0,0 +1,16 @@
+\hypertarget{login__command_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/login\+\_\+command.py File Reference}
+\label{login__command_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/login\_command.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/login\_command.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1login__command}{penify\+\_\+hook.\+login\+\_\+command}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a}{penify\+\_\+hook.\+login\+\_\+command.\+setup\+\_\+login\+\_\+parser}} (parser)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd}{penify\+\_\+hook.\+login\+\_\+command.\+handle\+\_\+login}} (args)
+\end{DoxyCompactItemize}
diff --git a/docs/latex/longtable_doxygen.sty b/docs/latex/longtable_doxygen.sty
new file mode 100644
index 0000000..a0eb314
--- /dev/null
+++ b/docs/latex/longtable_doxygen.sty
@@ -0,0 +1,448 @@
+%%
+%% This is file `longtable.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% longtable.dtx (with options: `package')
+%%
+%% This is a generated file.
+%%
+%% The source is maintained by the LaTeX Project team and bug
+%% reports for it can be opened at http://latex-project.org/bugs.html
+%% (but please observe conditions on bug reports sent to that address!)
+%%
+%% Copyright 1993-2016
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+%% --------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+%% without such generated files.
+%%
+%% The list of all files belonging to the LaTeX `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{longtable_doxygen}
+ [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen]
+\def\LT@err{\PackageError{longtable}}
+\def\LT@warn{\PackageWarning{longtable}}
+\def\LT@final@warn{%
+ \AtEndDocument{%
+ \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}%
+ \global\let\LT@final@warn\relax}
+\DeclareOption{errorshow}{%
+ \def\LT@warn{\PackageInfo{longtable}}}
+\DeclareOption{pausing}{%
+ \def\LT@warn#1{%
+ \LT@err{#1}{This is not really an error}}}
+\DeclareOption{set}{}
+\DeclareOption{final}{}
+\ProcessOptions
+\newskip\LTleft \LTleft=\fill
+\newskip\LTright \LTright=\fill
+\newskip\LTpre \LTpre=\bigskipamount
+\newskip\LTpost \LTpost=\bigskipamount
+\newcount\LTchunksize \LTchunksize=20
+\let\c@LTchunksize\LTchunksize
+\newdimen\LTcapwidth \LTcapwidth=4in
+\newbox\LT@head
+\newbox\LT@firsthead
+\newbox\LT@foot
+\newbox\LT@lastfoot
+\newcount\LT@cols
+\newcount\LT@rows
+\newcounter{LT@tables}
+\newcounter{LT@chunks}[LT@tables]
+\ifx\c@table\undefined
+ \newcounter{table}
+ \def\fnum@table{\tablename~\thetable}
+\fi
+\ifx\tablename\undefined
+ \def\tablename{Table}
+\fi
+\newtoks\LT@p@ftn
+\mathchardef\LT@end@pen=30000
+\def\longtable{%
+ \par
+ \ifx\multicols\@undefined
+ \else
+ \ifnum\col@number>\@ne
+ \@twocolumntrue
+ \fi
+ \fi
+ \if@twocolumn
+ \LT@err{longtable not in 1-column mode}\@ehc
+ \fi
+ \begingroup
+ \@ifnextchar[\LT@array{\LT@array[x]}}
+\def\LT@array[#1]#2{%
+ \refstepcounter{table}\stepcounter{LT@tables}%
+ \if l#1%
+ \LTleft\z@ \LTright\fill
+ \else\if r#1%
+ \LTleft\fill \LTright\z@
+ \else\if c#1%
+ \LTleft\fill \LTright\fill
+ \fi\fi\fi
+ \let\LT@mcol\multicolumn
+ \let\LT@@tabarray\@tabarray
+ \let\LT@@hl\hline
+ \def\@tabarray{%
+ \let\hline\LT@@hl
+ \LT@@tabarray}%
+ \let\\\LT@tabularcr\let\tabularnewline\\%
+ \def\newpage{\noalign{\break}}%
+ \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
+ \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
+ \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption
+ \@tempdima\ht\strutbox
+ \let\@endpbox\LT@endpbox
+ \ifx\extrarowheight\@undefined
+ \let\@acol\@tabacol
+ \let\@classz\@tabclassz \let\@classiv\@tabclassiv
+ \def\@startpbox{\vtop\LT@startpbox}%
+ \let\@@startpbox\@startpbox
+ \let\@@endpbox\@endpbox
+ \let\LT@LL@FM@cr\@tabularcr
+ \else
+ \advance\@tempdima\extrarowheight
+ \col@sep\tabcolsep
+ \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
+ \fi
+ \setbox\@arstrutbox\hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp \strutbox
+ \@width \z@}%
+ \let\@sharp##\let\protect\relax
+ \begingroup
+ \@mkpream{#2}%
+ \xdef\LT@bchunk{%
+ \global\advance\c@LT@chunks\@ne
+ \global\LT@rows\z@\setbox\z@\vbox\bgroup
+ \LT@setprevdepth
+ \tabskip\LTleft \noexpand\halign to\hsize\bgroup
+ \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}%
+ \endgroup
+ \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols
+ \LT@make@row
+ \m@th\let\par\@empty
+ \everycr{}\lineskip\z@\baselineskip\z@
+ \LT@bchunk}
+\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}}
+\def\LT@start{%
+ \let\LT@start\endgraf
+ \endgraf\penalty\z@\vskip\LTpre
+ \dimen@\pagetotal
+ \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \ht\LT@foot
+ \dimen@ii\vfuzz
+ \vfuzz\maxdimen
+ \setbox\tw@\copy\z@
+ \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
+ \setbox\tw@\vbox{\unvbox\tw@}%
+ \vfuzz\dimen@ii
+ \advance\dimen@ \ht
+ \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@\dp
+ \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@ -\pagegoal
+ \ifdim \dimen@>\z@\vfil\break\fi
+ \global\@colroom\@colht
+ \ifvoid\LT@foot\else
+ \advance\vsize-\ht\LT@foot
+ \global\advance\@colroom-\ht\LT@foot
+ \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
+ \maxdepth\z@
+ \fi
+ \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
+ \output{\LT@output}}
+\def\endlongtable{%
+ \crcr
+ \noalign{%
+ \let\LT@entry\LT@entry@chop
+ \xdef\LT@save@row{\LT@save@row}}%
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \if@filesw
+ {\let\LT@entry\LT@entry@write\immediate\write\@auxout{%
+ \gdef\expandafter\noexpand
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ {\LT@save@row}}}%
+ \fi
+ \ifx\LT@save@row\LT@@save@row
+ \else
+ \LT@warn{Column \@width s have changed\MessageBreak
+ in table \thetable}%
+ \LT@final@warn
+ \fi
+ \endgraf\penalty -\LT@end@pen
+ \endgroup
+ \global\@mparbottom\z@
+ \pagegoal\vsize
+ \endgraf\penalty\z@\addvspace\LTpost
+ \ifvoid\footins\else\insert\footins{}\fi}
+\def\LT@nofcols#1&{%
+ \futurelet\@let@token\LT@n@fcols}
+\def\LT@n@fcols{%
+ \advance\LT@cols\@ne
+ \ifx\@let@token\LT@nofcols
+ \expandafter\@gobble
+ \else
+ \expandafter\LT@nofcols
+ \fi}
+\def\LT@tabularcr{%
+ \relax\iffalse{\fi\ifnum0=`}\fi
+ \@ifstar
+ {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
+ \LT@t@bularcr}%
+ {\LT@t@bularcr}}
+\let\LT@crcr\crcr
+\let\LT@setprevdepth\relax
+\def\LT@t@bularcr{%
+ \global\advance\LT@rows\@ne
+ \ifnum\LT@rows=\LTchunksize
+ \gdef\LT@setprevdepth{%
+ \prevdepth\z@\global
+ \global\let\LT@setprevdepth\relax}%
+ \expandafter\LT@xtabularcr
+ \else
+ \ifnum0=`{}\fi
+ \expandafter\LT@LL@FM@cr
+ \fi}
+\def\LT@xtabularcr{%
+ \@ifnextchar[\LT@argtabularcr\LT@ntabularcr}
+\def\LT@ntabularcr{%
+ \ifnum0=`{}\fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\LT@argtabularcr[#1]{%
+ \ifnum0=`{}\fi
+ \ifdim #1>\z@
+ \unskip\@xargarraycr{#1}%
+ \else
+ \@yargarraycr{#1}%
+ \fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\LT@echunk{%
+ \crcr\LT@save@row\cr\egroup
+ \global\setbox\@ne\lastbox
+ \unskip
+ \egroup}
+\def\LT@entry#1#2{%
+ \ifhmode\@firstofone{&}\fi\omit
+ \ifnum#1=\c@LT@chunks
+ \else
+ \kern#2\relax
+ \fi}
+\def\LT@entry@chop#1#2{%
+ \noexpand\LT@entry
+ {\ifnum#1>\c@LT@chunks
+ 1}{0pt%
+ \else
+ #1}{#2%
+ \fi}}
+\def\LT@entry@write{%
+ \noexpand\LT@entry^^J%
+ \@spaces}
+\def\LT@kill{%
+ \LT@echunk
+ \LT@get@widths
+ \expandafter\LT@rebox\LT@bchunk}
+\def\LT@rebox#1\bgroup{%
+ #1\bgroup
+ \unvbox\z@
+ \unskip
+ \setbox\z@\lastbox}
+\def\LT@blank@row{%
+ \xdef\LT@save@row{\expandafter\LT@build@blank
+ \romannumeral\number\LT@cols 001 }}
+\def\LT@build@blank#1{%
+ \if#1m%
+ \noexpand\LT@entry{1}{0pt}%
+ \expandafter\LT@build@blank
+ \fi}
+\def\LT@make@row{%
+ \global\expandafter\let\expandafter\LT@save@row
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ \ifx\LT@save@row\relax
+ \LT@blank@row
+ \else
+ {\let\LT@entry\or
+ \if!%
+ \ifcase\expandafter\expandafter\expandafter\LT@cols
+ \expandafter\@gobble\LT@save@row
+ \or
+ \else
+ \relax
+ \fi
+ !%
+ \else
+ \aftergroup\LT@blank@row
+ \fi}%
+ \fi}
+\let\setlongtables\relax
+\def\LT@get@widths{%
+ \setbox\tw@\hbox{%
+ \unhbox\@ne
+ \let\LT@old@row\LT@save@row
+ \global\let\LT@save@row\@empty
+ \count@\LT@cols
+ \loop
+ \unskip
+ \setbox\tw@\lastbox
+ \ifhbox\tw@
+ \LT@def@row
+ \advance\count@\m@ne
+ \repeat}%
+ \ifx\LT@@save@row\@undefined
+ \let\LT@@save@row\LT@save@row
+ \fi}
+\def\LT@def@row{%
+ \let\LT@entry\or
+ \edef\@tempa{%
+ \ifcase\expandafter\count@\LT@old@row
+ \else
+ {1}{0pt}%
+ \fi}%
+ \let\LT@entry\relax
+ \xdef\LT@save@row{%
+ \LT@entry
+ \expandafter\LT@max@sel\@tempa
+ \LT@save@row}}
+\def\LT@max@sel#1#2{%
+ {\ifdim#2=\wd\tw@
+ #1%
+ \else
+ \number\c@LT@chunks
+ \fi}%
+ {\the\wd\tw@}}
+\def\LT@hline{%
+ \noalign{\ifnum0=`}\fi
+ \penalty\@M
+ \futurelet\@let@token\LT@@hline}
+\def\LT@@hline{%
+ \ifx\@let@token\hline
+ \global\let\@gtempa\@gobble
+ \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
+ \else
+ \global\let\@gtempa\@empty
+ \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\LT@sep}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\penalty\@M}%
+ \@gtempa}
+\def\LT@caption{%
+ \noalign\bgroup
+ \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n}
+\def\LT@c@ption#1[#2]#3{%
+ \LT@makecaption#1\fnum@table{#3}%
+ \def\@tempa{#2}%
+ \ifx\@tempa\@empty\else
+ {\let\\\space
+ \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}%
+ \fi}
+\def\LT@capti@n{%
+ \@ifstar
+ {\egroup\LT@c@ption\@gobble[]}%
+ {\egroup\@xdblarg{\LT@c@ption\@firstofone}}}
+\def\LT@makecaption#1#2#3{%
+ \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%
+ \sbox\@tempboxa{#1{#2: }#3}%
+ \ifdim\wd\@tempboxa>\hsize
+ #1{#2: }#3%
+ \else
+ \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \endgraf\vskip\baselineskip}%
+ \hss}}}
+\def\LT@output{%
+ \ifnum\outputpenalty <-\@Mi
+ \ifnum\outputpenalty > -\LT@end@pen
+ \LT@err{floats and marginpars not allowed in a longtable}\@ehc
+ \else
+ \setbox\z@\vbox{\unvbox\@cclv}%
+ \ifdim \ht\LT@lastfoot>\ht\LT@foot
+ \dimen@\pagegoal
+ \advance\dimen@-\ht\LT@lastfoot
+ \ifdim\dimen@<\ht\z@
+ \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \setbox\z@\vbox{\box\LT@head}%
+ \fi
+ \fi
+ \global\@colroom\@colht
+ \global\vsize\@colht
+ \vbox
+ {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
+ \fi
+ \else
+ \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \global\vsize\@colroom
+ \copy\LT@head\nobreak
+ \fi}
+\def\LT@end@hd@ft#1{%
+ \LT@echunk
+ \ifx\LT@start\endgraf
+ \LT@err
+ {Longtable head or foot not at start of table}%
+ {Increase LTchunksize}%
+ \fi
+ \setbox#1\box\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\endfirsthead{\LT@end@hd@ft\LT@firsthead}
+\def\endhead{\LT@end@hd@ft\LT@head}
+\def\endfoot{\LT@end@hd@ft\LT@foot}
+\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot}
+\def\LT@startpbox#1{%
+ \bgroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \vrule \@height \ht\@arstrutbox \@width \z@}
+\def\LT@endpbox{%
+ \@finalstrut\@arstrutbox
+ \egroup
+ \the\LT@p@ftn
+ \global\LT@p@ftn{}%
+ \hfil}
+\def\LT@p@ftntext#1{%
+ \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}%
+ \global\LT@p@ftn\expandafter{\@tempa{#1}}}%
+
+\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen}
+\endinput
+%%
+%% End of file `longtable.sty'.
diff --git a/docs/latex/main_8py.tex b/docs/latex/main_8py.tex
new file mode 100644
index 0000000..7f75354
--- /dev/null
+++ b/docs/latex/main_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{main_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/main.py File Reference}
+\label{main_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/main.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/main.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1main}{penify\+\_\+hook.\+main}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f}{penify\+\_\+hook.\+main.\+main}} ()
+\end{DoxyCompactItemize}
diff --git a/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.tex b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.tex
new file mode 100644
index 0000000..b92b239
--- /dev/null
+++ b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.tex
@@ -0,0 +1,151 @@
+
+
+A CLI tool to generate smart commit messages, code documentation, and more.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md157}{}\doxysection{Features}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md157}
+
+\begin{DoxyItemize}
+\item Automatically generate documentation for your code
+\item Support for multiple programming languages
+\item Git hook integration for automatic documentation on commits
+\item Folder and file analysis
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md158}{}\doxysection{Installation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md158}
+Install from Py\+PI\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{pip install penify}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md159}{}\doxysection{Usage}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md159}
+Penify CLI provides several subcommands for different functionalities, organized into basic commands (no login required) and advanced commands (login required).\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md160}{}\doxysection{Basic Commands (\+No login required)}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md160}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md161}{}\doxysubsection{Commit}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md161}
+Generate smart commit messages using local LLM\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit [-\/m "{}Optional message"{}] [-\/e] [-\/d]}
+
+\end{DoxyCode}
+
+
+Options\+:
+\begin{DoxyItemize}
+\item {\ttfamily -\/m, -\/-\/message}\+: Optional custom commit message
+\item {\ttfamily -\/e, -\/-\/terminal}\+: Open editor to modify commit message before committing
+\item {\ttfamily -\/d, -\/-\/description}\+: Generate commit message with both title and description (without this flag, only title is generated)
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md162}{}\doxysubsection{Config}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md162}
+Configure local LLM and JIRA settings\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Configure LLM settings}
+\DoxyCodeLine{penify config llm -\/-\/model MODEL\_NAME [-\/-\/api-\/base API\_URL] [-\/-\/api-\/key API\_KEY]}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Configure LLM settings through web interface}
+\DoxyCodeLine{penify config llm-\/web}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Configure JIRA settings}
+\DoxyCodeLine{penify config jira -\/-\/url JIRA\_URL -\/-\/username USERNAME -\/-\/api-\/token TOKEN [-\/-\/verify]}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Configure JIRA settings through web interface}
+\DoxyCodeLine{penify config jira-\/web}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md163}{}\doxysection{Advanced Commands (\+Login required)}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md163}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md164}{}\doxysubsection{Login}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md164}
+To log in and obtain an API token\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify login}
+
+\end{DoxyCode}
+
+
+This command will open a browser window for authentication. After successful login, the API key will be saved locally for future use.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md165}{}\doxysubsection{Documentation Generation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md165}
+Generate documentation for Git diff, files or folders\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Generate documentation for latest Git commit diff}
+\DoxyCodeLine{penify docgen}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Generate documentation for specific file or folder}
+\DoxyCodeLine{penify docgen -\/l /path/to/file/or/folder}
+
+\end{DoxyCode}
+
+
+Options\+:
+\begin{DoxyItemize}
+\item {\ttfamily -\/l, -\/-\/location}\+: Path to specific file or folder for documentation generation (defaults to current directory)
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md166}{}\doxysubsection{Git Hook Management}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md166}
+Install or uninstall Git post-\/commit hooks\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Install Git hook}
+\DoxyCodeLine{penify docgen install-\/hook [-\/l /path/to/repo]}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Uninstall Git hook}
+\DoxyCodeLine{penify docgen uninstall-\/hook [-\/l /path/to/repo]}
+
+\end{DoxyCode}
+
+
+Options\+:
+\begin{DoxyItemize}
+\item {\ttfamily -\/l, -\/-\/location}\+: Path to the Git repository (defaults to current directory)
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md167}{}\doxysection{Authentication}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md167}
+Penify CLI uses an API token for authentication with advanced features.
+
+If no token is available and you try to access an advanced feature, you\textquotesingle{}ll be prompted to log in.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md168}{}\doxysection{Local LLM Configuration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md168}
+For commit message generation, Penify can use a local LLM. Configure it using\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify config llm -\/-\/model MODEL\_NAME -\/-\/api-\/base API\_URL -\/-\/api-\/key API\_KEY}
+
+\end{DoxyCode}
+
+
+Common configurations\+:
+\begin{DoxyItemize}
+\item Open\+AI\+: {\ttfamily -\/-\/model gpt-\/3.\+5-\/turbo -\/-\/api-\/base \href{https://api.openai.com/v1}{\texttt{ https\+://api.\+openai.\+com/v1}} -\/-\/api-\/key YOUR\+\_\+\+KEY}
+\item Anthropic\+: {\ttfamily -\/-\/model claude-\/2 -\/-\/api-\/base \href{https://api.anthropic.com}{\texttt{ https\+://api.\+anthropic.\+com}} -\/-\/api-\/key YOUR\+\_\+\+KEY}
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md169}{}\doxysection{JIRA Integration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md169}
+Configure JIRA integration to enhance commit messages with issue details\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify config jira -\/-\/url https://your-\/domain.atlassian.net -\/-\/username your-\/email@example.com -\/-\/api-\/token YOUR\_API\_TOKEN}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md170}{}\doxysection{Development}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md170}
+To set up the development environment\+:
+
+
+\begin{DoxyEnumerate}
+\item Clone the repository\+:
+\begin{DoxyCode}{0}
+\DoxyCodeLine{git clone https://github.com/SingularityX-\/ai/penify-\/cli.git}
+
+\end{DoxyCode}
+
+\item Install the package in editable mode\+:
+\begin{DoxyCode}{0}
+\DoxyCodeLine{pip install -\/e .}
+
+\end{DoxyCode}
+
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md171}{}\doxysubsection{Running Tests}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md171}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{pytest}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md172}{}\doxysection{License}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md172}
+This project is licensed under the MIT License.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md173}{}\doxysection{Author}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md173}
+Suman Saurabh (\href{mailto:ss.sumansaurabh92@gmail.com}{\texttt{ ss.\+sumansaurabh92@gmail.\+com}})\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md174}{}\doxysection{Contributing}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md174}
+Contributions are welcome! Please feel free to submit a Pull Request.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md175}{}\doxysection{Issues}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md175}
+If you encounter any problems or have suggestions, please file an issue on the \href{https://github.com/SingularityX-ai/penify/issues}{\texttt{ Git\+Hub repository}}.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md176}{}\doxysection{Support}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README_autotoc_md176}
+For automated API Documentation, Architecture Documentation, Code Documentation, Pull Request Documentation, or if you need a demo, please join our \href{https://discord.gg/wqrc8JeV}{\texttt{ Discord support channel}}.
\ No newline at end of file
diff --git a/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.tex b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.tex
new file mode 100644
index 0000000..e73bbcb
--- /dev/null
+++ b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.tex
@@ -0,0 +1,162 @@
+The {\ttfamily commit} command allows you to generate smart, AI-\/powered commit messages for your Git changes. This document explains all available options and combinations.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md1}{}\doxysection{Basic Usage}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md1}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit}
+
+\end{DoxyCode}
+
+
+By default, this command\+:
+\begin{DoxyItemize}
+\item Analyzes your staged Git changes
+\item Generates a concise commit title only
+\item Uses local LLM if configured, or falls back to Penify API
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md2}{}\doxysection{Command Options}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md2}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md3}{}\doxysubsection{$<$tt$>$-\/m, -\/-\/message$<$/tt$>$}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md3}
+Provide context for the commit message generation\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit -\/m "{}Fix login flow"{}}
+
+\end{DoxyCode}
+
+
+This hint helps the AI understand your intention and improves the quality of the generated message.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md4}{}\doxysubsection{$<$tt$>$-\/e, -\/-\/terminal$<$/tt$>$}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md4}
+Open an editor to review and edit the generated commit message before committing\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit -\/e}
+
+\end{DoxyCode}
+
+
+This opens your default Git editor with the generated message for review.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md5}{}\doxysubsection{$<$tt$>$-\/d, -\/-\/description$<$/tt$>$}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md5}
+Generate a detailed commit message with both title and description\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit -\/d}
+
+\end{DoxyCode}
+
+
+Without this flag, only the commit title is generated.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md6}{}\doxysection{Option Combinations}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md6}
+You can combine these options for different workflows\+:\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md7}{}\doxysubsection{Generate Title Only with Context}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md7}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit -\/m "{}Update login UI"{}}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md8}{}\doxysubsection{Generate Title and Description with Context}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md8}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit -\/m "{}Update login UI"{} -\/d}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md9}{}\doxysubsection{Generate and Edit Full Commit Message}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md9}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit -\/d -\/e}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md10}{}\doxysubsection{Generate, Edit, and Provide Context}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md10}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit -\/m "{}Refactor authentication"{} -\/d -\/e}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md11}{}\doxysection{LLM and JIRA Integration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md11}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md12}{}\doxysubsection{Using Local LLM}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md12}
+If you\textquotesingle{}ve configured a local LLM using {\ttfamily penify config llm}, the commit command will automatically use it for message generation.
+
+Benefits\+:
+\begin{DoxyItemize}
+\item Privacy\+: your code changes don\textquotesingle{}t leave your machine
+\item Speed\+: no network latency
+\item Works offline
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md13}{}\doxysubsection{JIRA Enhancement}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md13}
+If you\textquotesingle{}ve configured JIRA integration using {\ttfamily penify config jira}, the commit command will\+:
+
+
+\begin{DoxyEnumerate}
+\item Detect JIRA issue references in your changes
+\item Fetch issue details from your JIRA instance
+\item Include issue information in the commit message
+\item Format the commit message according to JIRA\textquotesingle{}s smart commit format
+\end{DoxyEnumerate}
+
+Example output\+:
+\begin{DoxyCode}{0}
+\DoxyCodeLine{PROJ-\/123: Fix authentication bug in login flow}
+\DoxyCodeLine{}
+\DoxyCodeLine{-\/ Updated OAuth token validation}
+\DoxyCodeLine{-\/ Fixed session timeout handling}
+\DoxyCodeLine{-\/ Added unit tests for edge cases}
+\DoxyCodeLine{}
+\DoxyCodeLine{[PROJ-\/123]}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md14}{}\doxysection{Configuration Requirements}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md14}
+For the {\ttfamily commit} command to work\+:
+
+
+\begin{DoxyEnumerate}
+\item You must have configured either\+:
+\begin{DoxyItemize}
+\item Local LLM via {\ttfamily penify config llm}, OR
+\item Logged in via {\ttfamily penify login}
+\end{DoxyItemize}
+\item For JIRA enhancement (optional)\+:
+\begin{DoxyItemize}
+\item Configure JIRA via {\ttfamily penify config jira}
+\end{DoxyItemize}
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md15}{}\doxysection{Examples}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md15}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md16}{}\doxysubsection{Basic Commit with Default Settings}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md16}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Stage your changes}
+\DoxyCodeLine{git add .}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Generate commit message}
+\DoxyCodeLine{penify commit}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Commit with the generated message}
+\DoxyCodeLine{git commit -\/m "{}Generated message here"{}}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md17}{}\doxysubsection{Full Workflow with All Features}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md17}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Stage your changes}
+\DoxyCodeLine{git add .}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Generate detailed commit message with JIRA integration, }
+\DoxyCodeLine{\# provide context, and open editor for review}
+\DoxyCodeLine{penify commit -\/m "{}Fix login issue"{} -\/d -\/e}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# The commit is automatically completed after you save and exit the editor}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md18}{}\doxysection{Troubleshooting}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md18}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md19}{}\doxysubsection{Common Issues}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands_autotoc_md19}
+
+\begin{DoxyEnumerate}
+\item $\ast$$\ast$\char`\"{}\+No LLM model or API token provided\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Run {\ttfamily penify config llm} to configure a local LLM, or
+\item Run {\ttfamily penify login} to authenticate with Penify
+\end{DoxyItemize}
+\item $\ast$$\ast$\char`\"{}\+Failed to connect to JIRA\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Check your JIRA configuration with {\ttfamily cat $\sim$/.penify}
+\item Verify your network connection
+\item Ensure your JIRA credentials are valid
+\end{DoxyItemize}
+\item $\ast$$\ast$\char`\"{}\+Error initializing LLM client\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Verify your LLM configuration settings
+\item Ensure the LLM API is accessible
+\end{DoxyItemize}
+\end{DoxyEnumerate}
\ No newline at end of file
diff --git a/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.tex b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.tex
new file mode 100644
index 0000000..eef6cd1
--- /dev/null
+++ b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.tex
@@ -0,0 +1,167 @@
+The {\ttfamily config} command allows you to set up and manage configuration settings for Penify CLI. This document explains all available configuration options and how to use them.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md21}{}\doxysection{Configuration Overview}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md21}
+Penify CLI stores configuration in a JSON file at {\ttfamily $\sim$/.penify/config.\+json}. The configuration includes\+:
+
+
+\begin{DoxyItemize}
+\item LLM (Large Language Model) settings for local commit message generation
+\item JIRA integration settings for enhanced commit messages
+\item API tokens and other credentials
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md22}{}\doxysection{Basic Usage}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md22}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Configure LLM settings}
+\DoxyCodeLine{penify config llm}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Configure JIRA integration}
+\DoxyCodeLine{penify config jira}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md23}{}\doxysection{LLM Configuration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md23}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md24}{}\doxysubsection{Web Interface}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md24}
+Running {\ttfamily penify config llm} opens a web interface in your browser where you can configure\+:
+
+
+\begin{DoxyEnumerate}
+\item {\bfseries{Model}}\+: The LLM model to use (e.\+g., {\ttfamily gpt-\/3.\+5-\/turbo})
+\item {\bfseries{API Base URL}}\+: The endpoint URL for your LLM API (e.\+g., {\ttfamily \href{https://api.openai.com/v1}{\texttt{ https\+://api.\+openai.\+com/v1}}})
+\item {\bfseries{API Key}}\+: Your authentication key for the LLM API
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md25}{}\doxysubsection{Supported LLMs}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md25}
+Penify CLI supports various LLM providers\+:\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md26}{}\doxysubsubsection{Open\+AI}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md26}
+
+\begin{DoxyItemize}
+\item Model\+: {\ttfamily gpt-\/3.\+5-\/turbo} or {\ttfamily gpt-\/4}
+\item API Base\+: {\ttfamily \href{https://api.openai.com/v1}{\texttt{ https\+://api.\+openai.\+com/v1}}}
+\item API Key\+: Your Open\+AI API key
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md27}{}\doxysubsubsection{Anthropic}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md27}
+
+\begin{DoxyItemize}
+\item Model\+: {\ttfamily claude-\/instant-\/1} or {\ttfamily claude-\/2}
+\item API Base\+: {\ttfamily \href{https://api.anthropic.com/v1}{\texttt{ https\+://api.\+anthropic.\+com/v1}}}
+\item API Key\+: Your Anthropic API key
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md28}{}\doxysubsubsection{Ollama (\+Local)}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md28}
+
+\begin{DoxyItemize}
+\item Model\+: {\ttfamily llama2} or any model you have installed
+\item API Base\+: {\ttfamily \href{http://localhost:11434}{\texttt{ http\+://localhost\+:11434}}}
+\item API Key\+: (leave blank)
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md29}{}\doxysubsubsection{Azure Open\+AI}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md29}
+
+\begin{DoxyItemize}
+\item Model\+: Your deployed model name
+\item API Base\+: Your Azure endpoint
+\item API Key\+: Your Azure API key
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md30}{}\doxysubsection{Configuration File Structure}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md30}
+After configuration, your {\ttfamily $\sim$/.penify/config.\+json} will contain\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\{}
+\DoxyCodeLine{ "{}llm"{}: \{}
+\DoxyCodeLine{ "{}model"{}: "{}gpt-\/3.5-\/turbo"{},}
+\DoxyCodeLine{ "{}api\_base"{}: "{}https://api.openai.com/v1"{},}
+\DoxyCodeLine{ "{}api\_key"{}: "{}sk-\/..."{}}
+\DoxyCodeLine{ \}}
+\DoxyCodeLine{\}}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md31}{}\doxysection{JIRA Configuration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md31}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md32}{}\doxysubsection{Web Interface}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md32}
+Running {\ttfamily penify config jira} opens a web interface where you can configure\+:
+
+
+\begin{DoxyEnumerate}
+\item {\bfseries{JIRA URL}}\+: Your JIRA instance URL (e.\+g., {\ttfamily \href{https://yourcompany.atlassian.net}{\texttt{ https\+://yourcompany.\+atlassian.\+net}}})
+\item {\bfseries{Username}}\+: Your JIRA username (typically your email)
+\item {\bfseries{API Token}}\+: Your JIRA API token
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md33}{}\doxysubsection{Creating a JIRA API Token}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md33}
+
+\begin{DoxyEnumerate}
+\item Log in to \href{https://id.atlassian.com/manage-profile/security/api-tokens}{\texttt{ https\+://id.\+atlassian.\+com/manage-\/profile/security/api-\/tokens}}
+\item Click \char`\"{}\+Create API token\char`\"{}
+\item Give it a name (e.\+g., \char`\"{}\+Penify CLI\char`\"{})
+\item Copy the generated token and paste it into the configuration
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md34}{}\doxysubsection{Configuration File Structure}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md34}
+After configuration, your {\ttfamily $\sim$/.penify/config.\+json} will contain\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\{}
+\DoxyCodeLine{ "{}jira"{}: \{}
+\DoxyCodeLine{ "{}url"{}: "{}https://yourcompany.atlassian.net"{},}
+\DoxyCodeLine{ "{}username"{}: "{}your.email@example.com"{},}
+\DoxyCodeLine{ "{}api\_token"{}: "{}your-\/jira-\/api-\/token"{}}
+\DoxyCodeLine{ \}}
+\DoxyCodeLine{\}}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md35}{}\doxysection{Configuration Locations}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md35}
+Penify CLI looks for configuration in multiple locations\+:
+
+
+\begin{DoxyEnumerate}
+\item Project-\/specific\+: {\ttfamily .penify/config.\+json} in the Git repository root
+\item User-\/specific\+: {\ttfamily $\sim$/.penify/config.\+json} in your home directory
+\end{DoxyEnumerate}
+
+The project-\/specific configuration takes precedence if both exist.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md36}{}\doxysection{Environment Variables}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md36}
+You can override configuration settings using environment variables\+:
+
+
+\begin{DoxyItemize}
+\item {\ttfamily PENIFY\+\_\+\+API\+\_\+\+TOKEN}\+: Override the stored API token
+\item {\ttfamily PENIFY\+\_\+\+LLM\+\_\+\+MODEL}\+: Override the configured LLM model
+\item {\ttfamily PENIFY\+\_\+\+LLM\+\_\+\+API\+\_\+\+BASE}\+: Override the configured LLM API base URL
+\item {\ttfamily PENIFY\+\_\+\+LLM\+\_\+\+API\+\_\+\+KEY}\+: Override the configured LLM API key
+\item {\ttfamily PENIFY\+\_\+\+JIRA\+\_\+\+URL}\+: Override the configured JIRA URL
+\item {\ttfamily PENIFY\+\_\+\+JIRA\+\_\+\+USER}\+: Override the configured JIRA username
+\item {\ttfamily PENIFY\+\_\+\+JIRA\+\_\+\+TOKEN}\+: Override the configured JIRA API token
+\end{DoxyItemize}
+
+Example\+:
+\begin{DoxyCode}{0}
+\DoxyCodeLine{export PENIFY\_LLM\_MODEL="{}gpt-\/4"{}}
+\DoxyCodeLine{penify commit}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md37}{}\doxysection{Command-\/\+Line Configuration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md37}
+For advanced users or scripting, you can directly edit the configuration file\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# View current configuration}
+\DoxyCodeLine{cat \string~/.penify/config.json}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Edit configuration with your preferred editor}
+\DoxyCodeLine{nano \string~/.penify/config.json}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md38}{}\doxysection{Sharing Configuration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md38}
+You can share configuration between machines by copying the {\ttfamily .penify/config.\+json} file. However, be cautious with API keys and credentials.
+
+For team settings, consider\+:
+\begin{DoxyEnumerate}
+\item Using a project-\/specific {\ttfamily .penify/config.\+json} with shared settings
+\item Excluding API keys from shared configuration
+\item Using environment variables for sensitive credentials
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md39}{}\doxysection{Troubleshooting}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md39}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md40}{}\doxysubsection{Common Issues}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands_autotoc_md40}
+
+\begin{DoxyEnumerate}
+\item $\ast$$\ast$\char`\"{}\+Error reading configuration file\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Check if the file exists\+: {\ttfamily ls -\/la $\sim$/.penify}
+\item Ensure it contains valid JSON\+: {\ttfamily cat $\sim$/.penify/config.\+json}
+\end{DoxyItemize}
+\item $\ast$$\ast$\char`\"{}\+Failed to connect to LLM API\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Verify API base URL and API key
+\item Check network connectivity to the API endpoint
+\item Ensure your account has access to the specified model
+\end{DoxyItemize}
+\item $\ast$$\ast$\char`\"{}\+Failed to connect to JIRA\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Check JIRA URL format (should include {\ttfamily \href{https://}{\texttt{ https\+://}}})
+\item Verify username and API token
+\item Ensure your JIRA account has API access permissions
+\end{DoxyItemize}
+\end{DoxyEnumerate}
\ No newline at end of file
diff --git a/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.tex b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.tex
new file mode 100644
index 0000000..812b7a8
--- /dev/null
+++ b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.tex
@@ -0,0 +1,155 @@
+This document provides in-\/depth information about all features and capabilities of the Penify CLI tool.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md42}{}\doxysection{Table of Contents}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md42}
+
+\begin{DoxyItemize}
+\item Penify CLI -\/ Detailed Usage Guide
+\begin{DoxyItemize}
+\item Table of Contents
+\item Authentication
+\begin{DoxyItemize}
+\item Login Process
+\item API Token Storage
+\item Token Precedence
+\end{DoxyItemize}
+\item Command Overview
+\item Commit Message Generation
+\item Code Documentation Generation
+\begin{DoxyItemize}
+\item Use Cases
+\item Authentication Requirement
+\end{DoxyItemize}
+\item Configuration Settings
+\item Git Hooks
+\begin{DoxyItemize}
+\item Post-\/\+Commit Hook
+\item Custom Hook Location
+\end{DoxyItemize}
+\item Advanced Use Cases
+\begin{DoxyItemize}
+\item CI/\+CD Integration
+\item Remote Repository Documentation
+\end{DoxyItemize}
+\item Troubleshooting
+\begin{DoxyItemize}
+\item Common Issues
+\item Logs
+\item Support
+\end{DoxyItemize}
+\end{DoxyItemize}
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md43}{}\doxysection{Authentication}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md43}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md44}{}\doxysubsection{Login Process}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md44}
+When you run {\ttfamily penify login}, the tool\+:
+
+
+\begin{DoxyEnumerate}
+\item Opens your default web browser
+\item Redirects you to Penify\textquotesingle{}s login page
+\item Captures the authentication token after successful login
+\item Saves the token in {\ttfamily $\sim$/.penify} file
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md45}{}\doxysubsection{API Token Storage}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md45}
+API tokens are stored in your home directory in the {\ttfamily .penify} file. This JSON file contains\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\{}
+\DoxyCodeLine{ "{}api\_keys"{}: "{}your-\/api-\/token"{},}
+\DoxyCodeLine{ "{}llm"{}: \{ "{}model"{}: "{}..."{}, "{}api\_base"{}: "{}..."{}, "{}api\_key"{}: "{}..."{} \},}
+\DoxyCodeLine{ "{}jira"{}: \{ "{}url"{}: "{}..."{}, "{}username"{}: "{}..."{}, "{}api\_token"{}: "{}..."{} \}}
+\DoxyCodeLine{\}}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md46}{}\doxysubsection{Token Precedence}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md46}
+
+\begin{DoxyEnumerate}
+\item Environment variable {\ttfamily PENIFY\+\_\+\+API\+\_\+\+TOKEN} (highest priority)
+\item Token in {\ttfamily $\sim$/.penify} file
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md47}{}\doxysection{Command Overview}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md47}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify}
+\DoxyCodeLine{├── commit Generate smart commit messages}
+\DoxyCodeLine{├── config Configure local LLM and JIRA}
+\DoxyCodeLine{│ ├── llm Configure local LLM settings}
+\DoxyCodeLine{│ └── jira Configure JIRA integration}
+\DoxyCodeLine{├── login Log in to Penify account}
+\DoxyCodeLine{└── docgen Generate code documentation}
+\DoxyCodeLine{ ├── install-\/hook Install Git post-\/commit hook}
+\DoxyCodeLine{ └── uninstall-\/hook Remove Git post-\/commit hook}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md48}{}\doxysection{Commit Message Generation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md48}
+The {\ttfamily commit} command analyzes your staged changes and generates meaningful commit messages. It can\+:
+
+
+\begin{DoxyItemize}
+\item Use a local LLM if configured
+\item Enhance messages with JIRA issue details
+\item Provide both title and description
+\end{DoxyItemize}
+
+For specific options and examples, see \mbox{\hyperlink{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands}{docs/commit-\/commands.md}}.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md49}{}\doxysection{Code Documentation Generation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md49}
+The {\ttfamily docgen} command generates documentation for your code\+:\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md50}{}\doxysubsection{Use Cases}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md50}
+
+\begin{DoxyEnumerate}
+\item {\bfseries{Current Git Diff}}\+: Default behavior, documents only changed files
+\item {\bfseries{Specific File}}\+: Pass a file path with {\ttfamily -\/l path/to/file.\+py}
+\item {\bfseries{Entire Folder}}\+: Pass a folder path with {\ttfamily -\/l path/to/folder}
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md51}{}\doxysubsection{Authentication Requirement}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md51}
+This feature requires authentication with a Penify account. Run {\ttfamily penify login} before using documentation features.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md52}{}\doxysection{Configuration Settings}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md52}
+Configure local settings using the {\ttfamily config} command\+:
+
+
+\begin{DoxyItemize}
+\item {\bfseries{LLM Settings}}\+: Configure a local LLM for commit message generation
+\item {\bfseries{JIRA Settings}}\+: Set up JIRA integration for enhanced commit messages
+\end{DoxyItemize}
+
+For detailed configuration options, see \mbox{\hyperlink{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands}{docs/config-\/commands.md}}.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md53}{}\doxysection{Git Hooks}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md53}
+Penify can install Git hooks to automate documentation generation\+:\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md54}{}\doxysubsection{Post-\/\+Commit Hook}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md54}
+
+\begin{DoxyItemize}
+\item {\bfseries{Install}}\+: {\ttfamily penify docgen install-\/hook}
+\item {\bfseries{What it does}}\+: Automatically generates documentation for changed files after each commit
+\item {\bfseries{Uninstall}}\+: {\ttfamily penify docgen uninstall-\/hook}
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md55}{}\doxysubsection{Custom Hook Location}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md55}
+You can specify a custom location for Git hooks\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen install-\/hook -\/l /path/to/git/repo}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md56}{}\doxysection{Advanced Use Cases}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md56}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md57}{}\doxysubsection{CI/\+CD Integration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md57}
+For CI/\+CD pipelines\+:
+
+
+\begin{DoxyEnumerate}
+\item Set {\ttfamily PENIFY\+\_\+\+API\+\_\+\+TOKEN} as an environment variable
+\item Run commands without requiring interactive login
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md58}{}\doxysubsection{Remote Repository Documentation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md58}
+Generate documentation for an entire repository\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{git clone https://github.com/user/repo}
+\DoxyCodeLine{cd repo}
+\DoxyCodeLine{penify docgen -\/l .}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md59}{}\doxysection{Troubleshooting}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md59}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md60}{}\doxysubsection{Common Issues}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md60}
+
+\begin{DoxyEnumerate}
+\item {\bfseries{API Key Errors}}\+: Ensure you\textquotesingle{}ve run {\ttfamily penify login} or set {\ttfamily PENIFY\+\_\+\+API\+\_\+\+TOKEN}
+\item {\bfseries{LLM Configuration}}\+: Check your LLM settings with {\ttfamily cat $\sim$/.penify}
+\item {\bfseries{JIRA Integration}}\+: Verify JIRA credentials in your configuration
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md61}{}\doxysubsection{Logs}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md61}
+For more detailed logs, you can set the environment variable\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{export PENIFY\_DEBUG=1}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md62}{}\doxysubsection{Support}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage_autotoc_md62}
+For additional help, visit \href{https://docs.penify.dev/}{\texttt{ https\+://docs.\+penify.\+dev/}} or contact \href{mailto:support@penify.dev}{\texttt{ support@penify.\+dev}}
\ No newline at end of file
diff --git a/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.tex b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.tex
new file mode 100644
index 0000000..58a1286
--- /dev/null
+++ b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.tex
@@ -0,0 +1,327 @@
+This document provides a detailed guide to all permutations and combinations of the {\ttfamily docgen} command, including extensive information about Git hook commands for automating documentation generation.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md64}{}\doxysection{Table of Contents}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md64}
+
+\begin{DoxyItemize}
+\item Basic Usage
+\item Command Options
+\item Option Combinations
+\item Git Hook Commands
+\begin{DoxyItemize}
+\item Hook Installation
+\item Hook Customization
+\item Hook Uninstallation
+\end{DoxyItemize}
+\item Advanced Use Cases
+\item Troubleshooting
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md65}{}\doxysection{Basic Usage}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md65}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen}
+
+\end{DoxyCode}
+
+
+By default, this command\+:
+\begin{DoxyItemize}
+\item Analyzes the current Git diff (changes since last commit)
+\item Generates documentation for changed files only
+\item Requires authentication via {\ttfamily penify login}
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md66}{}\doxysection{Command Options}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md66}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md67}{}\doxysubsection{$<$tt$>$-\/l, -\/-\/location$<$/tt$>$}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md67}
+Specify a target for documentation generation\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Generate documentation for a specific file}
+\DoxyCodeLine{penify docgen -\/l path/to/file.py}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Generate documentation for a specific folder}
+\DoxyCodeLine{penify docgen -\/l path/to/folder}
+
+\end{DoxyCode}
+
+
+Without this flag, Penify analyzes only Git-\/tracked modified files.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md68}{}\doxysubsection{Subcommands}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md68}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md69}{}\doxysubsubsection{$<$tt$>$install-\/hook$<$/tt$>$}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md69}
+Install a Git post-\/commit hook to automatically generate documentation\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen install-\/hook}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md70}{}\doxysubsubsection{$<$tt$>$uninstall-\/hook$<$/tt$>$}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md70}
+Remove the Git post-\/commit hook\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen uninstall-\/hook}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md71}{}\doxysection{Option Combinations}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md71}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md72}{}\doxysubsection{Generate Documentation for Current Git Diff}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md72}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Basic usage -\/ current Git diff}
+\DoxyCodeLine{penify docgen}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md73}{}\doxysubsection{Generate Documentation for a Specific File}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md73}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Single file documentation}
+\DoxyCodeLine{penify docgen -\/l src/main.py}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md74}{}\doxysubsection{Generate Documentation for a Folder}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md74}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Folder documentation}
+\DoxyCodeLine{penify docgen -\/l src/models/}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md75}{}\doxysubsection{Install Hook in Current Repository}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md75}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Install hook in current Git repository}
+\DoxyCodeLine{penify docgen install-\/hook}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md76}{}\doxysubsection{Install Hook in Specific Repository}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md76}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Install hook in a specific Git repository}
+\DoxyCodeLine{penify docgen install-\/hook -\/l /path/to/repo}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md77}{}\doxysubsection{Uninstall Hook from Current Repository}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md77}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Uninstall hook from current Git repository}
+\DoxyCodeLine{penify docgen uninstall-\/hook}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md78}{}\doxysubsection{Uninstall Hook from Specific Repository}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md78}
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Uninstall hook from a specific Git repository}
+\DoxyCodeLine{penify docgen uninstall-\/hook -\/l /path/to/repo}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md79}{}\doxysection{Git Hook Commands}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md79}
+Penify provides Git hook commands to automate documentation generation as part of your Git workflow.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md80}{}\doxysubsection{Hook Installation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md80}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md81}{}\doxysubsubsection{How Hooks Work}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md81}
+When you install a Git hook with {\ttfamily penify docgen install-\/hook}, Penify\+:
+
+
+\begin{DoxyEnumerate}
+\item Creates a post-\/commit hook script in the {\ttfamily .git/hooks} directory
+\item Makes the script executable
+\item Configures the hook to run {\ttfamily penify docgen} after each commit
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md82}{}\doxysubsubsection{Hook Script Content}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md82}
+The generated post-\/commit hook contains\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\#!/bin/sh}
+\DoxyCodeLine{\# This is a post-\/commit hook generated by penify.}
+\DoxyCodeLine{\# Automatically generates documentation for changed files after each commit.}
+\DoxyCodeLine{}
+\DoxyCodeLine{penify docgen -\/gf /path/to/git/repository -\/t your\_api\_token}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md83}{}\doxysubsubsection{Installation Location}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md83}
+By default, hooks are installed in the current Git repository. You can specify a different location\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen install-\/hook -\/l /path/to/repo}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md84}{}\doxysubsubsection{Installation Requirements}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md84}
+To install hooks, you need\+:
+\begin{DoxyItemize}
+\item A valid Penify API token (login first with {\ttfamily penify login})
+\item Write permissions to the {\ttfamily .git/hooks} directory
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md85}{}\doxysubsubsection{Verifying Installation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md85}
+After installation, you can verify that the hook is installed\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{cat .git/hooks/post-\/commit}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md86}{}\doxysubsection{Hook Customization}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md86}
+You can customize the post-\/commit hook after installation\+:\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md87}{}\doxysubsubsection{Modifying Hook Behavior}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md87}
+
+\begin{DoxyEnumerate}
+\item Edit the {\ttfamily .git/hooks/post-\/commit} file
+\item Add additional options to the {\ttfamily penify docgen} command
+\item Add other commands to run after commit
+\end{DoxyEnumerate}
+
+Example of a customized hook\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\#!/bin/sh}
+\DoxyCodeLine{\# This is a post-\/commit hook generated by penify.}
+\DoxyCodeLine{\# Automatically generates documentation for changed files after each commit.}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Generate documentation}
+\DoxyCodeLine{penify docgen -\/gf /path/to/git/repository -\/t your\_api\_token}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Additional custom commands}
+\DoxyCodeLine{echo "{}Documentation generation complete!"{}}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md88}{}\doxysubsubsection{Advanced Hook Scenarios}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md88}
+{\bfseries{Conditional Documentation Generation}}\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\#!/bin/sh}
+\DoxyCodeLine{\# Only generate documentation for commits to the main branch}
+\DoxyCodeLine{BRANCH=\$(git rev-\/parse -\/-\/abbrev-\/ref HEAD)}
+\DoxyCodeLine{if [ "{}\$BRANCH"{} = "{}main"{} ]; then}
+\DoxyCodeLine{ penify docgen -\/gf /path/to/git/repository -\/t your\_api\_token}
+\DoxyCodeLine{fi}
+
+\end{DoxyCode}
+
+
+{\bfseries{Documenting Specific Files/\+Folders}}\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\#!/bin/sh}
+\DoxyCodeLine{\# Only document Python files in the src directory}
+\DoxyCodeLine{penify docgen -\/l src/ -\/gf /path/to/git/repository -\/t your\_api\_token}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md89}{}\doxysubsection{Hook Uninstallation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md89}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md90}{}\doxysubsubsection{Standard Uninstallation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md90}
+To remove a hook from the current repository\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen uninstall-\/hook}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md91}{}\doxysubsubsection{Specific Repository Uninstallation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md91}
+To remove a hook from a specific repository\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen uninstall-\/hook -\/l /path/to/repo}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md92}{}\doxysubsubsection{Manual Hook Removal}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md92}
+If needed, you can manually remove the hook\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{rm .git/hooks/post-\/commit}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md93}{}\doxysubsubsection{Verifying Uninstallation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md93}
+Check that the hook was successfully removed\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{ls -\/la .git/hooks/post-\/commit \# Should return "{}No such file or directory"{}}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md94}{}\doxysection{Advanced Use Cases}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md94}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md95}{}\doxysubsection{Continuous Integration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md95}
+Run documentation generation in CI pipelines\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# In your CI script}
+\DoxyCodeLine{export PENIFY\_API\_TOKEN=your\_api\_token}
+\DoxyCodeLine{penify docgen -\/l src/}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md96}{}\doxysubsection{Batch Documentation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md96}
+Generate documentation for multiple repositories\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Bash script for batch documentation}
+\DoxyCodeLine{for repo in repo1 repo2 repo3; do}
+\DoxyCodeLine{ cd /path/to/\$repo}
+\DoxyCodeLine{ penify docgen -\/l .}
+\DoxyCodeLine{done}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md97}{}\doxysubsection{Custom Git Hook Integration}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md97}
+Integrate with other Git hooks\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# In .git/hooks/pre-\/push}
+\DoxyCodeLine{penify docgen -\/l src/}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md98}{}\doxysubsection{Documenting Release Tags}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md98}
+Generate documentation when creating a release tag\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Document everything when creating a tag}
+\DoxyCodeLine{git tag -\/a v1.0.0}
+\DoxyCodeLine{penify docgen -\/l . \# Document entire codebase}
+\DoxyCodeLine{git commit -\/-\/amend -\/m "{}Release v1.0.0 with updated documentation"{}}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md99}{}\doxysection{Troubleshooting}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md99}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md100}{}\doxysubsection{Common Issues}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md100}
+
+\begin{DoxyEnumerate}
+\item $\ast$$\ast$\char`\"{}\+Authentication required\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Run {\ttfamily penify login} before using documentation features
+\item Check your API token with {\ttfamily cat $\sim$/.penify}
+\end{DoxyItemize}
+\item $\ast$$\ast$\char`\"{}\+Permission denied when installing hook\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Check Git repository permissions
+\item Try running with sudo (if appropriate for your environment)
+\item Ensure the {\ttfamily .git/hooks} directory exists
+\end{DoxyItemize}
+\item $\ast$$\ast$\char`\"{}\+Hook installed but not running\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Check if the hook is executable\+: {\ttfamily ls -\/la .git/hooks/post-\/commit}
+\item Make it executable if needed\+: {\ttfamily chmod +x .git/hooks/post-\/commit}
+\item Check for syntax errors in the hook script
+\end{DoxyItemize}
+\item $\ast$$\ast$\char`\"{}\+File or directory not found\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Verify the path provided to the {\ttfamily -\/l} option
+\item Ensure you\textquotesingle{}re running the command from the correct directory
+\end{DoxyItemize}
+\item $\ast$$\ast$\char`\"{}\+Hook uninstallation failed\char`\"{}$\ast$$\ast$
+\begin{DoxyItemize}
+\item Check permissions on the {\ttfamily .git/hooks} directory
+\item Try manual removal\+: {\ttfamily rm .git/hooks/post-\/commit}
+\end{DoxyItemize}
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md101}{}\doxysubsection{Debugging}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md101}
+For detailed output when running documentation commands\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{export PENIFY\_DEBUG=1}
+\DoxyCodeLine{penify docgen -\/l src/}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md102}{}\doxysubsection{Getting Help}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands_autotoc_md102}
+For command-\/specific help\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen -\/-\/help}
+\DoxyCodeLine{penify docgen install-\/hook -\/-\/help}
+\DoxyCodeLine{penify docgen uninstall-\/hook -\/-\/help}
+
+\end{DoxyCode}
+
\ No newline at end of file
diff --git a/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.tex b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.tex
new file mode 100644
index 0000000..ac2efc9
--- /dev/null
+++ b/docs/latex/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.tex
@@ -0,0 +1,155 @@
+This document demonstrates how to use Penify CLI in real-\/world development workflows to improve your productivity.\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md104}{}\doxysection{Workflow 1\+: Efficient Git Commits with AI}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md104}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md105}{}\doxysubsection{Setup}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md105}
+First, configure your local LLM for offline operation\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify config llm}
+
+\end{DoxyCode}
+
+
+Configure your JIRA integration for enhanced commit messages\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify config jira}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md106}{}\doxysubsection{Daily Workflow}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md106}
+
+\begin{DoxyEnumerate}
+\item Make your code changes as usual
+\item When ready to commit, use Penify to generate a smart commit message\+:
+\end{DoxyEnumerate}
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify commit}
+
+\end{DoxyCode}
+
+
+
+\begin{DoxyEnumerate}
+\item Review and confirm the generated commit message
+\item Git commit and push as usual
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md107}{}\doxysubsection{Benefits}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md107}
+
+\begin{DoxyItemize}
+\item Consistent and descriptive commit messages
+\item Automatic inclusion of relevant JIRA ticket information
+\item Time saved from writing detailed commit messages
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md108}{}\doxysection{Workflow 2\+: Documentation Generation Pipeline}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md108}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md109}{}\doxysubsection{Setup}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md109}
+Login to Penify to access advanced documentation features\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify login}
+
+\end{DoxyCode}
+
+
+Install the Git hook for automatic documentation generation\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen install-\/hook}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md110}{}\doxysubsection{Daily Workflow}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md110}
+
+\begin{DoxyEnumerate}
+\item Make your code changes as usual
+\item Commit your changes
+\item Documentation is automatically generated for changed files
+\item Review the generated documentation
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md111}{}\doxysubsection{Manual Documentation}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md111}
+For specific files or folders\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen -\/l src/components/authentication}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md112}{}\doxysubsection{Benefits}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md112}
+
+\begin{DoxyItemize}
+\item Always up-\/to-\/date documentation
+\item Consistent documentation style
+\item Time saved from writing detailed documentation
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md113}{}\doxysection{Workflow 3\+: Code Review Enhancement}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md113}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md114}{}\doxysubsection{Setup}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md114}
+Ensure you\textquotesingle{}re logged into Penify\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify login}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md115}{}\doxysubsection{Workflow}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md115}
+
+\begin{DoxyEnumerate}
+\item Before submitting a PR, generate documentation for changed files\+:
+\end{DoxyEnumerate}
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen}
+
+\end{DoxyCode}
+
+
+
+\begin{DoxyEnumerate}
+\item Include the generated documentation in your PR
+\item Reviewers can better understand your changes with the AI-\/generated explanations
+\end{DoxyEnumerate}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md116}{}\doxysubsection{Benefits}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md116}
+
+\begin{DoxyItemize}
+\item Improved PR quality
+\item Faster code reviews
+\item Better team understanding of code changes
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md117}{}\doxysection{Workflow 4\+: Onboarding New Team Members}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md117}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md118}{}\doxysubsection{For Team Leads}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md118}
+Generate comprehensive documentation for the entire codebase\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen -\/l .}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md119}{}\doxysubsection{For New Team Members}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md119}
+Generate focused documentation for components you\textquotesingle{}re working on\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{penify docgen -\/l src/components/my-\/feature}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md120}{}\doxysubsection{Benefits}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md120}
+
+\begin{DoxyItemize}
+\item Faster onboarding
+\item Better understanding of code structure
+\item Reduced questions to senior team members
+\end{DoxyItemize}\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md121}{}\doxysection{Workflow 5\+: Legacy Code Understanding}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md121}
+When working with unfamiliar legacy code\+:
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{\# Document a specific complex file}
+\DoxyCodeLine{penify docgen -\/l src/legacy/complex\_module.py}
+\DoxyCodeLine{}
+\DoxyCodeLine{\# Document an entire legacy component}
+\DoxyCodeLine{penify docgen -\/l src/legacy/old\_component}
+
+\end{DoxyCode}
+\hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md122}{}\doxysubsection{Benefits}\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows_autotoc_md122}
+
+\begin{DoxyItemize}
+\item Quickly understand complex legacy systems
+\item Reduce time spent deciphering undocumented code
+\item Make safer changes to legacy systems
+\end{DoxyItemize}
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook.tex b/docs/latex/namespacepenify__hook.tex
new file mode 100644
index 0000000..74b001c
--- /dev/null
+++ b/docs/latex/namespacepenify__hook.tex
@@ -0,0 +1,35 @@
+\hypertarget{namespacepenify__hook}{}\doxysection{penify\+\_\+hook Namespace Reference}
+\label{namespacepenify__hook}\index{penify\_hook@{penify\_hook}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1api__client}{api\+\_\+client}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1base__analyzer}{base\+\_\+analyzer}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands}{commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commit__analyzer}{commit\+\_\+analyzer}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1config__command}{config\+\_\+command}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1constants}{constants}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1file__analyzer}{file\+\_\+analyzer}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1folder__analyzer}{folder\+\_\+analyzer}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1git__analyzer}{git\+\_\+analyzer}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1jira__client}{jira\+\_\+client}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1llm__client}{llm\+\_\+client}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1login__command}{login\+\_\+command}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1main}{main}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils}{ui\+\_\+utils}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1utils}{utils}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacepenify__hook_1_1api__client.tex b/docs/latex/namespacepenify__hook_1_1api__client.tex
new file mode 100644
index 0000000..de870ae
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1api__client.tex
@@ -0,0 +1,7 @@
+\hypertarget{namespacepenify__hook_1_1api__client}{}\doxysection{penify\+\_\+hook.\+api\+\_\+client Namespace Reference}
+\label{namespacepenify__hook_1_1api__client}\index{penify\_hook.api\_client@{penify\_hook.api\_client}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1api__client_1_1APIClient}{APIClient}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacepenify__hook_1_1base__analyzer.tex b/docs/latex/namespacepenify__hook_1_1base__analyzer.tex
new file mode 100644
index 0000000..f5427b8
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1base__analyzer.tex
@@ -0,0 +1,7 @@
+\hypertarget{namespacepenify__hook_1_1base__analyzer}{}\doxysection{penify\+\_\+hook.\+base\+\_\+analyzer Namespace Reference}
+\label{namespacepenify__hook_1_1base__analyzer}\index{penify\_hook.base\_analyzer@{penify\_hook.base\_analyzer}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer}{Base\+Analyzer}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacepenify__hook_1_1commands.tex b/docs/latex/namespacepenify__hook_1_1commands.tex
new file mode 100644
index 0000000..6cdba2d
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands.tex
@@ -0,0 +1,15 @@
+\hypertarget{namespacepenify__hook_1_1commands}{}\doxysection{penify\+\_\+hook.\+commands Namespace Reference}
+\label{namespacepenify__hook_1_1commands}\index{penify\_hook.commands@{penify\_hook.commands}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1auth__commands}{auth\+\_\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands}{commit\+\_\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands}{config\+\_\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands}{doc\+\_\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands}{hook\+\_\+commands}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands.tex b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands.tex
new file mode 100644
index 0000000..32993a6
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands.tex
@@ -0,0 +1,76 @@
+\hypertarget{namespacepenify__hook_1_1commands_1_1auth__commands}{}\doxysection{penify\+\_\+hook.\+commands.\+auth\+\_\+commands Namespace Reference}
+\label{namespacepenify__hook_1_1commands_1_1auth__commands}\index{penify\_hook.commands.auth\_commands@{penify\_hook.commands.auth\_commands}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24}{save\+\_\+credentials}} (api\+\_\+key)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655}{login}} (api\+\_\+url, dashboard\+\_\+url)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655}\label{namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655}}
+\index{penify\_hook.commands.auth\_commands@{penify\_hook.commands.auth\_commands}!login@{login}}
+\index{login@{login}!penify\_hook.commands.auth\_commands@{penify\_hook.commands.auth\_commands}}
+\doxysubsubsection{\texorpdfstring{login()}{login()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+auth\+\_\+commands.\+login (\begin{DoxyParamCaption}\item[{}]{api\+\_\+url, }\item[{}]{dashboard\+\_\+url }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Open the login page in a web browser and capture the token via redirect.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24}\label{namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24}}
+\index{penify\_hook.commands.auth\_commands@{penify\_hook.commands.auth\_commands}!save\_credentials@{save\_credentials}}
+\index{save\_credentials@{save\_credentials}!penify\_hook.commands.auth\_commands@{penify\_hook.commands.auth\_commands}}
+\doxysubsubsection{\texorpdfstring{save\_credentials()}{save\_credentials()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+auth\+\_\+commands.\+save\+\_\+credentials (\begin{DoxyParamCaption}\item[{}]{api\+\_\+key }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Save the API key in a priority-based manner.
+
+This function attempts to save the API key in two locations, based on priority:
+1. In a `.env` file located in the root of the Git repository if one is found.
+2. In a global `.penify` file located in the user's home directory as a
+fallback. The function first tries to locate the Git repository using
+`recursive_search_git_folder`. If a Git repository is found, it reads the
+existing `.env` file (if present), updates or adds the API key under the key
+`PENIFY_API_TOKEN`, and writes the updated content back. If any error occurs
+during this process, it falls back to saving the credentials in the global
+`.penify` file. The function handles exceptions and prints appropriate error
+messages.
+
+Args:
+ api_key (str): The API key to save.
+
+Returns:
+ bool: True if the API key is saved successfully, False otherwise.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph}
+\end{center}
+\end{figure}
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5
new file mode 100644
index 0000000..d68cbe9
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5
@@ -0,0 +1 @@
+1790a20abec8f6d16a5be410097ca80b
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.pdf
new file mode 100644
index 0000000..878f393
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5
new file mode 100644
index 0000000..e2a4d6c
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5
@@ -0,0 +1 @@
+6cb89be59e6f34a2a19f5fd537dbaee9
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.pdf
new file mode 100644
index 0000000..e2eaf2c
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5
new file mode 100644
index 0000000..38c7b14
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5
@@ -0,0 +1 @@
+8a70311750ed60c6ae87e9278c57fa69
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.pdf
new file mode 100644
index 0000000..17bab0b
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5
new file mode 100644
index 0000000..027c8db
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5
@@ -0,0 +1 @@
+45b92f5d2e6efa07f2987352c7b7475c
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.pdf
new file mode 100644
index 0000000..23d5bb6
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands.tex b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands.tex
new file mode 100644
index 0000000..0c86bc6
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands.tex
@@ -0,0 +1,95 @@
+\hypertarget{namespacepenify__hook_1_1commands_1_1commit__commands}{}\doxysection{penify\+\_\+hook.\+commands.\+commit\+\_\+commands Namespace Reference}
+\label{namespacepenify__hook_1_1commands_1_1commit__commands}\index{penify\_hook.commands.commit\_commands@{penify\_hook.commands.commit\_commands}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a}{commit\+\_\+code}} (api\+\_\+url, token, message, open\+\_\+terminal, generate\+\_\+description, llm\+\_\+model=None, llm\+\_\+api\+\_\+base=None, llm\+\_\+api\+\_\+key=None, jira\+\_\+url=None, jira\+\_\+user=None, jira\+\_\+api\+\_\+token=None)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c}{setup\+\_\+commit\+\_\+parser}} (parser)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23}{handle\+\_\+commit}} (args)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a}\label{namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a}}
+\index{penify\_hook.commands.commit\_commands@{penify\_hook.commands.commit\_commands}!commit\_code@{commit\_code}}
+\index{commit\_code@{commit\_code}!penify\_hook.commands.commit\_commands@{penify\_hook.commands.commit\_commands}}
+\doxysubsubsection{\texorpdfstring{commit\_code()}{commit\_code()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+commit\+\_\+commands.\+commit\+\_\+code (\begin{DoxyParamCaption}\item[{}]{api\+\_\+url, }\item[{}]{token, }\item[{}]{message, }\item[{}]{open\+\_\+terminal, }\item[{}]{generate\+\_\+description, }\item[{}]{llm\+\_\+model = {\ttfamily None}, }\item[{}]{llm\+\_\+api\+\_\+base = {\ttfamily None}, }\item[{}]{llm\+\_\+api\+\_\+key = {\ttfamily None}, }\item[{}]{jira\+\_\+url = {\ttfamily None}, }\item[{}]{jira\+\_\+user = {\ttfamily None}, }\item[{}]{jira\+\_\+api\+\_\+token = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Enhance Git commits with AI-powered commit messages.
+
+This function allows for the generation of enhanced commit messages using
+natural language processing models and optionally integrates with JIRA for
+additional context. It processes the current Git folder to find relevant files
+and generates a detailed commit message based on the provided parameters.
+
+Args:
+ api_url (str): URL of the API endpoint.
+ token (str): Authentication token for the API.
+ message (str): Initial commit message provided by the user.
+ open_terminal (bool): Whether to open the terminal after committing.
+ generate_description (bool): Whether to generate a detailed description in the commit message.
+ llm_model (str?): The language model to use for generating the commit message. Defaults to None.
+ llm_api_base (str?): Base URL of the LLM API. Defaults to None.
+ llm_api_key (str?): API key for accessing the LLM service. Defaults to None.
+ jira_url (str?): URL of the JIRA instance. Defaults to None.
+ jira_user (str?): Username for authenticating with JIRA. Defaults to None.
+ jira_api_token (str?): API token for accessing JIRA. Defaults to None.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23}\label{namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23}}
+\index{penify\_hook.commands.commit\_commands@{penify\_hook.commands.commit\_commands}!handle\_commit@{handle\_commit}}
+\index{handle\_commit@{handle\_commit}!penify\_hook.commands.commit\_commands@{penify\_hook.commands.commit\_commands}}
+\doxysubsubsection{\texorpdfstring{handle\_commit()}{handle\_commit()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+commit\+\_\+commands.\+handle\+\_\+commit (\begin{DoxyParamCaption}\item[{}]{args }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Handle commit functionality by processing arguments and invoking the
+appropriate commands.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c}\label{namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c}}
+\index{penify\_hook.commands.commit\_commands@{penify\_hook.commands.commit\_commands}!setup\_commit\_parser@{setup\_commit\_parser}}
+\index{setup\_commit\_parser@{setup\_commit\_parser}!penify\_hook.commands.commit\_commands@{penify\_hook.commands.commit\_commands}}
+\doxysubsubsection{\texorpdfstring{setup\_commit\_parser()}{setup\_commit\_parser()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+commit\+\_\+commands.\+setup\+\_\+commit\+\_\+parser (\begin{DoxyParamCaption}\item[{}]{parser }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Sets up an argument parser for generating smart commit messages.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph}
+\end{center}
+\end{figure}
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5
new file mode 100644
index 0000000..a3950a9
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5
@@ -0,0 +1 @@
+632e31dae2aa0889e92ba4cc06f62191
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.pdf
new file mode 100644
index 0000000..ccc8f1d
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5
new file mode 100644
index 0000000..1301299
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5
@@ -0,0 +1 @@
+f0d905da4decb398695d467c119f8f69
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.pdf
new file mode 100644
index 0000000..53b2885
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5
new file mode 100644
index 0000000..f41cc50
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5
@@ -0,0 +1 @@
+436649aae33ef40b115e36ef17293415
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.pdf
new file mode 100644
index 0000000..780c3a3
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5
new file mode 100644
index 0000000..807844a
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5
@@ -0,0 +1 @@
+2970a04a6c8a560cdfebf6cd78f3bc87
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.pdf
new file mode 100644
index 0000000..4fe895c
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5
new file mode 100644
index 0000000..e524984
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5
@@ -0,0 +1 @@
+a916bf8a27b663ddb62c58220f250dbe
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.pdf
new file mode 100644
index 0000000..6d448dc
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands.tex b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands.tex
new file mode 100644
index 0000000..c08e75f
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands.tex
@@ -0,0 +1,314 @@
+\hypertarget{namespacepenify__hook_1_1commands_1_1config__commands}{}\doxysection{penify\+\_\+hook.\+commands.\+config\+\_\+commands Namespace Reference}
+\label{namespacepenify__hook_1_1commands_1_1config__commands}\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+None \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae}{load\+\_\+env\+\_\+files}} ()
+\item
+Path \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20}{get\+\_\+penify\+\_\+config}} ()
+\item
+Any \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87}{get\+\_\+env\+\_\+var\+\_\+or\+\_\+default}} (str env\+\_\+var, Any default=None)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4}{save\+\_\+llm\+\_\+config}} (model, api\+\_\+base, api\+\_\+key)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4}{save\+\_\+jira\+\_\+config}} (url, username, api\+\_\+token)
+\item
+Dict\mbox{[}str, str\mbox{]} \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0}{get\+\_\+llm\+\_\+config}} ()
+\item
+Dict\mbox{[}str, str\mbox{]} \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2}{get\+\_\+jira\+\_\+config}} ()
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c}{config\+\_\+llm\+\_\+web}} ()
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06}{config\+\_\+jira\+\_\+web}} ()
+\item
+Optional\mbox{[}str\mbox{]} \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812}{get\+\_\+token}} ()
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+bool \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a152642ab83cf6219b604bda6122aba67}{DOTENV\+\_\+\+AVAILABLE}} = True
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands_a4b202072a3a3b8515c9c254622e9c880}{path}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06}\label{namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!config\_jira\_web@{config\_jira\_web}}
+\index{config\_jira\_web@{config\_jira\_web}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{config\_jira\_web()}{config\_jira\_web()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+config\+\_\+jira\+\_\+web (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Starts a web server for configuring JIRA settings.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c}\label{namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!config\_llm\_web@{config\_llm\_web}}
+\index{config\_llm\_web@{config\_llm\_web}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{config\_llm\_web()}{config\_llm\_web()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+config\+\_\+llm\+\_\+web (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Starts an HTTP server for configuring LLM settings via a web interface.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87}\label{namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!get\_env\_var\_or\_default@{get\_env\_var\_or\_default}}
+\index{get\_env\_var\_or\_default@{get\_env\_var\_or\_default}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{get\_env\_var\_or\_default()}{get\_env\_var\_or\_default()}}
+{\footnotesize\ttfamily Any penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+env\+\_\+var\+\_\+or\+\_\+default (\begin{DoxyParamCaption}\item[{str}]{env\+\_\+var, }\item[{Any }]{default = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Get environment variable or return default value.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2}\label{namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!get\_jira\_config@{get\_jira\_config}}
+\index{get\_jira\_config@{get\_jira\_config}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{get\_jira\_config()}{get\_jira\_config()}}
+{\footnotesize\ttfamily Dict\mbox{[}str, str\mbox{]} penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+jira\+\_\+config (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Retrieve JIRA configuration from environment variables.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0}\label{namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!get\_llm\_config@{get\_llm\_config}}
+\index{get\_llm\_config@{get\_llm\_config}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{get\_llm\_config()}{get\_llm\_config()}}
+{\footnotesize\ttfamily Dict\mbox{[}str, str\mbox{]} penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+llm\+\_\+config (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Retrieve LLM configuration from environment variables.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20}\label{namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!get\_penify\_config@{get\_penify\_config}}
+\index{get\_penify\_config@{get\_penify\_config}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{get\_penify\_config()}{get\_penify\_config()}}
+{\footnotesize\ttfamily Path penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+penify\+\_\+config (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Returns the path to the `config.json` file within the `.penify` directory,
+creating it if necessary.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812}\label{namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!get\_token@{get\_token}}
+\index{get\_token@{get\_token}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{get\_token()}{get\_token()}}
+{\footnotesize\ttfamily Optional\mbox{[}str\mbox{]} penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+get\+\_\+token (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Retrieves an API token using a prioritized method.
+
+This function first attempts to load environment variables from all `.env`
+files and checks if the `PENIFY_API_TOKEN` environment variable is set. If
+found, it returns the token. If not, it looks for the API key in a
+configuration file named 'api_keys'. If both methods fail, it returns None.
+
+Returns:
+ str or None: The API token if found, otherwise None.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae}\label{namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!load\_env\_files@{load\_env\_files}}
+\index{load\_env\_files@{load\_env\_files}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{load\_env\_files()}{load\_env\_files()}}
+{\footnotesize\ttfamily None penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+load\+\_\+env\+\_\+files (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Load environment variables from .env files in various locations with proper
+priority.
+
+This function loads environment variables from .env files located in different
+directories, prioritizing the current directory over the Git repo root and the
+user home directory. The loading process ensures that later files override
+earlier ones.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4}\label{namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!save\_jira\_config@{save\_jira\_config}}
+\index{save\_jira\_config@{save\_jira\_config}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{save\_jira\_config()}{save\_jira\_config()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+save\+\_\+jira\+\_\+config (\begin{DoxyParamCaption}\item[{}]{url, }\item[{}]{username, }\item[{}]{api\+\_\+token }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Save JIRA configuration settings to a .env file.
+
+This function saves JIRA configuration following these steps: 1. Determine the
+target .env file location based on whether the current directory is inside a
+Git repository. 2. If inside a Git repo, use the Git repo root's .env file;
+otherwise, use the user home directory's .env file. 3. Read the existing
+content of the .env file (if it exists) to preserve other settings. 4. Update
+the .env content with the new JIRA configuration. 5. Write the updated content
+back to the .env file. 6. Optionally, reload environment variables to make
+changes immediately available.
+
+Args:
+ url (str): The JIRA URL to be saved in the .env file.
+ username (str): The JIRA username to be saved in the .env file.
+ api_token (str): The JIRA API token to be saved in the .env file.
+
+Returns:
+ bool: True if the configuration was successfully saved, False otherwise.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4}\label{namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!save\_llm\_config@{save\_llm\_config}}
+\index{save\_llm\_config@{save\_llm\_config}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{save\_llm\_config()}{save\_llm\_config()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+save\+\_\+llm\+\_\+config (\begin{DoxyParamCaption}\item[{}]{model, }\item[{}]{api\+\_\+base, }\item[{}]{api\+\_\+key }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Save LLM configuration settings to an .env file.
+
+This function saves the LLM configuration following a specific priority: 1. Git
+repo root .env (if inside a git repo) 2. User home directory .env It handles
+the detection of the Git repo root, reads the existing .env content, updates it
+with the new LLM configuration, and writes it back to the file. It also reloads
+the environment variables to make changes immediately available.
+
+Args:
+ model (str): The name of the language model.
+ api_base (str): The base URL for the API.
+ api_key (str): The API key for authentication.
+
+Returns:
+ bool: True if the configuration is saved successfully, False otherwise.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a152642ab83cf6219b604bda6122aba67}\label{namespacepenify__hook_1_1commands_1_1config__commands_a152642ab83cf6219b604bda6122aba67}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!DOTENV\_AVAILABLE@{DOTENV\_AVAILABLE}}
+\index{DOTENV\_AVAILABLE@{DOTENV\_AVAILABLE}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{DOTENV\_AVAILABLE}{DOTENV\_AVAILABLE}}
+{\footnotesize\ttfamily bool penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+DOTENV\+\_\+\+AVAILABLE = True}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1config__commands_a4b202072a3a3b8515c9c254622e9c880}\label{namespacepenify__hook_1_1commands_1_1config__commands_a4b202072a3a3b8515c9c254622e9c880}}
+\index{penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}!path@{path}}
+\index{path@{path}!penify\_hook.commands.config\_commands@{penify\_hook.commands.config\_commands}}
+\doxysubsubsection{\texorpdfstring{path}{path}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+commands.\+config\+\_\+commands.\+path}
+
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5
new file mode 100644
index 0000000..7ff5d49
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5
@@ -0,0 +1 @@
+965bf4b7f85ff277fc85db670f036631
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.pdf
new file mode 100644
index 0000000..9c4fec3
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5
new file mode 100644
index 0000000..026b6c4
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5
@@ -0,0 +1 @@
+c45eeefa954ff715ef253a7d5e5d12d4
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.pdf
new file mode 100644
index 0000000..479f14f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5
new file mode 100644
index 0000000..0b8000c
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5
@@ -0,0 +1 @@
+9567daab2dd867e014ccfcb18d744040
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.pdf
new file mode 100644
index 0000000..3955c9f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5
new file mode 100644
index 0000000..93d4cc5
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5
@@ -0,0 +1 @@
+4e36cfbc476359d4042b7bd0cc95d691
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.pdf
new file mode 100644
index 0000000..d383315
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5
new file mode 100644
index 0000000..78dee8e
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5
@@ -0,0 +1 @@
+91b626e03ce341e599fc50cb8d893d76
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.pdf
new file mode 100644
index 0000000..b4ad99f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5
new file mode 100644
index 0000000..ab097fa
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5
@@ -0,0 +1 @@
+efd8a035a3f6606a04e8b16f3de53bdc
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.pdf
new file mode 100644
index 0000000..357a971
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5
new file mode 100644
index 0000000..17f4a7a
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5
@@ -0,0 +1 @@
+1c22fefba6033bc55a604eeac08bb90f
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.pdf
new file mode 100644
index 0000000..bb359d4
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5
new file mode 100644
index 0000000..80f2615
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5
@@ -0,0 +1 @@
+6ff1bb2bacb5f4e75625aedd3fe504f5
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.pdf
new file mode 100644
index 0000000..5f563f2
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5
new file mode 100644
index 0000000..4b6309b
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5
@@ -0,0 +1 @@
+769d44022c81a6e87762df7aa812beb9
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.pdf
new file mode 100644
index 0000000..cb5b334
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5
new file mode 100644
index 0000000..7b00828
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5
@@ -0,0 +1 @@
+37703e4979e38c280c9e2aeb453e968e
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.pdf
new file mode 100644
index 0000000..e3aef9f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5
new file mode 100644
index 0000000..d7eaeeb
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5
@@ -0,0 +1 @@
+42a74c31017cf9e879f3c537cc064095
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.pdf
new file mode 100644
index 0000000..bfa1b26
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5
new file mode 100644
index 0000000..741375f
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5
@@ -0,0 +1 @@
+679023a69335aa28dabdc05c1a80c009
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.pdf
new file mode 100644
index 0000000..20cb16f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5
new file mode 100644
index 0000000..a2e3b3c
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5
@@ -0,0 +1 @@
+ec1da9c2e912b91385c85806113944ce
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.pdf
new file mode 100644
index 0000000..1eec9b8
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5
new file mode 100644
index 0000000..68e354f
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5
@@ -0,0 +1 @@
+941ade1c343a2072db72411b39902d83
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.pdf
new file mode 100644
index 0000000..2173a3b
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5
new file mode 100644
index 0000000..d4e5bcc
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5
@@ -0,0 +1 @@
+614782956e822e2c199b0eb08b1f5ccb
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.pdf
new file mode 100644
index 0000000..d45c477
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5
new file mode 100644
index 0000000..045547c
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5
@@ -0,0 +1 @@
+8bb0342a637d265a89b07ca4e6ebeaf8
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.pdf
new file mode 100644
index 0000000..df89b2f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5
new file mode 100644
index 0000000..3cb4470
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5
@@ -0,0 +1 @@
+d28c1ecaa8daa7cec1572942c38e9e46
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.pdf
new file mode 100644
index 0000000..2589158
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5
new file mode 100644
index 0000000..b977c0e
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5
@@ -0,0 +1 @@
+94801fd9951ba74f105068424d97eb72
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.pdf
new file mode 100644
index 0000000..f47ea49
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands.tex b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands.tex
new file mode 100644
index 0000000..dac95f1
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands.tex
@@ -0,0 +1,106 @@
+\hypertarget{namespacepenify__hook_1_1commands_1_1doc__commands}{}\doxysection{penify\+\_\+hook.\+commands.\+doc\+\_\+commands Namespace Reference}
+\label{namespacepenify__hook_1_1commands_1_1doc__commands}\index{penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25}{generate\+\_\+doc}} (api\+\_\+url, token, location=None)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0}{setup\+\_\+docgen\+\_\+parser}} (parser)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704}{handle\+\_\+docgen}} (args)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands_a3e42540047da37565afffeaf106cb948}{docgen\+\_\+description}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25}\label{namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25}}
+\index{penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}!generate\_doc@{generate\_doc}}
+\index{generate\_doc@{generate\_doc}!penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}}
+\doxysubsubsection{\texorpdfstring{generate\_doc()}{generate\_doc()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+doc\+\_\+commands.\+generate\+\_\+doc (\begin{DoxyParamCaption}\item[{}]{api\+\_\+url, }\item[{}]{token, }\item[{}]{location = {\ttfamily None} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Generates documentation based on the given parameters.
+
+This function initializes an API client using the provided API URL and token.
+It then generates documentation by analyzing the specified location, which can
+be a folder, a file, or the current working directory if no location is
+provided. The function handles different types of analysis based on the input
+location and reports any errors encountered during the process.
+
+Args:
+ api_url (str): The URL of the API to connect to for documentation generation.
+ token (str): The authentication token for accessing the API.
+ location (str?): The path to a specific file or folder to analyze. If not provided,
+ the current working directory is used.
+\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704}\label{namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704}}
+\index{penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}!handle\_docgen@{handle\_docgen}}
+\index{handle\_docgen@{handle\_docgen}!penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}}
+\doxysubsubsection{\texorpdfstring{handle\_docgen()}{handle\_docgen()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+doc\+\_\+commands.\+handle\+\_\+docgen (\begin{DoxyParamCaption}\item[{}]{args }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Handle document generation and hook management based on subcommands.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0}\label{namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0}}
+\index{penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}!setup\_docgen\_parser@{setup\_docgen\_parser}}
+\index{setup\_docgen\_parser@{setup\_docgen\_parser}!penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}}
+\doxysubsubsection{\texorpdfstring{setup\_docgen\_parser()}{setup\_docgen\_parser()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+doc\+\_\+commands.\+setup\+\_\+docgen\+\_\+parser (\begin{DoxyParamCaption}\item[{}]{parser }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Configure a parser for generating documentation using Git commands.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1doc__commands_a3e42540047da37565afffeaf106cb948}\label{namespacepenify__hook_1_1commands_1_1doc__commands_a3e42540047da37565afffeaf106cb948}}
+\index{penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}!docgen\_description@{docgen\_description}}
+\index{docgen\_description@{docgen\_description}!penify\_hook.commands.doc\_commands@{penify\_hook.commands.doc\_commands}}
+\doxysubsubsection{\texorpdfstring{docgen\_description}{docgen\_description}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+commands.\+doc\+\_\+commands.\+docgen\+\_\+description}
+
+{\bfseries Initial value\+:}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 = \textcolor{stringliteral}{"{}"{}"{}Generate code documentation using Penify.}}
+\DoxyCodeLine{2 \textcolor{stringliteral}{}}
+\DoxyCodeLine{3 \textcolor{stringliteral}{This command requires you to be logged in to your Penify account.}}
+\DoxyCodeLine{4 \textcolor{stringliteral}{You can generate documentation for:}}
+\DoxyCodeLine{5 \textcolor{stringliteral}{-\/ Current Git diff (default)}}
+\DoxyCodeLine{6 \textcolor{stringliteral}{-\/ Specific file}}
+\DoxyCodeLine{7 \textcolor{stringliteral}{-\/ Specific folder}}
+\DoxyCodeLine{8 \textcolor{stringliteral}{"{}"{}"{}}}
+
+\end{DoxyCode}
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5
new file mode 100644
index 0000000..b3e7254
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5
@@ -0,0 +1 @@
+4826c595e815560721e83662efce43b9
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.pdf
new file mode 100644
index 0000000..879aacc
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5
new file mode 100644
index 0000000..3db713a
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5
@@ -0,0 +1 @@
+eb18247b90a160d0810b9e87723d7345
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.pdf
new file mode 100644
index 0000000..f1b5bcf
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5
new file mode 100644
index 0000000..a134505
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5
@@ -0,0 +1 @@
+ff6425176cefee06705ed1cab6346e6a
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.pdf
new file mode 100644
index 0000000..fd0bea5
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5
new file mode 100644
index 0000000..6a86c1f
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5
@@ -0,0 +1 @@
+3f6edcd0db01662d5cfbf69fc85c5088
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.pdf
new file mode 100644
index 0000000..07cc870
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands.tex b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands.tex
new file mode 100644
index 0000000..f6c7b5a
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands.tex
@@ -0,0 +1,74 @@
+\hypertarget{namespacepenify__hook_1_1commands_1_1hook__commands}{}\doxysection{penify\+\_\+hook.\+commands.\+hook\+\_\+commands Namespace Reference}
+\label{namespacepenify__hook_1_1commands_1_1hook__commands}\index{penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2}{install\+\_\+git\+\_\+hook}} (location, token)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d}{uninstall\+\_\+git\+\_\+hook}} (location)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands_ae82fd46e5a9219da1478b0476b8214b1}{HOOK\+\_\+\+FILENAME}} = \char`\"{}post-\/commit\char`\"{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands_a6a45aad71c8d32ce11a6dff8cee8bee7}{HOOK\+\_\+\+TEMPLATE}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2}\label{namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2}}
+\index{penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}!install\_git\_hook@{install\_git\_hook}}
+\index{install\_git\_hook@{install\_git\_hook}!penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}}
+\doxysubsubsection{\texorpdfstring{install\_git\_hook()}{install\_git\_hook()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+hook\+\_\+commands.\+install\+\_\+git\+\_\+hook (\begin{DoxyParamCaption}\item[{}]{location, }\item[{}]{token }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Install a post-commit Git hook that generates documentation for changed files.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d}\label{namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d}}
+\index{penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}!uninstall\_git\_hook@{uninstall\_git\_hook}}
+\index{uninstall\_git\_hook@{uninstall\_git\_hook}!penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}}
+\doxysubsubsection{\texorpdfstring{uninstall\_git\_hook()}{uninstall\_git\_hook()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+commands.\+hook\+\_\+commands.\+uninstall\+\_\+git\+\_\+hook (\begin{DoxyParamCaption}\item[{}]{location }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Uninstalls the post-commit hook from the specified location.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1hook__commands_ae82fd46e5a9219da1478b0476b8214b1}\label{namespacepenify__hook_1_1commands_1_1hook__commands_ae82fd46e5a9219da1478b0476b8214b1}}
+\index{penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}!HOOK\_FILENAME@{HOOK\_FILENAME}}
+\index{HOOK\_FILENAME@{HOOK\_FILENAME}!penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}}
+\doxysubsubsection{\texorpdfstring{HOOK\_FILENAME}{HOOK\_FILENAME}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+commands.\+hook\+\_\+commands.\+HOOK\+\_\+\+FILENAME = \char`\"{}post-\/commit\char`\"{}}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1commands_1_1hook__commands_a6a45aad71c8d32ce11a6dff8cee8bee7}\label{namespacepenify__hook_1_1commands_1_1hook__commands_a6a45aad71c8d32ce11a6dff8cee8bee7}}
+\index{penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}!HOOK\_TEMPLATE@{HOOK\_TEMPLATE}}
+\index{HOOK\_TEMPLATE@{HOOK\_TEMPLATE}!penify\_hook.commands.hook\_commands@{penify\_hook.commands.hook\_commands}}
+\doxysubsubsection{\texorpdfstring{HOOK\_TEMPLATE}{HOOK\_TEMPLATE}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+commands.\+hook\+\_\+commands.\+HOOK\+\_\+\+TEMPLATE}
+
+{\bfseries Initial value\+:}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 = \textcolor{stringliteral}{"{}"{}"{}\#!/bin/sh}}
+\DoxyCodeLine{2 \textcolor{stringliteral}{\# This is a post-\/commit hook generated by penify.}}
+\DoxyCodeLine{3 \textcolor{stringliteral}{\# Automatically generates documentation for changed files after each commit.}}
+\DoxyCodeLine{4 \textcolor{stringliteral}{}}
+\DoxyCodeLine{5 \textcolor{stringliteral}{penify docgen -\/gf \{git\_folder\_path\} -\/t \{token\}}}
+\DoxyCodeLine{6 \textcolor{stringliteral}{"{}"{}"{}}}
+
+\end{DoxyCode}
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5
new file mode 100644
index 0000000..e6f0d50
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5
@@ -0,0 +1 @@
+3e6ee611bb96eb0620f817dfec914d88
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.pdf
new file mode 100644
index 0000000..9d9bb04
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5
new file mode 100644
index 0000000..05be577
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5
@@ -0,0 +1 @@
+0efcaa8d06e456e09266dd9054ce82b8
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.pdf
new file mode 100644
index 0000000..4bfbc32
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1commit__analyzer.tex b/docs/latex/namespacepenify__hook_1_1commit__analyzer.tex
new file mode 100644
index 0000000..514f5c9
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1commit__analyzer.tex
@@ -0,0 +1,7 @@
+\hypertarget{namespacepenify__hook_1_1commit__analyzer}{}\doxysection{penify\+\_\+hook.\+commit\+\_\+analyzer Namespace Reference}
+\label{namespacepenify__hook_1_1commit__analyzer}\index{penify\_hook.commit\_analyzer@{penify\_hook.commit\_analyzer}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook}{Commit\+Doc\+Gen\+Hook}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacepenify__hook_1_1config__command.tex b/docs/latex/namespacepenify__hook_1_1config__command.tex
new file mode 100644
index 0000000..dbebaef
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1config__command.tex
@@ -0,0 +1,60 @@
+\hypertarget{namespacepenify__hook_1_1config__command}{}\doxysection{penify\+\_\+hook.\+config\+\_\+command Namespace Reference}
+\label{namespacepenify__hook_1_1config__command}\index{penify\_hook.config\_command@{penify\_hook.config\_command}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e}{setup\+\_\+config\+\_\+parser}} (parent\+\_\+parser)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde}{handle\+\_\+config}} (args)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde}\label{namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde}}
+\index{penify\_hook.config\_command@{penify\_hook.config\_command}!handle\_config@{handle\_config}}
+\index{handle\_config@{handle\_config}!penify\_hook.config\_command@{penify\_hook.config\_command}}
+\doxysubsubsection{\texorpdfstring{handle\_config()}{handle\_config()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+config\+\_\+command.\+handle\+\_\+config (\begin{DoxyParamCaption}\item[{}]{args }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Handle configuration settings based on the specified config type.
+
+This function processes different types of configurations such as LLM (Language
+Model) and JIRA. It saves configurations, sets up web-based configurations, and
+verifies JIRA connections. Depending on the `args.config_type`, it imports
+necessary modules, handles configuration saving or setup, and optionally
+verifies JIRA connectivity.
+
+Args:
+ args (argparse.Namespace): Command-line arguments containing the type of configuration to handle.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e}\label{namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e}}
+\index{penify\_hook.config\_command@{penify\_hook.config\_command}!setup\_config\_parser@{setup\_config\_parser}}
+\index{setup\_config\_parser@{setup\_config\_parser}!penify\_hook.config\_command@{penify\_hook.config\_command}}
+\doxysubsubsection{\texorpdfstring{setup\_config\_parser()}{setup\_config\_parser()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+config\+\_\+command.\+setup\+\_\+config\+\_\+parser (\begin{DoxyParamCaption}\item[{}]{parent\+\_\+parser }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Set up configuration parsers with subcommands for LLM and JIRA settings.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph}
+\end{center}
+\end{figure}
diff --git a/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5
new file mode 100644
index 0000000..432ac5d
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5
@@ -0,0 +1 @@
+7d218e1a67faf0c8150186b0bdc2af80
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.pdf
new file mode 100644
index 0000000..189fe79
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5
new file mode 100644
index 0000000..cb1b519
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5
@@ -0,0 +1 @@
+33adefb58b86eb054bfb05bc7210a23a
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.pdf
new file mode 100644
index 0000000..68637af
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5
new file mode 100644
index 0000000..692bb4e
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5
@@ -0,0 +1 @@
+5e2328eafad628ba4bcef3b5361c85ae
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.pdf
new file mode 100644
index 0000000..2b5dcb5
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1constants.tex b/docs/latex/namespacepenify__hook_1_1constants.tex
new file mode 100644
index 0000000..96b46a6
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1constants.tex
@@ -0,0 +1,24 @@
+\hypertarget{namespacepenify__hook_1_1constants}{}\doxysection{penify\+\_\+hook.\+constants Namespace Reference}
+\label{namespacepenify__hook_1_1constants}\index{penify\_hook.constants@{penify\_hook.constants}}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1constants_af198b5d1fc2f44657a2061aa324af3e0}{API\+\_\+\+URL}} = \textquotesingle{}http\+://localhost\+:8000/api\textquotesingle{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1constants_a316c5a606e4440fb8224c6544c3a15f0}{DASHBOARD\+\_\+\+URL}} = \char`\"{}https\+://dashboard.\+penify.\+dev/auth/localhost/login\char`\"{}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1constants_af198b5d1fc2f44657a2061aa324af3e0}\label{namespacepenify__hook_1_1constants_af198b5d1fc2f44657a2061aa324af3e0}}
+\index{penify\_hook.constants@{penify\_hook.constants}!API\_URL@{API\_URL}}
+\index{API\_URL@{API\_URL}!penify\_hook.constants@{penify\_hook.constants}}
+\doxysubsubsection{\texorpdfstring{API\_URL}{API\_URL}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+constants.\+API\+\_\+\+URL = \textquotesingle{}http\+://localhost\+:8000/api\textquotesingle{}}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1constants_a316c5a606e4440fb8224c6544c3a15f0}\label{namespacepenify__hook_1_1constants_a316c5a606e4440fb8224c6544c3a15f0}}
+\index{penify\_hook.constants@{penify\_hook.constants}!DASHBOARD\_URL@{DASHBOARD\_URL}}
+\index{DASHBOARD\_URL@{DASHBOARD\_URL}!penify\_hook.constants@{penify\_hook.constants}}
+\doxysubsubsection{\texorpdfstring{DASHBOARD\_URL}{DASHBOARD\_URL}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+constants.\+DASHBOARD\+\_\+\+URL = \char`\"{}https\+://dashboard.\+penify.\+dev/auth/localhost/login\char`\"{}}
+
diff --git a/docs/latex/namespacepenify__hook_1_1file__analyzer.tex b/docs/latex/namespacepenify__hook_1_1file__analyzer.tex
new file mode 100644
index 0000000..450369a
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1file__analyzer.tex
@@ -0,0 +1,21 @@
+\hypertarget{namespacepenify__hook_1_1file__analyzer}{}\doxysection{penify\+\_\+hook.\+file\+\_\+analyzer Namespace Reference}
+\label{namespacepenify__hook_1_1file__analyzer}\index{penify\_hook.file\_analyzer@{penify\_hook.file\_analyzer}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook}{File\+Analyzer\+Gen\+Hook}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1file__analyzer_af419a4965f079d58cac5a5281ddb1828}{logger}} = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1file__analyzer_af419a4965f079d58cac5a5281ddb1828}\label{namespacepenify__hook_1_1file__analyzer_af419a4965f079d58cac5a5281ddb1828}}
+\index{penify\_hook.file\_analyzer@{penify\_hook.file\_analyzer}!logger@{logger}}
+\index{logger@{logger}!penify\_hook.file\_analyzer@{penify\_hook.file\_analyzer}}
+\doxysubsubsection{\texorpdfstring{logger}{logger}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+file\+\_\+analyzer.\+logger = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)}
+
diff --git a/docs/latex/namespacepenify__hook_1_1folder__analyzer.tex b/docs/latex/namespacepenify__hook_1_1folder__analyzer.tex
new file mode 100644
index 0000000..527b99e
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1folder__analyzer.tex
@@ -0,0 +1,7 @@
+\hypertarget{namespacepenify__hook_1_1folder__analyzer}{}\doxysection{penify\+\_\+hook.\+folder\+\_\+analyzer Namespace Reference}
+\label{namespacepenify__hook_1_1folder__analyzer}\index{penify\_hook.folder\_analyzer@{penify\_hook.folder\_analyzer}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook}{Folder\+Analyzer\+Gen\+Hook}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacepenify__hook_1_1git__analyzer.tex b/docs/latex/namespacepenify__hook_1_1git__analyzer.tex
new file mode 100644
index 0000000..3cd151e
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1git__analyzer.tex
@@ -0,0 +1,21 @@
+\hypertarget{namespacepenify__hook_1_1git__analyzer}{}\doxysection{penify\+\_\+hook.\+git\+\_\+analyzer Namespace Reference}
+\label{namespacepenify__hook_1_1git__analyzer}\index{penify\_hook.git\_analyzer@{penify\_hook.git\_analyzer}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook}{Git\+Doc\+Gen\+Hook}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1git__analyzer_ac4ce143fdca789a79c66852c37d7363a}{logger}} = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1git__analyzer_ac4ce143fdca789a79c66852c37d7363a}\label{namespacepenify__hook_1_1git__analyzer_ac4ce143fdca789a79c66852c37d7363a}}
+\index{penify\_hook.git\_analyzer@{penify\_hook.git\_analyzer}!logger@{logger}}
+\index{logger@{logger}!penify\_hook.git\_analyzer@{penify\_hook.git\_analyzer}}
+\doxysubsubsection{\texorpdfstring{logger}{logger}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+git\+\_\+analyzer.\+logger = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)}
+
diff --git a/docs/latex/namespacepenify__hook_1_1jira__client.tex b/docs/latex/namespacepenify__hook_1_1jira__client.tex
new file mode 100644
index 0000000..372e126
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1jira__client.tex
@@ -0,0 +1,21 @@
+\hypertarget{namespacepenify__hook_1_1jira__client}{}\doxysection{penify\+\_\+hook.\+jira\+\_\+client Namespace Reference}
+\label{namespacepenify__hook_1_1jira__client}\index{penify\_hook.jira\_client@{penify\_hook.jira\_client}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1jira__client_1_1JiraClient}{Jira\+Client}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+bool \mbox{\hyperlink{namespacepenify__hook_1_1jira__client_a5593ea3415081eca1eea92e4c1ad1aa2}{JIRA\+\_\+\+AVAILABLE}} = True
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1jira__client_a5593ea3415081eca1eea92e4c1ad1aa2}\label{namespacepenify__hook_1_1jira__client_a5593ea3415081eca1eea92e4c1ad1aa2}}
+\index{penify\_hook.jira\_client@{penify\_hook.jira\_client}!JIRA\_AVAILABLE@{JIRA\_AVAILABLE}}
+\index{JIRA\_AVAILABLE@{JIRA\_AVAILABLE}!penify\_hook.jira\_client@{penify\_hook.jira\_client}}
+\doxysubsubsection{\texorpdfstring{JIRA\_AVAILABLE}{JIRA\_AVAILABLE}}
+{\footnotesize\ttfamily bool penify\+\_\+hook.\+jira\+\_\+client.\+JIRA\+\_\+\+AVAILABLE = True}
+
diff --git a/docs/latex/namespacepenify__hook_1_1llm__client.tex b/docs/latex/namespacepenify__hook_1_1llm__client.tex
new file mode 100644
index 0000000..6549539
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1llm__client.tex
@@ -0,0 +1,7 @@
+\hypertarget{namespacepenify__hook_1_1llm__client}{}\doxysection{penify\+\_\+hook.\+llm\+\_\+client Namespace Reference}
+\label{namespacepenify__hook_1_1llm__client}\index{penify\_hook.llm\_client@{penify\_hook.llm\_client}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1llm__client_1_1LLMClient}{LLMClient}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacepenify__hook_1_1login__command.tex b/docs/latex/namespacepenify__hook_1_1login__command.tex
new file mode 100644
index 0000000..12ae192
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1login__command.tex
@@ -0,0 +1,51 @@
+\hypertarget{namespacepenify__hook_1_1login__command}{}\doxysection{penify\+\_\+hook.\+login\+\_\+command Namespace Reference}
+\label{namespacepenify__hook_1_1login__command}\index{penify\_hook.login\_command@{penify\_hook.login\_command}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a}{setup\+\_\+login\+\_\+parser}} (parser)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd}{handle\+\_\+login}} (args)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd}\label{namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd}}
+\index{penify\_hook.login\_command@{penify\_hook.login\_command}!handle\_login@{handle\_login}}
+\index{handle\_login@{handle\_login}!penify\_hook.login\_command@{penify\_hook.login\_command}}
+\doxysubsubsection{\texorpdfstring{handle\_login()}{handle\_login()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+login\+\_\+command.\+handle\+\_\+login (\begin{DoxyParamCaption}\item[{}]{args }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Initiates a user login process using predefined constants and the `login`
+function.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a}\label{namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a}}
+\index{penify\_hook.login\_command@{penify\_hook.login\_command}!setup\_login\_parser@{setup\_login\_parser}}
+\index{setup\_login\_parser@{setup\_login\_parser}!penify\_hook.login\_command@{penify\_hook.login\_command}}
+\doxysubsubsection{\texorpdfstring{setup\_login\_parser()}{setup\_login\_parser()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+login\+\_\+command.\+setup\+\_\+login\+\_\+parser (\begin{DoxyParamCaption}\item[{}]{parser }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Set up command-line arguments for login.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph}
+\end{center}
+\end{figure}
diff --git a/docs/latex/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5
new file mode 100644
index 0000000..8a3aead
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5
@@ -0,0 +1 @@
+172992aa7cc5b424663feb2e0011348b
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.pdf
new file mode 100644
index 0000000..17c715e
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5
new file mode 100644
index 0000000..b1d9392
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5
@@ -0,0 +1 @@
+fb3dd54ef6847ed4a80947f9acdbaa6f
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.pdf
new file mode 100644
index 0000000..349a4d3
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5
new file mode 100644
index 0000000..5e4f8ba
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5
@@ -0,0 +1 @@
+9951577b3315cf72a98a67d67261f8ef
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.pdf
new file mode 100644
index 0000000..df1e953
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1main.tex b/docs/latex/namespacepenify__hook_1_1main.tex
new file mode 100644
index 0000000..d3ed9ae
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1main.tex
@@ -0,0 +1,41 @@
+\hypertarget{namespacepenify__hook_1_1main}{}\doxysection{penify\+\_\+hook.\+main Namespace Reference}
+\label{namespacepenify__hook_1_1main}\index{penify\_hook.main@{penify\_hook.main}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f}{main}} ()
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f}\label{namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f}}
+\index{penify\_hook.main@{penify\_hook.main}!main@{main}}
+\index{main@{main}!penify\_hook.main@{penify\_hook.main}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+main.\+main (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Main function to handle command-line interface (CLI) interactions with Penify
+services.
+
+This tool provides a command-line interface for generating smart commit
+messages, configuring local-LLM and JIRA, and generating code documentation. It
+supports basic commands that do not require login and advanced commands that
+require user authentication. The `--version` flag can be used to display the
+version information.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=211pt]{namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph}
+\end{center}
+\end{figure}
diff --git a/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5
new file mode 100644
index 0000000..fee8688
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5
@@ -0,0 +1 @@
+dfdacf5b7ffb2357adbfdfeb415b8317
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.pdf
new file mode 100644
index 0000000..0f38111
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5
new file mode 100644
index 0000000..e17084b
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5
@@ -0,0 +1 @@
+d98dd8d9a0dda1a3528354d99d382f7b
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.pdf
new file mode 100644
index 0000000..687f63a
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils.tex b/docs/latex/namespacepenify__hook_1_1ui__utils.tex
new file mode 100644
index 0000000..89c1478
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils.tex
@@ -0,0 +1,413 @@
+\hypertarget{namespacepenify__hook_1_1ui__utils}{}\doxysection{penify\+\_\+hook.\+ui\+\_\+utils Namespace Reference}
+\label{namespacepenify__hook_1_1ui__utils}\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6}{format\+\_\+info}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776}{format\+\_\+success}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2}{format\+\_\+warning}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e}{format\+\_\+error}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_adcb97fc26b405d2b9cdf5eb7aecc5452}{format\+\_\+highlight}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4}{format\+\_\+file\+\_\+path}} (file\+\_\+path)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44}{print\+\_\+info}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a}{print\+\_\+success}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa}{print\+\_\+warning}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f}{print\+\_\+error}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115}{print\+\_\+processing}} (file\+\_\+path)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c}{print\+\_\+status}} (status, message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c}{create\+\_\+progress\+\_\+bar}} (total, desc=\char`\"{}Processing\char`\"{}, unit=\char`\"{}item\char`\"{})
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef}{create\+\_\+stage\+\_\+progress\+\_\+bar}} (stages, desc=\char`\"{}Processing\char`\"{})
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d}{update\+\_\+stage}} (pbar, stage\+\_\+name)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_ab560cfade398ac1e0bd47befb52d9f71}{autoreset}}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a9fdcb180915696f5d217032a62c3857c}{INFO\+\_\+\+COLOR}} = Fore.\+CYAN
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a22c450c5e2b5394618ecf9b636560df4}{SUCCESS\+\_\+\+COLOR}} = Fore.\+GREEN
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a177bc9b44157844c999e0c1c2c6936ff}{WARNING\+\_\+\+COLOR}} = Fore.\+YELLOW
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a4ab4e61dfab7973c87bef59c6e1977fe}{ERROR\+\_\+\+COLOR}} = Fore.\+RED
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_aba01b8259f0d66cdc2b4a1b58f9736fc}{HIGHLIGHT\+\_\+\+COLOR}} = Fore.\+BLUE
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_aca0fcee81606857497520ae4290bc9f5}{NEUTRAL\+\_\+\+COLOR}} = Fore.\+WHITE
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a3c6fe4bd17c1a5fe76587225ae4beb3e}{SUCCESS\+\_\+\+SYMBOL}} = \char`\"{}✓\char`\"{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a6eaea98f1a8cbe16a181647da2fc0a16}{WARNING\+\_\+\+SYMBOL}} = \char`\"{}○\char`\"{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_aa564e1e1d016c8227d076542e74cecb0}{ERROR\+\_\+\+SYMBOL}} = \char`\"{}✗\char`\"{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a3b208e2750a38dd09467a73e4afd9756}{PROCESSING\+\_\+\+SYMBOL}} = \char`\"{}⟳\char`\"{}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+\begin{DoxyVerb}UI utilities for Penify CLI.
+
+This module provides utility functions for consistent UI formatting,
+colored output, and progress indicators across the Penify CLI application.
+\end{DoxyVerb}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c}\label{namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!create\_progress\_bar@{create\_progress\_bar}}
+\index{create\_progress\_bar@{create\_progress\_bar}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{create\_progress\_bar()}{create\_progress\_bar()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+create\+\_\+progress\+\_\+bar (\begin{DoxyParamCaption}\item[{}]{total, }\item[{}]{desc = {\ttfamily \char`\"{}Processing\char`\"{}}, }\item[{}]{unit = {\ttfamily \char`\"{}item\char`\"{}} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Create a tqdm progress bar with consistent styling.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef}\label{namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!create\_stage\_progress\_bar@{create\_stage\_progress\_bar}}
+\index{create\_stage\_progress\_bar@{create\_stage\_progress\_bar}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{create\_stage\_progress\_bar()}{create\_stage\_progress\_bar()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+create\+\_\+stage\+\_\+progress\+\_\+bar (\begin{DoxyParamCaption}\item[{}]{stages, }\item[{}]{desc = {\ttfamily \char`\"{}Processing\char`\"{}} }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Create a tqdm progress bar for processing stages with consistent styling.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e}\label{namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!format\_error@{format\_error}}
+\index{format\_error@{format\_error}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{format\_error()}{format\_error()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+error (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Format an error message with the specified error color.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4}\label{namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!format\_file\_path@{format\_file\_path}}
+\index{format\_file\_path@{format\_file\_path}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{format\_file\_path()}{format\_file\_path()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+file\+\_\+path (\begin{DoxyParamCaption}\item[{}]{file\+\_\+path }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Format a file path with a warning color.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_adcb97fc26b405d2b9cdf5eb7aecc5452}\label{namespacepenify__hook_1_1ui__utils_adcb97fc26b405d2b9cdf5eb7aecc5452}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!format\_highlight@{format\_highlight}}
+\index{format\_highlight@{format\_highlight}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{format\_highlight()}{format\_highlight()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+highlight (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Format a highlighted message with appropriate color.\end{DoxyVerb}
+ \mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6}\label{namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!format\_info@{format\_info}}
+\index{format\_info@{format\_info}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{format\_info()}{format\_info()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+info (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Format an informational message with appropriate color.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776}\label{namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!format\_success@{format\_success}}
+\index{format\_success@{format\_success}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{format\_success()}{format\_success()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+success (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Formats a success message with green color and reset style.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2}\label{namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!format\_warning@{format\_warning}}
+\index{format\_warning@{format\_warning}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{format\_warning()}{format\_warning()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+warning (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Format a warning message with appropriate color.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f}\label{namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!print\_error@{print\_error}}
+\index{print\_error@{print\_error}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{print\_error()}{print\_error()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+error (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Print an error message with appropriate formatting.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44}\label{namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!print\_info@{print\_info}}
+\index{print\_info@{print\_info}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{print\_info()}{print\_info()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+info (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Prints an informational message with formatting.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115}\label{namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!print\_processing@{print\_processing}}
+\index{print\_processing@{print\_processing}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{print\_processing()}{print\_processing()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+processing (\begin{DoxyParamCaption}\item[{}]{file\+\_\+path }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Print a processing message for a specified file.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c}\label{namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!print\_status@{print\_status}}
+\index{print\_status@{print\_status}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{print\_status()}{print\_status()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+status (\begin{DoxyParamCaption}\item[{}]{status, }\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Print a status message with an appropriate symbol.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a}\label{namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!print\_success@{print\_success}}
+\index{print\_success@{print\_success}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{print\_success()}{print\_success()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+success (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Prints a formatted success message.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa}\label{namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!print\_warning@{print\_warning}}
+\index{print\_warning@{print\_warning}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{print\_warning()}{print\_warning()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+warning (\begin{DoxyParamCaption}\item[{}]{message }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Prints a warning message with formatted output.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d}\label{namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!update\_stage@{update\_stage}}
+\index{update\_stage@{update\_stage}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{update\_stage()}{update\_stage()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+ui\+\_\+utils.\+update\+\_\+stage (\begin{DoxyParamCaption}\item[{}]{pbar, }\item[{}]{stage\+\_\+name }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Update the progress bar with a new stage name.\end{DoxyVerb}
+ Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_ab560cfade398ac1e0bd47befb52d9f71}\label{namespacepenify__hook_1_1ui__utils_ab560cfade398ac1e0bd47befb52d9f71}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!autoreset@{autoreset}}
+\index{autoreset@{autoreset}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{autoreset}{autoreset}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+ui\+\_\+utils.\+autoreset}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a4ab4e61dfab7973c87bef59c6e1977fe}\label{namespacepenify__hook_1_1ui__utils_a4ab4e61dfab7973c87bef59c6e1977fe}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!ERROR\_COLOR@{ERROR\_COLOR}}
+\index{ERROR\_COLOR@{ERROR\_COLOR}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{ERROR\_COLOR}{ERROR\_COLOR}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+ui\+\_\+utils.\+ERROR\+\_\+\+COLOR = Fore.\+RED}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_aa564e1e1d016c8227d076542e74cecb0}\label{namespacepenify__hook_1_1ui__utils_aa564e1e1d016c8227d076542e74cecb0}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!ERROR\_SYMBOL@{ERROR\_SYMBOL}}
+\index{ERROR\_SYMBOL@{ERROR\_SYMBOL}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{ERROR\_SYMBOL}{ERROR\_SYMBOL}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+ui\+\_\+utils.\+ERROR\+\_\+\+SYMBOL = \char`\"{}✗\char`\"{}}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_aba01b8259f0d66cdc2b4a1b58f9736fc}\label{namespacepenify__hook_1_1ui__utils_aba01b8259f0d66cdc2b4a1b58f9736fc}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!HIGHLIGHT\_COLOR@{HIGHLIGHT\_COLOR}}
+\index{HIGHLIGHT\_COLOR@{HIGHLIGHT\_COLOR}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{HIGHLIGHT\_COLOR}{HIGHLIGHT\_COLOR}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+ui\+\_\+utils.\+HIGHLIGHT\+\_\+\+COLOR = Fore.\+BLUE}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a9fdcb180915696f5d217032a62c3857c}\label{namespacepenify__hook_1_1ui__utils_a9fdcb180915696f5d217032a62c3857c}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!INFO\_COLOR@{INFO\_COLOR}}
+\index{INFO\_COLOR@{INFO\_COLOR}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{INFO\_COLOR}{INFO\_COLOR}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+ui\+\_\+utils.\+INFO\+\_\+\+COLOR = Fore.\+CYAN}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_aca0fcee81606857497520ae4290bc9f5}\label{namespacepenify__hook_1_1ui__utils_aca0fcee81606857497520ae4290bc9f5}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!NEUTRAL\_COLOR@{NEUTRAL\_COLOR}}
+\index{NEUTRAL\_COLOR@{NEUTRAL\_COLOR}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{NEUTRAL\_COLOR}{NEUTRAL\_COLOR}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+ui\+\_\+utils.\+NEUTRAL\+\_\+\+COLOR = Fore.\+WHITE}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a3b208e2750a38dd09467a73e4afd9756}\label{namespacepenify__hook_1_1ui__utils_a3b208e2750a38dd09467a73e4afd9756}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!PROCESSING\_SYMBOL@{PROCESSING\_SYMBOL}}
+\index{PROCESSING\_SYMBOL@{PROCESSING\_SYMBOL}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{PROCESSING\_SYMBOL}{PROCESSING\_SYMBOL}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+ui\+\_\+utils.\+PROCESSING\+\_\+\+SYMBOL = \char`\"{}⟳\char`\"{}}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a22c450c5e2b5394618ecf9b636560df4}\label{namespacepenify__hook_1_1ui__utils_a22c450c5e2b5394618ecf9b636560df4}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!SUCCESS\_COLOR@{SUCCESS\_COLOR}}
+\index{SUCCESS\_COLOR@{SUCCESS\_COLOR}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{SUCCESS\_COLOR}{SUCCESS\_COLOR}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+ui\+\_\+utils.\+SUCCESS\+\_\+\+COLOR = Fore.\+GREEN}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a3c6fe4bd17c1a5fe76587225ae4beb3e}\label{namespacepenify__hook_1_1ui__utils_a3c6fe4bd17c1a5fe76587225ae4beb3e}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!SUCCESS\_SYMBOL@{SUCCESS\_SYMBOL}}
+\index{SUCCESS\_SYMBOL@{SUCCESS\_SYMBOL}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{SUCCESS\_SYMBOL}{SUCCESS\_SYMBOL}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+ui\+\_\+utils.\+SUCCESS\+\_\+\+SYMBOL = \char`\"{}✓\char`\"{}}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a177bc9b44157844c999e0c1c2c6936ff}\label{namespacepenify__hook_1_1ui__utils_a177bc9b44157844c999e0c1c2c6936ff}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!WARNING\_COLOR@{WARNING\_COLOR}}
+\index{WARNING\_COLOR@{WARNING\_COLOR}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{WARNING\_COLOR}{WARNING\_COLOR}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+ui\+\_\+utils.\+WARNING\+\_\+\+COLOR = Fore.\+YELLOW}
+
+\mbox{\Hypertarget{namespacepenify__hook_1_1ui__utils_a6eaea98f1a8cbe16a181647da2fc0a16}\label{namespacepenify__hook_1_1ui__utils_a6eaea98f1a8cbe16a181647da2fc0a16}}
+\index{penify\_hook.ui\_utils@{penify\_hook.ui\_utils}!WARNING\_SYMBOL@{WARNING\_SYMBOL}}
+\index{WARNING\_SYMBOL@{WARNING\_SYMBOL}!penify\_hook.ui\_utils@{penify\_hook.ui\_utils}}
+\doxysubsubsection{\texorpdfstring{WARNING\_SYMBOL}{WARNING\_SYMBOL}}
+{\footnotesize\ttfamily string penify\+\_\+hook.\+ui\+\_\+utils.\+WARNING\+\_\+\+SYMBOL = \char`\"{}○\char`\"{}}
+
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5
new file mode 100644
index 0000000..af56411
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5
@@ -0,0 +1 @@
+e663fa2eb615359cda55bc721e1ea8f6
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.pdf
new file mode 100644
index 0000000..ed469b7
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5
new file mode 100644
index 0000000..d1af907
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5
@@ -0,0 +1 @@
+19fce3e6997e2ef0633b1f73b2c61e53
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.pdf
new file mode 100644
index 0000000..5893034
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5
new file mode 100644
index 0000000..01a1c99
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5
@@ -0,0 +1 @@
+300c1a1f6c4178fe5c6ea33451e858a9
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.pdf
new file mode 100644
index 0000000..989df1f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5
new file mode 100644
index 0000000..07d748c
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5
@@ -0,0 +1 @@
+70be5c25b8f76c9cbe722a4c845dacb4
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.pdf
new file mode 100644
index 0000000..eda9efe
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5
new file mode 100644
index 0000000..82efec0
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5
@@ -0,0 +1 @@
+ca11cb4a1d1674ec6bcd140e0e92426c
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.pdf
new file mode 100644
index 0000000..f933757
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5
new file mode 100644
index 0000000..8ca38f6
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5
@@ -0,0 +1 @@
+9c0df5b451b1b193b987fcaca416a372
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.pdf
new file mode 100644
index 0000000..932c424
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5
new file mode 100644
index 0000000..1f5f074
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5
@@ -0,0 +1 @@
+34b1281180eb32df71f54579464a2fa1
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.pdf
new file mode 100644
index 0000000..67d7084
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5
new file mode 100644
index 0000000..0ad3229
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5
@@ -0,0 +1 @@
+b0378d8fbf6334d6c77fb949c6b544c7
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.pdf
new file mode 100644
index 0000000..854a72c
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5
new file mode 100644
index 0000000..9899454
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5
@@ -0,0 +1 @@
+fc34358015e84dbc051a8b0a2b054254
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.pdf
new file mode 100644
index 0000000..ab28453
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5
new file mode 100644
index 0000000..7ef5c64
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5
@@ -0,0 +1 @@
+3fe1856d72a9cdb24dec0a23e208fd90
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.pdf
new file mode 100644
index 0000000..89a7554
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5
new file mode 100644
index 0000000..2db7a9e
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5
@@ -0,0 +1 @@
+491384c48920332a4dde903091ffc468
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.pdf
new file mode 100644
index 0000000..2cde8c3
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5
new file mode 100644
index 0000000..d287e6e
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5
@@ -0,0 +1 @@
+4d4a093b7aec08ccfb2e3c2fa9e02f93
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.pdf
new file mode 100644
index 0000000..e988e1f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5
new file mode 100644
index 0000000..b8fd6fd
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5
@@ -0,0 +1 @@
+c07668a21f84a502971e51c3ec052a1d
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.pdf
new file mode 100644
index 0000000..5397a4f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5
new file mode 100644
index 0000000..9bac1c3
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5
@@ -0,0 +1 @@
+a63adb6c32baaadc7371e59f88486925
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.pdf
new file mode 100644
index 0000000..b0ede8f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5
new file mode 100644
index 0000000..72350e1
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5
@@ -0,0 +1 @@
+5e886512bfa3b5ecab8ffd1d27aa317e
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.pdf
new file mode 100644
index 0000000..1afe42a
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5
new file mode 100644
index 0000000..464639d
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5
@@ -0,0 +1 @@
+e37788ed8581894cb82e64ff5d26478b
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.pdf
new file mode 100644
index 0000000..8f23c9f
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5
new file mode 100644
index 0000000..9552aa1
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5
@@ -0,0 +1 @@
+6390b9f91feee996985fec5b07a8d662
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.pdf
new file mode 100644
index 0000000..099d9fb
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5
new file mode 100644
index 0000000..b327300
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5
@@ -0,0 +1 @@
+13ad7e031e0f0b0482a3fe947abea8ed
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.pdf
new file mode 100644
index 0000000..39a3c40
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5
new file mode 100644
index 0000000..c5b1891
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5
@@ -0,0 +1 @@
+b526078e85ee560b544ee7131cc9773c
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.pdf
new file mode 100644
index 0000000..353af39
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5
new file mode 100644
index 0000000..7ec52bf
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5
@@ -0,0 +1 @@
+970262b12fb8d1d44ba27eecb2c5fb46
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.pdf
new file mode 100644
index 0000000..1059921
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5
new file mode 100644
index 0000000..ceef957
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5
@@ -0,0 +1 @@
+52e65524883c80f70b6b5e7f4f8e7d0b
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.pdf
new file mode 100644
index 0000000..c6ceb05
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1utils.tex b/docs/latex/namespacepenify__hook_1_1utils.tex
new file mode 100644
index 0000000..026440a
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1utils.tex
@@ -0,0 +1,87 @@
+\hypertarget{namespacepenify__hook_1_1utils}{}\doxysection{penify\+\_\+hook.\+utils Namespace Reference}
+\label{namespacepenify__hook_1_1utils}\index{penify\_hook.utils@{penify\_hook.utils}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1utils_1_1GitRepoNotFoundError}{Git\+Repo\+Not\+Found\+Error}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1utils_ae236f3c4c8bf5dcddbb92b4c2065eea3}{get\+\_\+repo\+\_\+details}} (Repo repo)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f}{recursive\+\_\+search\+\_\+git\+\_\+folder}} (folder\+\_\+path)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1utils_a4ec5335a4026c22a34a3a8ccf665a5f2}{find\+\_\+git\+\_\+parent}} (path)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1utils_a0c0c1ed6b197038085c94a90ceedfb01}{logger}} = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1utils_a4ec5335a4026c22a34a3a8ccf665a5f2}\label{namespacepenify__hook_1_1utils_a4ec5335a4026c22a34a3a8ccf665a5f2}}
+\index{penify\_hook.utils@{penify\_hook.utils}!find\_git\_parent@{find\_git\_parent}}
+\index{find\_git\_parent@{find\_git\_parent}!penify\_hook.utils@{penify\_hook.utils}}
+\doxysubsubsection{\texorpdfstring{find\_git\_parent()}{find\_git\_parent()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+utils.\+find\+\_\+git\+\_\+parent (\begin{DoxyParamCaption}\item[{}]{path }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Traverse up from the given path to find the nearest directory containing a .git
+subdirectory.\end{DoxyVerb}
+ \mbox{\Hypertarget{namespacepenify__hook_1_1utils_ae236f3c4c8bf5dcddbb92b4c2065eea3}\label{namespacepenify__hook_1_1utils_ae236f3c4c8bf5dcddbb92b4c2065eea3}}
+\index{penify\_hook.utils@{penify\_hook.utils}!get\_repo\_details@{get\_repo\_details}}
+\index{get\_repo\_details@{get\_repo\_details}!penify\_hook.utils@{penify\_hook.utils}}
+\doxysubsubsection{\texorpdfstring{get\_repo\_details()}{get\_repo\_details()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+utils.\+get\+\_\+repo\+\_\+details (\begin{DoxyParamCaption}\item[{Repo}]{repo }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Determine the details of a repository including its remote URL, hosting
+service, organization name, and repository name.
+
+This function extracts the remote URL from the given Git repository object and
+determines the hosting service (e.g., GitHub, Azure DevOps, Bitbucket, GitLab).
+It then parses the URL to extract the organization name and repository name. If
+the URL does not match any known hosting service pattern, it sets the hosting
+service as "Unknown". The function handles exceptions that may occur during
+this process and logs an error message if needed.
+
+Args:
+ repo (Repo): A GitPython Repo object representing the local git repository.
+
+Returns:
+ dict: A dictionary containing the organization name, repository name, and hosting
+ service.
+\end{DoxyVerb}
+ \mbox{\Hypertarget{namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f}\label{namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f}}
+\index{penify\_hook.utils@{penify\_hook.utils}!recursive\_search\_git\_folder@{recursive\_search\_git\_folder}}
+\index{recursive\_search\_git\_folder@{recursive\_search\_git\_folder}!penify\_hook.utils@{penify\_hook.utils}}
+\doxysubsubsection{\texorpdfstring{recursive\_search\_git\_folder()}{recursive\_search\_git\_folder()}}
+{\footnotesize\ttfamily def penify\+\_\+hook.\+utils.\+recursive\+\_\+search\+\_\+git\+\_\+folder (\begin{DoxyParamCaption}\item[{}]{folder\+\_\+path }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Recursively searches for a .git folder starting from the given directory.\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=228pt]{namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph}
+\end{center}
+\end{figure}
+Here is the caller graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph}
+\end{center}
+\end{figure}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacepenify__hook_1_1utils_a0c0c1ed6b197038085c94a90ceedfb01}\label{namespacepenify__hook_1_1utils_a0c0c1ed6b197038085c94a90ceedfb01}}
+\index{penify\_hook.utils@{penify\_hook.utils}!logger@{logger}}
+\index{logger@{logger}!penify\_hook.utils@{penify\_hook.utils}}
+\doxysubsubsection{\texorpdfstring{logger}{logger}}
+{\footnotesize\ttfamily penify\+\_\+hook.\+utils.\+logger = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)}
+
diff --git a/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 b/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5
new file mode 100644
index 0000000..78bbf32
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5
@@ -0,0 +1 @@
+b51fc064bcca3ad23807f3addc7355aa
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.pdf b/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.pdf
new file mode 100644
index 0000000..1ce9f23
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.pdf differ
diff --git a/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 b/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5
new file mode 100644
index 0000000..f17a45b
--- /dev/null
+++ b/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5
@@ -0,0 +1 @@
+253fafa9cbc0e256de834d2b70dee073
\ No newline at end of file
diff --git a/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.pdf b/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.pdf
new file mode 100644
index 0000000..17eb5f6
Binary files /dev/null and b/docs/latex/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.pdf differ
diff --git a/docs/latex/namespaces.tex b/docs/latex/namespaces.tex
new file mode 100644
index 0000000..a46ac4c
--- /dev/null
+++ b/docs/latex/namespaces.tex
@@ -0,0 +1,31 @@
+\doxysection{Namespace List}
+Here is a list of all namespaces with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}} }{\pageref{namespacepenify__hook}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1api__client}{penify\+\_\+hook.\+api\+\_\+client}} }{\pageref{namespacepenify__hook_1_1api__client}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1base__analyzer}{penify\+\_\+hook.\+base\+\_\+analyzer}} }{\pageref{namespacepenify__hook_1_1base__analyzer}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1commands}{penify\+\_\+hook.\+commands}} }{\pageref{namespacepenify__hook_1_1commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1auth__commands}{penify\+\_\+hook.\+commands.\+auth\+\_\+commands}} }{\pageref{namespacepenify__hook_1_1commands_1_1auth__commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1commit__commands}{penify\+\_\+hook.\+commands.\+commit\+\_\+commands}} }{\pageref{namespacepenify__hook_1_1commands_1_1commit__commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1config__commands}{penify\+\_\+hook.\+commands.\+config\+\_\+commands}} }{\pageref{namespacepenify__hook_1_1commands_1_1config__commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1doc__commands}{penify\+\_\+hook.\+commands.\+doc\+\_\+commands}} }{\pageref{namespacepenify__hook_1_1commands_1_1doc__commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1commands_1_1hook__commands}{penify\+\_\+hook.\+commands.\+hook\+\_\+commands}} }{\pageref{namespacepenify__hook_1_1commands_1_1hook__commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1commit__analyzer}{penify\+\_\+hook.\+commit\+\_\+analyzer}} }{\pageref{namespacepenify__hook_1_1commit__analyzer}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1config__command}{penify\+\_\+hook.\+config\+\_\+command}} }{\pageref{namespacepenify__hook_1_1config__command}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1constants}{penify\+\_\+hook.\+constants}} }{\pageref{namespacepenify__hook_1_1constants}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1file__analyzer}{penify\+\_\+hook.\+file\+\_\+analyzer}} }{\pageref{namespacepenify__hook_1_1file__analyzer}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1folder__analyzer}{penify\+\_\+hook.\+folder\+\_\+analyzer}} }{\pageref{namespacepenify__hook_1_1folder__analyzer}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1git__analyzer}{penify\+\_\+hook.\+git\+\_\+analyzer}} }{\pageref{namespacepenify__hook_1_1git__analyzer}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1jira__client}{penify\+\_\+hook.\+jira\+\_\+client}} }{\pageref{namespacepenify__hook_1_1jira__client}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1llm__client}{penify\+\_\+hook.\+llm\+\_\+client}} }{\pageref{namespacepenify__hook_1_1llm__client}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1login__command}{penify\+\_\+hook.\+login\+\_\+command}} }{\pageref{namespacepenify__hook_1_1login__command}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1main}{penify\+\_\+hook.\+main}} }{\pageref{namespacepenify__hook_1_1main}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils}{penify\+\_\+hook.\+ui\+\_\+utils}} }{\pageref{namespacepenify__hook_1_1ui__utils}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacepenify__hook_1_1utils}{penify\+\_\+hook.\+utils}} }{\pageref{namespacepenify__hook_1_1utils}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacesetup}{setup}} }{\pageref{namespacesetup}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacetests}{tests}} }{\pageref{namespacetests}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacetests_1_1conftest}{tests.\+conftest}} }{\pageref{namespacetests_1_1conftest}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacetests_1_1test__commit__commands}{tests.\+test\+\_\+commit\+\_\+commands}} }{\pageref{namespacetests_1_1test__commit__commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacetests_1_1test__config__commands}{tests.\+test\+\_\+config\+\_\+commands}} }{\pageref{namespacetests_1_1test__config__commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacetests_1_1test__doc__commands}{tests.\+test\+\_\+doc\+\_\+commands}} }{\pageref{namespacetests_1_1test__doc__commands}}{}
+\item\contentsline{section}{\mbox{\hyperlink{namespacetests_1_1test__web__config}{tests.\+test\+\_\+web\+\_\+config}} }{\pageref{namespacetests_1_1test__web__config}}{}
+\end{DoxyCompactList}
diff --git a/docs/latex/namespacesetup.tex b/docs/latex/namespacesetup.tex
new file mode 100644
index 0000000..e6ce9dc
--- /dev/null
+++ b/docs/latex/namespacesetup.tex
@@ -0,0 +1,112 @@
+\hypertarget{namespacesetup}{}\doxysection{setup Namespace Reference}
+\label{namespacesetup}\index{setup@{setup}}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacesetup_ab3a7a0638d76a01367c5bc3cc699447f}{name}}
+\item
+\mbox{\hyperlink{namespacesetup_a2aa722b36a933088812b50ea79b97a5c}{version}}
+\item
+\mbox{\hyperlink{namespacesetup_aff2375a361fd5865c77bd9aa093be747}{packages}}
+\item
+\mbox{\hyperlink{namespacesetup_abead4f26b530856f858f0d44c7cf2588}{install\+\_\+requires}}
+\item
+\mbox{\hyperlink{namespacesetup_ada7058afc98897f073d3f3b8b9157059}{entry\+\_\+points}}
+\item
+\mbox{\hyperlink{namespacesetup_a3a57a4772d418a06835249cbade0d86a}{author}}
+\item
+\mbox{\hyperlink{namespacesetup_a5b08034343aa2be607722a8b315f3625}{author\+\_\+email}}
+\item
+\mbox{\hyperlink{namespacesetup_aedf461ec52a946bda975938ba0b93ec0}{description}}
+\item
+\mbox{\hyperlink{namespacesetup_a4cda9dbfb952875376a0749fe08a5bde}{long\+\_\+description}}
+\item
+\mbox{\hyperlink{namespacesetup_a3796ea10c998699d07d391414ff5d720}{long\+\_\+description\+\_\+content\+\_\+type}}
+\item
+\mbox{\hyperlink{namespacesetup_afc13124aa5c0124e84e1d965e3f4b0fb}{url}}
+\item
+\mbox{\hyperlink{namespacesetup_abe96a9c38c1c61f9f0fdb002c482f785}{classifiers}}
+\item
+\mbox{\hyperlink{namespacesetup_aa7ca7bc9391b217e81efeb03689d8dbf}{python\+\_\+requires}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacesetup_a3a57a4772d418a06835249cbade0d86a}\label{namespacesetup_a3a57a4772d418a06835249cbade0d86a}}
+\index{setup@{setup}!author@{author}}
+\index{author@{author}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{author}{author}}
+{\footnotesize\ttfamily setup.\+author}
+
+\mbox{\Hypertarget{namespacesetup_a5b08034343aa2be607722a8b315f3625}\label{namespacesetup_a5b08034343aa2be607722a8b315f3625}}
+\index{setup@{setup}!author\_email@{author\_email}}
+\index{author\_email@{author\_email}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{author\_email}{author\_email}}
+{\footnotesize\ttfamily setup.\+author\+\_\+email}
+
+\mbox{\Hypertarget{namespacesetup_abe96a9c38c1c61f9f0fdb002c482f785}\label{namespacesetup_abe96a9c38c1c61f9f0fdb002c482f785}}
+\index{setup@{setup}!classifiers@{classifiers}}
+\index{classifiers@{classifiers}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{classifiers}{classifiers}}
+{\footnotesize\ttfamily setup.\+classifiers}
+
+\mbox{\Hypertarget{namespacesetup_aedf461ec52a946bda975938ba0b93ec0}\label{namespacesetup_aedf461ec52a946bda975938ba0b93ec0}}
+\index{setup@{setup}!description@{description}}
+\index{description@{description}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{description}{description}}
+{\footnotesize\ttfamily setup.\+description}
+
+\mbox{\Hypertarget{namespacesetup_ada7058afc98897f073d3f3b8b9157059}\label{namespacesetup_ada7058afc98897f073d3f3b8b9157059}}
+\index{setup@{setup}!entry\_points@{entry\_points}}
+\index{entry\_points@{entry\_points}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{entry\_points}{entry\_points}}
+{\footnotesize\ttfamily setup.\+entry\+\_\+points}
+
+\mbox{\Hypertarget{namespacesetup_abead4f26b530856f858f0d44c7cf2588}\label{namespacesetup_abead4f26b530856f858f0d44c7cf2588}}
+\index{setup@{setup}!install\_requires@{install\_requires}}
+\index{install\_requires@{install\_requires}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{install\_requires}{install\_requires}}
+{\footnotesize\ttfamily setup.\+install\+\_\+requires}
+
+\mbox{\Hypertarget{namespacesetup_a4cda9dbfb952875376a0749fe08a5bde}\label{namespacesetup_a4cda9dbfb952875376a0749fe08a5bde}}
+\index{setup@{setup}!long\_description@{long\_description}}
+\index{long\_description@{long\_description}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{long\_description}{long\_description}}
+{\footnotesize\ttfamily setup.\+long\+\_\+description}
+
+\mbox{\Hypertarget{namespacesetup_a3796ea10c998699d07d391414ff5d720}\label{namespacesetup_a3796ea10c998699d07d391414ff5d720}}
+\index{setup@{setup}!long\_description\_content\_type@{long\_description\_content\_type}}
+\index{long\_description\_content\_type@{long\_description\_content\_type}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{long\_description\_content\_type}{long\_description\_content\_type}}
+{\footnotesize\ttfamily setup.\+long\+\_\+description\+\_\+content\+\_\+type}
+
+\mbox{\Hypertarget{namespacesetup_ab3a7a0638d76a01367c5bc3cc699447f}\label{namespacesetup_ab3a7a0638d76a01367c5bc3cc699447f}}
+\index{setup@{setup}!name@{name}}
+\index{name@{name}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{name}{name}}
+{\footnotesize\ttfamily setup.\+name}
+
+\mbox{\Hypertarget{namespacesetup_aff2375a361fd5865c77bd9aa093be747}\label{namespacesetup_aff2375a361fd5865c77bd9aa093be747}}
+\index{setup@{setup}!packages@{packages}}
+\index{packages@{packages}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{packages}{packages}}
+{\footnotesize\ttfamily setup.\+packages}
+
+\mbox{\Hypertarget{namespacesetup_aa7ca7bc9391b217e81efeb03689d8dbf}\label{namespacesetup_aa7ca7bc9391b217e81efeb03689d8dbf}}
+\index{setup@{setup}!python\_requires@{python\_requires}}
+\index{python\_requires@{python\_requires}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{python\_requires}{python\_requires}}
+{\footnotesize\ttfamily setup.\+python\+\_\+requires}
+
+\mbox{\Hypertarget{namespacesetup_afc13124aa5c0124e84e1d965e3f4b0fb}\label{namespacesetup_afc13124aa5c0124e84e1d965e3f4b0fb}}
+\index{setup@{setup}!url@{url}}
+\index{url@{url}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{url}{url}}
+{\footnotesize\ttfamily setup.\+url}
+
+\mbox{\Hypertarget{namespacesetup_a2aa722b36a933088812b50ea79b97a5c}\label{namespacesetup_a2aa722b36a933088812b50ea79b97a5c}}
+\index{setup@{setup}!version@{version}}
+\index{version@{version}!setup@{setup}}
+\doxysubsubsection{\texorpdfstring{version}{version}}
+{\footnotesize\ttfamily setup.\+version}
+
diff --git a/docs/latex/namespacetests.tex b/docs/latex/namespacetests.tex
new file mode 100644
index 0000000..a22c9d9
--- /dev/null
+++ b/docs/latex/namespacetests.tex
@@ -0,0 +1,15 @@
+\hypertarget{namespacetests}{}\doxysection{tests Namespace Reference}
+\label{namespacetests}\index{tests@{tests}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1conftest}{conftest}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1test__commit__commands}{test\+\_\+commit\+\_\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1test__config__commands}{test\+\_\+config\+\_\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1test__doc__commands}{test\+\_\+doc\+\_\+commands}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1test__web__config}{test\+\_\+web\+\_\+config}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacetests_1_1conftest.tex b/docs/latex/namespacetests_1_1conftest.tex
new file mode 100644
index 0000000..12ab1d5
--- /dev/null
+++ b/docs/latex/namespacetests_1_1conftest.tex
@@ -0,0 +1,2 @@
+\hypertarget{namespacetests_1_1conftest}{}\doxysection{tests.\+conftest Namespace Reference}
+\label{namespacetests_1_1conftest}\index{tests.conftest@{tests.conftest}}
diff --git a/docs/latex/namespacetests_1_1test__commit__commands.tex b/docs/latex/namespacetests_1_1test__commit__commands.tex
new file mode 100644
index 0000000..32b7e14
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__commit__commands.tex
@@ -0,0 +1,7 @@
+\hypertarget{namespacetests_1_1test__commit__commands}{}\doxysection{tests.\+test\+\_\+commit\+\_\+commands Namespace Reference}
+\label{namespacetests_1_1test__commit__commands}\index{tests.test\_commit\_commands@{tests.test\_commit\_commands}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands}{Test\+Commit\+Commands}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacetests_1_1test__config__commands.tex b/docs/latex/namespacetests_1_1test__config__commands.tex
new file mode 100644
index 0000000..52a1b4c
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__config__commands.tex
@@ -0,0 +1,7 @@
+\hypertarget{namespacetests_1_1test__config__commands}{}\doxysection{tests.\+test\+\_\+config\+\_\+commands Namespace Reference}
+\label{namespacetests_1_1test__config__commands}\index{tests.test\_config\_commands@{tests.test\_config\_commands}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands}{Test\+Config\+Commands}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/namespacetests_1_1test__doc__commands.tex b/docs/latex/namespacetests_1_1test__doc__commands.tex
new file mode 100644
index 0000000..70935c2
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands.tex
@@ -0,0 +1,323 @@
+\hypertarget{namespacetests_1_1test__doc__commands}{}\doxysection{tests.\+test\+\_\+doc\+\_\+commands Namespace Reference}
+\label{namespacetests_1_1test__doc__commands}\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8}{test\+\_\+generate\+\_\+doc\+\_\+no\+\_\+location}} (mock\+\_\+getcwd, mock\+\_\+api\+\_\+client, mock\+\_\+folder\+\_\+analyzer, mock\+\_\+file\+\_\+analyzer, mock\+\_\+git\+\_\+analyzer)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45}{test\+\_\+generate\+\_\+doc\+\_\+file\+\_\+location}} (mock\+\_\+api\+\_\+client, mock\+\_\+folder\+\_\+analyzer, mock\+\_\+file\+\_\+analyzer, mock\+\_\+git\+\_\+analyzer)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186}{test\+\_\+generate\+\_\+doc\+\_\+folder\+\_\+location}} (mock\+\_\+api\+\_\+client, mock\+\_\+folder\+\_\+analyzer, mock\+\_\+file\+\_\+analyzer, mock\+\_\+git\+\_\+analyzer)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0}{test\+\_\+generate\+\_\+doc\+\_\+error\+\_\+handling}} (mock\+\_\+api\+\_\+client, mock\+\_\+git\+\_\+analyzer, mock\+\_\+exit)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7}{test\+\_\+setup\+\_\+docgen\+\_\+parser}} ()
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05}{test\+\_\+handle\+\_\+docgen\+\_\+install\+\_\+hook}} (mock\+\_\+exit, mock\+\_\+get\+\_\+token, mock\+\_\+generate\+\_\+doc, mock\+\_\+uninstall\+\_\+hook, mock\+\_\+install\+\_\+hook)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482}{test\+\_\+handle\+\_\+docgen\+\_\+uninstall\+\_\+hook}} (mock\+\_\+exit, mock\+\_\+get\+\_\+token, mock\+\_\+generate\+\_\+doc, mock\+\_\+uninstall\+\_\+hook, mock\+\_\+install\+\_\+hook)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a}{test\+\_\+handle\+\_\+docgen\+\_\+generate}} (mock\+\_\+get\+\_\+token, mock\+\_\+generate\+\_\+doc, mock\+\_\+uninstall\+\_\+hook, mock\+\_\+install\+\_\+hook)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c}{test\+\_\+handle\+\_\+docgen\+\_\+no\+\_\+token}} (mock\+\_\+exit, mock\+\_\+get\+\_\+token)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0}{test\+\_\+generate\+\_\+doc\+\_\+with\+\_\+file\+\_\+exception}} (mock\+\_\+api\+\_\+client, mock\+\_\+getcwd)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3}{test\+\_\+generate\+\_\+doc\+\_\+with\+\_\+folder\+\_\+exception}} (mock\+\_\+api\+\_\+client, mock\+\_\+getcwd)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0}\label{namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_generate\_doc\_error\_handling@{test\_generate\_doc\_error\_handling}}
+\index{test\_generate\_doc\_error\_handling@{test\_generate\_doc\_error\_handling}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_generate\_doc\_error\_handling()}{test\_generate\_doc\_error\_handling()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+error\+\_\+handling (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+api\+\_\+client, }\item[{}]{mock\+\_\+git\+\_\+analyzer, }\item[{}]{mock\+\_\+exit }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Generate a documentation string for the provided code snippet using
+Google Docstring style.
+
+Short one line description: Test function to ensure proper error
+handling during API calls with GitAnalyzer. Multiline long description:
+This test function is designed to verify that the generate_doc function
+handles exceptions correctly when an error occurs during API interaction
+with GitAnalyzer. It sets up a mock API client and a mock Git analyzer,
+causing the analyzer to raise an exception to simulate a failure
+condition. The function then asserts that the exit code is set to 1 when
+the error handling mechanism is invoked.
+
+Args:
+ mock_api_client (MagicMock): A mock object simulating the API client.
+ mock_git_analyzer (MagicMock): A mock object simulating the Git analyzer, configured to raise an
+ exception.
+ mock_exit (MagicMock): A mock object representing the exit function, which should be called
+ with an error code.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45}\label{namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_generate\_doc\_file\_location@{test\_generate\_doc\_file\_location}}
+\index{test\_generate\_doc\_file\_location@{test\_generate\_doc\_file\_location}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_generate\_doc\_file\_location()}{test\_generate\_doc\_file\_location()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+file\+\_\+location (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+api\+\_\+client, }\item[{}]{mock\+\_\+folder\+\_\+analyzer, }\item[{}]{mock\+\_\+file\+\_\+analyzer, }\item[{}]{mock\+\_\+git\+\_\+analyzer }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test generating a documentation file location.
+
+This function tests the process of generating a documentation file
+location using mock objects for API client, folder analyzer, file
+analyzer, and Git analyzer. It sets up the necessary mocks, calls the
+`generate_doc` function with specified parameters, and asserts that the
+appropriate methods on the mock objects are called as expected.
+
+Args:
+ mock_api_client (MagicMock): Mock object for the API client.
+ mock_folder_analyzer (MagicMock): Mock object for the folder analyzer.
+ mock_file_analyzer (MagicMock): Mock object for the file analyzer.
+ mock_git_analyzer (MagicMock): Mock object for the Git analyzer.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186}\label{namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_generate\_doc\_folder\_location@{test\_generate\_doc\_folder\_location}}
+\index{test\_generate\_doc\_folder\_location@{test\_generate\_doc\_folder\_location}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_generate\_doc\_folder\_location()}{test\_generate\_doc\_folder\_location()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+folder\+\_\+location (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+api\+\_\+client, }\item[{}]{mock\+\_\+folder\+\_\+analyzer, }\item[{}]{mock\+\_\+file\+\_\+analyzer, }\item[{}]{mock\+\_\+git\+\_\+analyzer }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the function to generate documentation for a folder location.
+
+It sets up mock objects for API client, folder analyzer, file analyzer,
+and Git analyzer, then calls the `generate_doc` function with specified
+parameters. Finally, it asserts that the correct methods on the mock
+objects were called as expected.
+
+Args:
+ mock_api_client (MagicMock): Mock object for the API client.
+ mock_folder_analyzer (MagicMock): Mock object for the folder analyzer.
+ mock_file_analyzer (MagicMock): Mock object for the file analyzer.
+ mock_git_analyzer (MagicMock): Mock object for the Git analyzer.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8}\label{namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_generate\_doc\_no\_location@{test\_generate\_doc\_no\_location}}
+\index{test\_generate\_doc\_no\_location@{test\_generate\_doc\_no\_location}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_generate\_doc\_no\_location()}{test\_generate\_doc\_no\_location()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+no\+\_\+location (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+getcwd, }\item[{}]{mock\+\_\+api\+\_\+client, }\item[{}]{mock\+\_\+folder\+\_\+analyzer, }\item[{}]{mock\+\_\+file\+\_\+analyzer, }\item[{}]{mock\+\_\+git\+\_\+analyzer }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test function to generate documentation without location information.
+
+This function sets up mocks for the API client, current working
+directory, and Git analyzer. It then calls the `generate_doc` function
+with a fake API URL and token. The function is expected to initialize
+the API client, configure the Git analyzer, and run it without any
+location information.
+
+Args:
+ mock_getcwd (MagicMock): Mock for os.getcwd().
+ mock_api_client (MagicMock): Mock for creating an API client.
+ mock_folder_analyzer (MagicMock): Mock for folder analysis.
+ mock_file_analyzer (MagicMock): Mock for file analysis.
+ mock_git_analyzer (MagicMock): Mock for Git analyzer setup.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0}\label{namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_generate\_doc\_with\_file\_exception@{test\_generate\_doc\_with\_file\_exception}}
+\index{test\_generate\_doc\_with\_file\_exception@{test\_generate\_doc\_with\_file\_exception}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_generate\_doc\_with\_file\_exception()}{test\_generate\_doc\_with\_file\_exception()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+with\+\_\+file\+\_\+exception (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+api\+\_\+client, }\item[{}]{mock\+\_\+getcwd }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Generate documentation from a Python source file.
+
+This function reads a Python file and generates a docstring based on its
+content. It uses mock objects to simulate API calls and directory
+operations during testing.
+
+Args:
+ mock_api_client (unittest.mock.MagicMock): A mock object for simulating API client behavior.
+ mock_getcwd (unittest.mock.MagicMock): A mock object for simulating the current working directory function.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3}\label{namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_generate\_doc\_with\_folder\_exception@{test\_generate\_doc\_with\_folder\_exception}}
+\index{test\_generate\_doc\_with\_folder\_exception@{test\_generate\_doc\_with\_folder\_exception}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_generate\_doc\_with\_folder\_exception()}{test\_generate\_doc\_with\_folder\_exception()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+with\+\_\+folder\+\_\+exception (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+api\+\_\+client, }\item[{}]{mock\+\_\+getcwd }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Generate documentation from a given API endpoint and save it to a
+folder.
+
+This function fetches data from the specified API endpoint, processes
+it, and saves the generated documentation in the provided folder. If an
+error occurs during the fetching process, a SystemExit exception is
+raised with an appropriate message.
+
+Args:
+ api_url (str): The URL of the API endpoint from which data will be fetched.
+ token (str): The authentication token required to access the API.
+ folder_path (str): The path to the folder where the documentation will be saved.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a}\label{namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_handle\_docgen\_generate@{test\_handle\_docgen\_generate}}
+\index{test\_handle\_docgen\_generate@{test\_handle\_docgen\_generate}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_handle\_docgen\_generate()}{test\_handle\_docgen\_generate()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+handle\+\_\+docgen\+\_\+generate (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+get\+\_\+token, }\item[{}]{mock\+\_\+generate\+\_\+doc, }\item[{}]{mock\+\_\+uninstall\+\_\+hook, }\item[{}]{mock\+\_\+install\+\_\+hook }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the direct documentation generation functionality.
+
+This function tests the `handle_docgen` function when no subcommand is
+provided. It verifies that the document generation hook is called and
+the uninstall and install hooks are not called.
+
+Args:
+ mock_get_token (MagicMock): Mocked function to get authentication token.
+ mock_generate_doc (MagicMock): Mocked function for generating documentation.
+ mock_uninstall_hook (MagicMock): Mocked function for uninstalling the document generation hook.
+ mock_install_hook (MagicMock): Mocked function for installing the document generation hook.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05}\label{namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_handle\_docgen\_install\_hook@{test\_handle\_docgen\_install\_hook}}
+\index{test\_handle\_docgen\_install\_hook@{test\_handle\_docgen\_install\_hook}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_handle\_docgen\_install\_hook()}{test\_handle\_docgen\_install\_hook()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+handle\+\_\+docgen\+\_\+install\+\_\+hook (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+exit, }\item[{}]{mock\+\_\+get\+\_\+token, }\item[{}]{mock\+\_\+generate\+\_\+doc, }\item[{}]{mock\+\_\+uninstall\+\_\+hook, }\item[{}]{mock\+\_\+install\+\_\+hook }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the handling of the 'install-hook' subcommand.
+
+This function sets up a mock environment where it simulates the
+execution of the 'install-hook' subcommand. It verifies that the
+`mock_install_hook` is called with the correct arguments, while
+`mock_generate_doc` and `mock_uninstall_hook` are not called.
+
+Args:
+ mock_exit (MagicMock): Mock object for sys.exit.
+ mock_get_token (MagicMock): Mock object to simulate fetching a token.
+ mock_generate_doc (MagicMock): Mock object to simulate generating documentation.
+ mock_uninstall_hook (MagicMock): Mock object to simulate uninstalling a hook.
+ mock_install_hook (MagicMock): Mock object to simulate installing a hook.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c}\label{namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_handle\_docgen\_no\_token@{test\_handle\_docgen\_no\_token}}
+\index{test\_handle\_docgen\_no\_token@{test\_handle\_docgen\_no\_token}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_handle\_docgen\_no\_token()}{test\_handle\_docgen\_no\_token()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+handle\+\_\+docgen\+\_\+no\+\_\+token (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+exit, }\item[{}]{mock\+\_\+get\+\_\+token }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the behavior of the `handle_docgen` function when no token is
+provided.
+
+This function asserts that if no token is returned by `mock_get_token`,
+the `handle_docgen` function will call `mock_exit` with a status code of
+1.
+
+Args:
+ mock_exit (MagicMock): A MagicMock object simulating the `exit` function.
+ mock_get_token (MagicMock): A MagicMock object simulating the `get_token` function.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482}\label{namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_handle\_docgen\_uninstall\_hook@{test\_handle\_docgen\_uninstall\_hook}}
+\index{test\_handle\_docgen\_uninstall\_hook@{test\_handle\_docgen\_uninstall\_hook}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_handle\_docgen\_uninstall\_hook()}{test\_handle\_docgen\_uninstall\_hook()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+handle\+\_\+docgen\+\_\+uninstall\+\_\+hook (\begin{DoxyParamCaption}\item[{}]{mock\+\_\+exit, }\item[{}]{mock\+\_\+get\+\_\+token, }\item[{}]{mock\+\_\+generate\+\_\+doc, }\item[{}]{mock\+\_\+uninstall\+\_\+hook, }\item[{}]{mock\+\_\+install\+\_\+hook }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the uninstall-hook subcommand of the handle_docgen function.
+This test case sets up a mock environment and verifies that the
+uninstall-hook is called with the correct location, while generate_doc
+and install_hook are not called.
+
+Args:
+ mock_exit (MagicMock): A mock for the exit function.
+ mock_get_token (MagicMock): A mock for the get_token function.
+ mock_generate_doc (MagicMock): A mock for the generate_doc function.
+ mock_uninstall_hook (MagicMock): A mock for the uninstall_hook function.
+ mock_install_hook (MagicMock): A mock for the install_hook function.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph}
+\end{center}
+\end{figure}
+\mbox{\Hypertarget{namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7}\label{namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7}}
+\index{tests.test\_doc\_commands@{tests.test\_doc\_commands}!test\_setup\_docgen\_parser@{test\_setup\_docgen\_parser}}
+\index{test\_setup\_docgen\_parser@{test\_setup\_docgen\_parser}!tests.test\_doc\_commands@{tests.test\_doc\_commands}}
+\doxysubsubsection{\texorpdfstring{test\_setup\_docgen\_parser()}{test\_setup\_docgen\_parser()}}
+{\footnotesize\ttfamily def tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+setup\+\_\+docgen\+\_\+parser (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\begin{DoxyVerb}Test the setup_docgen_parser function to ensure it properly configures
+the ArgumentParser for docgen options.
+
+It verifies that the parser correctly sets up docgen options and handles
+different subcommands like 'install-hook' and 'uninstall-hook'.
+\end{DoxyVerb}
+ Here is the call graph for this function\+:
+\nopagebreak
+\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[width=350pt]{namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph}
+\end{center}
+\end{figure}
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5
new file mode 100644
index 0000000..38063b8
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5
@@ -0,0 +1 @@
+bebe62b14f610638316a2a25fabc668d
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.pdf
new file mode 100644
index 0000000..c42610c
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5
new file mode 100644
index 0000000..f3855d4
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5
@@ -0,0 +1 @@
+a94db77f756f7bcd37a17f967e893c7e
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.pdf
new file mode 100644
index 0000000..240aecf
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5
new file mode 100644
index 0000000..d938254
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5
@@ -0,0 +1 @@
+f4c38217f64d14f20bfbc310f126bdc3
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.pdf
new file mode 100644
index 0000000..87a26f5
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5
new file mode 100644
index 0000000..13f2afa
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5
@@ -0,0 +1 @@
+f47eaaf82d8b7d055dfdf5a521447021
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.pdf
new file mode 100644
index 0000000..964e1ca
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5
new file mode 100644
index 0000000..b0edccf
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5
@@ -0,0 +1 @@
+c5da81cf11bd8848054152bf200ba04d
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.pdf
new file mode 100644
index 0000000..95567cb
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5
new file mode 100644
index 0000000..c499932
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5
@@ -0,0 +1 @@
+27396df9a6a29e57e365501f97f2aa93
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.pdf
new file mode 100644
index 0000000..7d73438
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5
new file mode 100644
index 0000000..787ec0b
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5
@@ -0,0 +1 @@
+332a5f7e6185bee69c46a8d7ce7f85a6
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.pdf
new file mode 100644
index 0000000..bfdda08
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5
new file mode 100644
index 0000000..444a811
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5
@@ -0,0 +1 @@
+967352abdfbe0d2786817b991fa1c65a
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.pdf
new file mode 100644
index 0000000..7d9a1b8
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5
new file mode 100644
index 0000000..66a328c
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5
@@ -0,0 +1 @@
+d7ddc37501263c07a7e100f483957fe5
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.pdf
new file mode 100644
index 0000000..e9a0c06
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5
new file mode 100644
index 0000000..6f700d5
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5
@@ -0,0 +1 @@
+adeebf86e1cd0feff265cc15fe15e799
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.pdf
new file mode 100644
index 0000000..453de76
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 b/docs/latex/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5
new file mode 100644
index 0000000..998811c
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5
@@ -0,0 +1 @@
+698c7c0868cd8f81860d94f7472bdd8e
\ No newline at end of file
diff --git a/docs/latex/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.pdf b/docs/latex/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.pdf
new file mode 100644
index 0000000..8384989
Binary files /dev/null and b/docs/latex/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.pdf differ
diff --git a/docs/latex/namespacetests_1_1test__web__config.tex b/docs/latex/namespacetests_1_1test__web__config.tex
new file mode 100644
index 0000000..390c297
--- /dev/null
+++ b/docs/latex/namespacetests_1_1test__web__config.tex
@@ -0,0 +1,7 @@
+\hypertarget{namespacetests_1_1test__web__config}{}\doxysection{tests.\+test\+\_\+web\+\_\+config Namespace Reference}
+\label{namespacetests_1_1test__web__config}\index{tests.test\_web\_config@{tests.test\_web\_config}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classtests_1_1test__web__config_1_1TestWebConfig}{Test\+Web\+Config}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/penify-cli-documentation_8md.tex b/docs/latex/penify-cli-documentation_8md.tex
new file mode 100644
index 0000000..dca0dbd
--- /dev/null
+++ b/docs/latex/penify-cli-documentation_8md.tex
@@ -0,0 +1,2 @@
+\hypertarget{penify-cli-documentation_8md}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/docs/penify-\/cli-\/documentation.md File Reference}
+\label{penify-cli-documentation_8md}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/penify-\/cli-\/documentation.md@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/docs/penify-\/cli-\/documentation.md}}
diff --git a/docs/latex/penify__hook_2____init_____8py.tex b/docs/latex/penify__hook_2____init_____8py.tex
new file mode 100644
index 0000000..51ede27
--- /dev/null
+++ b/docs/latex/penify__hook_2____init_____8py.tex
@@ -0,0 +1,2 @@
+\hypertarget{penify__hook_2____init_____8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/\+\_\+\+\_\+init\+\_\+\+\_\+.py File Reference}
+\label{penify__hook_2____init_____8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/\_\_init\_\_.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/\_\_init\_\_.py}}
diff --git a/docs/latex/penify__hook_2commands_2____init_____8py.tex b/docs/latex/penify__hook_2commands_2____init_____8py.tex
new file mode 100644
index 0000000..3024fa8
--- /dev/null
+++ b/docs/latex/penify__hook_2commands_2____init_____8py.tex
@@ -0,0 +1,9 @@
+\hypertarget{penify__hook_2commands_2____init_____8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/commands/\+\_\+\+\_\+init\+\_\+\+\_\+.py File Reference}
+\label{penify__hook_2commands_2____init_____8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/\_\_init\_\_.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/commands/\_\_init\_\_.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1commands}{penify\+\_\+hook.\+commands}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/refman.tex b/docs/latex/refman.tex
new file mode 100644
index 0000000..3b5933c
--- /dev/null
+++ b/docs/latex/refman.tex
@@ -0,0 +1,298 @@
+ % Handle batch mode
+ % to overcome problems with too many open files
+ \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage}
+ % Set document class depending on configuration
+ \documentclass[twoside]{book}
+ %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package
+ \usepackage{ifthen}
+ \ifx\requestedLaTeXdate\undefined
+ \usepackage{array}
+ \else
+ \usepackage{array}[=2016-10-06]
+ \fi
+ %%
+ % Packages required by doxygen
+ \usepackage{fixltx2e} % for \textsubscript
+ \usepackage{doxygen}
+ \usepackage{graphicx}
+ \usepackage[utf8]{inputenc}
+ \usepackage{makeidx}
+ \PassOptionsToPackage{warn}{textcomp}
+ \usepackage{textcomp}
+ \usepackage[nointegrals]{wasysym}
+ \usepackage{ifxetex}
+ % NLS support packages
+ % Define default fonts
+ % Font selection
+ \usepackage[T1]{fontenc}
+ % set main and monospaced font
+ \usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+\renewcommand{\familydefault}{\sfdefault}
+ \usepackage{sectsty}
+ \allsectionsfont{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+ }
+ \renewcommand{\DoxyLabelFont}{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+ }
+ \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
+ % Arguments of doxygenemoji:
+ % 1) '::' form of the emoji, already LaTeX-escaped
+ % 2) file with the name of the emoji without the .png extension
+ % in case image exist use this otherwise use the '::' form
+ \newcommand{\doxygenemoji}[2]{%
+ \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}%
+ }
+ % Page & text layout
+ \usepackage{geometry}
+ \geometry{%
+ a4paper,%
+ top=2.5cm,%
+ bottom=2.5cm,%
+ left=2.5cm,%
+ right=2.5cm%
+ }
+ % Allow a bit of overflow to go unnoticed by other means
+ \tolerance=750
+ \hfuzz=15pt
+ \hbadness=750
+ \setlength{\emergencystretch}{15pt}
+ \setlength{\parindent}{0cm}
+ \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}}
+ \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}}
+ \doxynormalparskip
+ % Redefine paragraph/subparagraph environments, using sectsty fonts
+ \makeatletter
+ \renewcommand{\paragraph}{%
+ \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@parafont%
+ }%
+ }
+ \renewcommand{\subparagraph}{%
+ \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@subparafont%
+ }%
+ }
+ \makeatother
+ \makeatletter
+ \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@}
+ \makeatother
+ % Headers & footers
+ \usepackage{fancyhdr}
+ \pagestyle{fancyplain}
+ \renewcommand{\footrulewidth}{0.4pt}
+ \fancypagestyle{fancyplain}{
+ \fancyhf{}
+ \fancyhead[LE, RO]{\bfseries\thepage}
+ \fancyhead[LO]{\bfseries\rightmark}
+ \fancyhead[RE]{\bfseries\leftmark}
+ \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen }
+ }
+ \fancypagestyle{plain}{
+ \fancyhf{}
+ \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen }
+ \renewcommand{\headrulewidth}{0pt}
+ }
+ \pagestyle{fancyplain}
+ \renewcommand{\chaptermark}[1]{%
+ \markboth{#1}{}%
+ }
+ \renewcommand{\sectionmark}[1]{%
+ \markright{\thesection\ #1}%
+ }
+ % ToC, LoF, LoT, bibliography, and index
+ % Indices & bibliography
+ \usepackage{natbib}
+ \usepackage[titles]{tocloft}
+ \setcounter{tocdepth}{3}
+ \setcounter{secnumdepth}{5}
+ % creating indexes
+ \makeindex
+ \usepackage{newunicodechar}
+ \newunicodechar{⁻}{${}^{-}$}% Superscript minus
+ \newunicodechar{²}{${}^{2}$}% Superscript two
+ \newunicodechar{³}{${}^{3}$}% Superscript three
+ % Hyperlinks
+ % Hyperlinks (required, but should be loaded last)
+ \ifpdf
+ \usepackage[pdftex,pagebackref=true]{hyperref}
+ \else
+ \ifxetex
+ \usepackage[pagebackref=true]{hyperref}
+ \else
+ \usepackage[ps2pdf,pagebackref=true]{hyperref}
+ \fi
+ \fi
+ \hypersetup{%
+ colorlinks=true,%
+ linkcolor=blue,%
+ citecolor=blue,%
+ unicode,%
+ pdftitle={penify-\/cli},%
+ pdfsubject={}%
+ }
+ % Custom commands used by the header
+ % Custom commands
+ \newcommand{\clearemptydoublepage}{%
+ \newpage{\pagestyle{empty}\cleardoublepage}%
+ }
+ % caption style definition
+ \usepackage{caption}
+ \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top}
+ % in page table of contents
+ \usepackage{etoc}
+ \etocsettocstyle{\doxytocparskip}{\doxynormalparskip}
+ % prevent numbers overlap the titles in toc
+ \renewcommand{\numberline}[1]{#1~}
+% End of preamble, now comes the document contents
+%===== C O N T E N T S =====
+\begin{document}
+ \raggedbottom
+ % Titlepage & ToC
+ % To avoid duplicate page anchors due to reuse of same numbers for
+ % the index (be it as roman numbers)
+ \hypersetup{pageanchor=false,
+ bookmarksnumbered=true,
+ pdfencoding=unicode
+ }
+ \pagenumbering{alph}
+ \begin{titlepage}
+ \vspace*{7cm}
+ \begin{center}%
+ {\Large penify-\/cli}\\
+ \vspace*{1cm}
+ {\large Generated by Doxygen 1.9.4}\\
+ \end{center}
+ \end{titlepage}
+ \clearemptydoublepage
+ \pagenumbering{roman}
+ \tableofcontents
+ \clearemptydoublepage
+ \pagenumbering{arabic}
+ % re-enable anchors again
+ \hypersetup{pageanchor=true}
+%--- Begin generated contents ---
+\chapter{Penify CLI -\/ Commit Commands}
+\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands}
+\Hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands}
+\input{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands}
+\chapter{Penify CLI -\/ Configuration Commands}
+\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands}
+\Hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands}
+\input{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands}
+\chapter{Penify CLI -\/ Detailed Usage Guide}
+\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage}
+\Hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage}
+\input{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage}
+\chapter{Penify CLI -\/ Documentation Generation Commands}
+\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands}
+\Hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands}
+\input{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands}
+\chapter{Penify CLI Example Workflows}
+\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows}
+\Hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows}
+\input{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows}
+\chapter{Penify CLI Tool}
+\label{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README}
+\Hypertarget{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README}
+\input{md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README}
+\chapter{Namespace Index}
+\input{namespaces}
+\chapter{Hierarchical Index}
+\input{hierarchy}
+\chapter{Class Index}
+\input{annotated}
+\chapter{File Index}
+\input{files}
+\chapter{Namespace Documentation}
+\input{namespacepenify__hook}
+\input{namespacepenify__hook_1_1api__client}
+\input{namespacepenify__hook_1_1base__analyzer}
+\input{namespacepenify__hook_1_1commands}
+\input{namespacepenify__hook_1_1commands_1_1auth__commands}
+\input{namespacepenify__hook_1_1commands_1_1commit__commands}
+\input{namespacepenify__hook_1_1commands_1_1config__commands}
+\input{namespacepenify__hook_1_1commands_1_1doc__commands}
+\input{namespacepenify__hook_1_1commands_1_1hook__commands}
+\input{namespacepenify__hook_1_1commit__analyzer}
+\input{namespacepenify__hook_1_1config__command}
+\input{namespacepenify__hook_1_1constants}
+\input{namespacepenify__hook_1_1file__analyzer}
+\input{namespacepenify__hook_1_1folder__analyzer}
+\input{namespacepenify__hook_1_1git__analyzer}
+\input{namespacepenify__hook_1_1jira__client}
+\input{namespacepenify__hook_1_1llm__client}
+\input{namespacepenify__hook_1_1login__command}
+\input{namespacepenify__hook_1_1main}
+\input{namespacepenify__hook_1_1ui__utils}
+\input{namespacepenify__hook_1_1utils}
+\input{namespacesetup}
+\input{namespacetests}
+\input{namespacetests_1_1conftest}
+\input{namespacetests_1_1test__commit__commands}
+\input{namespacetests_1_1test__config__commands}
+\input{namespacetests_1_1test__doc__commands}
+\input{namespacetests_1_1test__web__config}
+\chapter{Class Documentation}
+\input{classpenify__hook_1_1api__client_1_1APIClient}
+\input{classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer}
+\input{classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook}
+\input{classException}
+\input{classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook}
+\input{classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook}
+\input{classpenify__hook_1_1git__analyzer_1_1GitDocGenHook}
+\input{classpenify__hook_1_1utils_1_1GitRepoNotFoundError}
+\input{classpenify__hook_1_1jira__client_1_1JiraClient}
+\input{classpenify__hook_1_1llm__client_1_1LLMClient}
+\input{classtests_1_1test__commit__commands_1_1TestCommitCommands}
+\input{classtests_1_1test__config__commands_1_1TestConfigCommands}
+\input{classtests_1_1test__web__config_1_1TestWebConfig}
+\chapter{File Documentation}
+\input{commit-commands_8md}
+\input{config-commands_8md}
+\input{detailed-usage_8md}
+\input{doc__commands_8md}
+\input{example-workflows_8md}
+\input{penify-cli-documentation_8md}
+\input{api__client_8py}
+\input{base__analyzer_8py}
+\input{penify__hook_2____init_____8py}
+\input{penify__hook_2commands_2____init_____8py}
+\input{tests_2____init_____8py}
+\input{auth__commands_8py}
+\input{commit__commands_8py}
+\input{config__commands_8py}
+\input{doc__commands_8py}
+\input{hook__commands_8py}
+\input{commit__analyzer_8py}
+\input{config__command_8py}
+\input{constants_8py}
+\input{file__analyzer_8py}
+\input{folder__analyzer_8py}
+\input{git__analyzer_8py}
+\input{jira__client_8py}
+\input{llm__client_8py}
+\input{login__command_8py}
+\input{main_8py}
+\input{ui__utils_8py}
+\input{utils_8py}
+\input{README_8md}
+\input{setup_8py}
+\input{conftest_8py}
+\input{test__commit__commands_8py}
+\input{test__config__commands_8py}
+\input{test__doc__commands_8py}
+\input{test__web__config_8py}
+%--- End generated contents ---
+% Index
+ \backmatter
+ \newpage
+ \phantomsection
+ \clearemptydoublepage
+ \addcontentsline{toc}{chapter}{\indexname}
+ \printindex
+% Required for some languages (in combination with latexdocumentpre from the header)
+\end{document}
diff --git a/docs/latex/setup_8py.tex b/docs/latex/setup_8py.tex
new file mode 100644
index 0000000..54e4aba
--- /dev/null
+++ b/docs/latex/setup_8py.tex
@@ -0,0 +1,36 @@
+\hypertarget{setup_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/setup.py File Reference}
+\label{setup_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/setup.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/setup.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacesetup}{setup}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacesetup_ab3a7a0638d76a01367c5bc3cc699447f}{setup.\+name}}
+\item
+\mbox{\hyperlink{namespacesetup_a2aa722b36a933088812b50ea79b97a5c}{setup.\+version}}
+\item
+\mbox{\hyperlink{namespacesetup_aff2375a361fd5865c77bd9aa093be747}{setup.\+packages}}
+\item
+\mbox{\hyperlink{namespacesetup_abead4f26b530856f858f0d44c7cf2588}{setup.\+install\+\_\+requires}}
+\item
+\mbox{\hyperlink{namespacesetup_ada7058afc98897f073d3f3b8b9157059}{setup.\+entry\+\_\+points}}
+\item
+\mbox{\hyperlink{namespacesetup_a3a57a4772d418a06835249cbade0d86a}{setup.\+author}}
+\item
+\mbox{\hyperlink{namespacesetup_a5b08034343aa2be607722a8b315f3625}{setup.\+author\+\_\+email}}
+\item
+\mbox{\hyperlink{namespacesetup_aedf461ec52a946bda975938ba0b93ec0}{setup.\+description}}
+\item
+\mbox{\hyperlink{namespacesetup_a4cda9dbfb952875376a0749fe08a5bde}{setup.\+long\+\_\+description}}
+\item
+\mbox{\hyperlink{namespacesetup_a3796ea10c998699d07d391414ff5d720}{setup.\+long\+\_\+description\+\_\+content\+\_\+type}}
+\item
+\mbox{\hyperlink{namespacesetup_afc13124aa5c0124e84e1d965e3f4b0fb}{setup.\+url}}
+\item
+\mbox{\hyperlink{namespacesetup_abe96a9c38c1c61f9f0fdb002c482f785}{setup.\+classifiers}}
+\item
+\mbox{\hyperlink{namespacesetup_aa7ca7bc9391b217e81efeb03689d8dbf}{setup.\+python\+\_\+requires}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/tabu_doxygen.sty b/docs/latex/tabu_doxygen.sty
new file mode 100644
index 0000000..3f17d1d
--- /dev/null
+++ b/docs/latex/tabu_doxygen.sty
@@ -0,0 +1,2557 @@
+%%
+%% This is file `tabu.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tabu.dtx (with options: `package')
+%%
+%% This is a generated file.
+%% Copyright (FC) 2010-2011 - lppl
+%%
+%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars
+%%
+%% **********************************************************************************************
+%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal
+%% \begin{tabu} to { preamble } => target specified
+%% \begin{tabu} spread { preamble } => target relative to the ``natural width''
+%%
+%% tabu works in text and in math modes.
+%%
+%% X columns: automatic width adjustment + horizontal and vertical alignment
+%% \begin{tabu} { X[4c] X[1c] X[-2ml] }
+%%
+%% Horizontal lines and / or leaders:
+%% \hline\hline => double horizontal line
+%% \firsthline\hline => for nested tabulars
+%% \lasthline\hline => for nested tabulars
+%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader)
+%% Automatic lines / leaders :
+%% \everyrow{\hline\hline}
+%%
+%% Vertical lines and / or leaders:
+%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] }
+%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] }
+%%
+%% Fixed vertical spacing adjustment:
+%% \extrarowheight= \extrarowdepth=
+%% or: \extrarowsep= => may be prefixed by \global
+%%
+%% Dynamic vertical spacing adjustment:
+%% \abovetabulinesep= \belowtabulinesep=
+%% or: \tabulinesep= => may be prefixed by \global
+%%
+%% delarray.sty shortcuts: in math and text modes
+%% \begin{tabu} .... \({ preamble }\)
+%%
+%% Algorithms reports:
+%% \tracingtabu=1 \tracingtabu=2
+%%
+%% **********************************************************************************************
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version. The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work consists of the main source file tabu.dtx
+%% and the derived files
+%% tabu.sty, tabu.pdf, tabu.ins
+%%
+%% tabu : Flexible LaTeX tabulars
+%% lppl copyright 2010-2011 by FC
+%%
+
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen]
+\RequirePackage{array}[2008/09/09]
+\RequirePackage{varwidth}[2009/03/30]
+\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined}
+\let\tabu@AtEnd\@empty
+\def\TMP@EnsureCode#1={%
+ \edef\tabu@AtEnd{\tabu@AtEnd
+ \catcode#1 \the\catcode#1}%
+ \catcode#1=%
+}% \TMP@EnsureCode
+\TMP@EnsureCode 33 = 12 % !
+\TMP@EnsureCode 58 = 12 % : (for siunitx)
+\TMP@EnsureCode124 = 12 % |
+\TMP@EnsureCode 36 = 3 % $ = math shift
+\TMP@EnsureCode 38 = 4 % & = tab alignment character
+\TMP@EnsureCode 32 = 10 % space
+\TMP@EnsureCode 94 = 7 % ^
+\TMP@EnsureCode 95 = 8 % _
+%% Constants --------------------------------------------------------
+\newcount \c@taburow \def\thetaburow {\number\c@taburow}
+\newcount \tabu@nbcols
+\newcount \tabu@cnt
+\newcount \tabu@Xcol
+\let\tabu@start \@tempcnta
+\let\tabu@stop \@tempcntb
+\newcount \tabu@alloc \tabu@alloc=\m@ne
+\newcount \tabu@nested
+\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc}
+\newdimen \tabu@target
+\newdimen \tabu@spreadtarget
+\newdimen \tabu@naturalX
+\newdimen \tabucolX
+\let\tabu@DELTA \@tempdimc
+\let\tabu@thick \@tempdima
+\let\tabu@on \@tempdimb
+\let\tabu@off \@tempdimc
+\newdimen \tabu@Xsum
+\newdimen \extrarowdepth
+\newdimen \abovetabulinesep
+\newdimen \belowtabulinesep
+\newdimen \tabustrutrule \tabustrutrule \z@
+\newtoks \tabu@thebody
+\newtoks \tabu@footnotes
+\newsavebox \tabu@box
+\newsavebox \tabu@arstrutbox
+\newsavebox \tabu@hleads
+\newsavebox \tabu@vleads
+\newif \iftabu@colortbl
+\newif \iftabu@siunitx
+\newif \iftabu@measuring
+\newif \iftabu@spread
+\newif \iftabu@negcoef
+\newif \iftabu@everyrow
+\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue}
+\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse}
+\newif \iftabu@long
+\newif \iftabuscantokens
+\def\tabu@rescan {\tabu@verbatim \scantokens }
+%% Utilities (for internal usage) -----------------------------------
+\def\tabu@gobblespace #1 {#1}
+\def\tabu@gobbletoken #1#2{#1}
+\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex}
+\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble
+ \else\ifx \@sptoken\@let@token
+ \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX
+ \fi\fi
+}% \tabu@gobblex
+\def\tabu@X{^^J}
+{\obeyspaces
+\global\let\tabu@spxiii= % saves an active space (for \ifx)
+\gdef\tabu@@spxiii{ }}
+\def\tabu@ifenvir {% only for \multicolumn
+ \expandafter\tabu@if@nvir\csname\@currenvir\endcsname
+}% \tabu@ifenvir
+\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else
+ \ifx\longtabu#1first\else
+ second\fi\fi oftwo\endcsname
+}% \tabu@ifenvir
+\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi}
+{\catcode`\&=3
+\gdef\tabu@strtrim #1{% #1 = control sequence to trim
+ \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi
+ \let\tabu@c@l@r \@empty \let#1\@empty
+ \else \expandafter \tabu@trimspaces #1\@nnil
+ \fi
+}% \tabu@strtrim
+\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }%
+\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&}
+\gdef\tabu@lastspace #1{\def #3{#1}%
+ \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi
+ \tabu@trimspaces #1\@nnil}
+}% \catcode
+\def\tabu@sanitizearg #1#2{{%
+ \csname \ifcsname if@safe@actives\endcsname %
+ @safe@activestrue\else
+ relax\fi \endcsname
+ \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2%
+ \expandafter}\expandafter\def\expandafter#2\expandafter{#2}%
+}% \tabu@sanitizearg
+\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}%
+ \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!!
+}% \tabu@textbar
+\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi}
+\def\tabu@everyrow@egroup{%
+ \iftabu@everyrow \expandafter \endgroup \the\toks@
+ \else \ifnum0=`{\fi}%
+ \fi
+}% \tabu@everyrow@egroup
+\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule
+ height \arraystretch \dimexpr\ht\strutbox+\extrarowheight
+ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth
+ width \z@}%
+}% \tabu@arstrut
+\def\tabu@rearstrut {%
+ \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax
+ \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax
+ \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima
+ \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi
+ \tabu@mkarstrut
+ \fi
+}% \tabu@rearstrut
+\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi}
+\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox
+ \hbox to\z@{\hbox to\z@{\hss
+ {\tabu@DBG{cyan}\vrule
+ height \arraystretch \dimexpr\ht\strutbox+\extrarowheight
+ depth \z@
+ width \tabustrutrule}\kern-\tabustrutrule
+ {\tabu@DBG{pink}\vrule
+ height \z@
+ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth
+ width \tabustrutrule}}}%
+}% \tabu@DBG@arstrut
+\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@
+ \@nextchar}}%
+\def\tabu@savedecl{\ifcat$\d@llarend\else
+ \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode
+}% \tabu@savedecl
+\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@}
+\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k }
+\let\tabu@trialh@@k \@empty
+\def\tabu@nowrite #1#{{\afterassignment}\toks@}
+\let\tabu@write\write
+\let\tabu@immediate\immediate
+\def\tabu@WRITE{\begingroup
+ \def\immediate\write{\aftergroup\endgroup
+ \tabu@immediate\tabu@write}%
+}% \tabu@WRITE
+\expandafter\def\expandafter\tabu@GenericError\expandafter{%
+ \expandafter\tabu@WRITE\GenericError}
+\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}}
+\def\tabu@noxfootnote [#1]{\@gobble}
+\def\tabu@nocolor #1#{\@gobble}
+\newcommand*\tabu@norowcolor[2][]{}
+\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}%
+ \futurelet\@let@token \tabu@m@ybesiunitx}
+\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {%
+ \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi
+ \tabu@temp}% \tabu@m@ybesiunitx
+}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname
+\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}%
+%% Fixed vertical spacing adjustment: \extrarowsep ------------------
+\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}%
+ \iftabu@everyrow \aftergroup\tabu@Gextra
+ \else \aftergroup\tabu@n@Gextra
+ \fi
+ \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra
+}% \extrarowsep
+\def\tabu@extra {\@ifnextchar_%
+ {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}
+ {\ifx ^\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}%
+ \else \let\tabu@temp \@empty
+ \afterassignment \tabu@setextrasep \extrarowdepth
+ \fi \tabu@temp}%
+}% \tabu@extra
+\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2}
+\def\tabu@extr@ #1#2{\@ifnextchar^%
+ {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}
+ {\ifx _\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}%
+ \else \let\tabu@temp \@empty
+ \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth
+ \fi \tabu@temp}%
+}% \tabu@extr@
+\def\tabu@setextrasep {\extrarowheight=\extrarowdepth
+ \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth
+}% \tabu@setextrasep
+\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi}
+\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi}
+\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra}
+\let\tabu@C@extra \z@
+\let\tabu@G@extra \@empty
+%% Dynamic vertical spacing adjustment: \tabulinesep ----------------
+\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}%
+ \iftabu@everyrow \aftergroup\tabu@Glinesep
+ \else \aftergroup\tabu@n@Glinesep
+ \fi
+ \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep
+}% \tabulinesep
+\def\tabu@linesep {\@ifnextchar_%
+ {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}
+ {\ifx ^\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}%
+ \else \let\tabu@temp \@empty
+ \afterassignment \tabu@setlinesep \abovetabulinesep
+ \fi \tabu@temp}%
+}% \tabu@linesep
+\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2}
+\def\tabu@sets@p #1#2{\@ifnextchar^%
+ {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}
+ {\ifx _\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}%
+ \else \let\tabu@temp \@empty
+ \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep
+ \fi \tabu@temp}%
+}% \tabu@sets@p
+\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep
+ \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep
+}% \tabu@setlinesep
+\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi}
+\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi}
+\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep}
+\let\tabu@C@linesep \z@
+\let\tabu@G@linesep \@empty
+%% \global\extrarowsep and \global\tabulinesep -------------------
+\def\tabu@Gsave #1#2#3#4{\xdef#1{#1%
+ \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}%
+}% \tabu@Gsave
+\def\tabu@Grestore#1#2{%
+ \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax
+ \ifcat$\the\toks\currentgrouplevel$\else
+ \global\let#1\@empty \global\let#2\z@
+ \the\toks\currentgrouplevel
+ \fi
+}% \tabu@Grestore
+%% Setting code for every row ---------------------------------------
+\newcommand*\everyrow{\tabu@everyrow@bgroup
+ \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop
+}% \everyrow
+\def\tabu@evrstartstop {\@ifnextchar^%
+ {\afterassignment \tabu@evrstartstop \tabu@stop=}%
+ {\ifx ^\@let@token
+ \afterassignment\tabu@evrstartstop \tabu@start=%
+ \else \afterassignment\tabu@everyr@w \toks@
+ \fi}%
+}% \tabu@evrstartstop
+\def\tabu@everyr@w {%
+ \xdef\tabu@everyrow{%
+ \noexpand\tabu@everyrowfalse
+ \let\noalign \relax
+ \noexpand\tabu@rowfontreset
+ \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors
+ \let\noexpand\tabu@docline \noexpand\tabu@docline@evr
+ \the\toks@
+ \noexpand\tabu@evrh@@k
+ \noexpand\tabu@rearstrut
+ \global\advance\c@taburow \@ne}%
+ \iftabu@everyrow \toks@\expandafter
+ {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}%
+ \else \xdef\tabu@evr@G{\the\toks@}%
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@everyr@w
+\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only
+\tabu@evr{}
+%% line style and leaders -------------------------------------------
+\newcommand*\newtabulinestyle [1]{%
+ {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}%
+}% \newtabulinestyle
+\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}%
+ \tabu@sanitizearg {#1}\@tempa
+ \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi
+ \global\expandafter\let
+ \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi
+}% \tabu@newlinestyle
+\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}%
+ \iftabu@everyrow
+ \toks@\expandafter{\expandafter \def \expandafter
+ \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}%
+ \gdef\tabu@ls@{\tabu@ls@L}%
+ \else
+ \global\let\tabu@ls@G \tabu@thestyle
+ \gdef\tabu@ls@{\tabu@ls@G}%
+ \fi
+ \tabu@everyrow@egroup
+}% \tabulinestyle
+\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor}
+\def\tabu@rulecolor #1{\toks@{}%
+ \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1%
+ \tabu@temp
+ \tabu@rulearc
+}% \tabu@rulecolor
+\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp
+ \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}%
+ \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}%
+ \fi
+ \tabu@temp
+}% \tabu@ruledrsc@
+\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}}
+\def\tabu@rule@drsc@ #1#2{%
+ \iftabu@everyrow
+ \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}%
+ \else \toks@{\def\CT@drsc@{\color #1{#2}}}%
+ \fi
+ \else
+ \ifx \\#1#2\\\global\let\CT@drsc@ \relax
+ \else \gdef\CT@drsc@{\color #1{#2}}%
+ \fi
+ \fi
+ \tabu@rulearc
+}% \tabu@rule@drsc@
+\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}}
+\def\tabu@rule@arc@ #1#2{%
+ \iftabu@everyrow
+ \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}%
+ \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}%
+ \fi
+ \toks@\expandafter{\the\toks@
+ \let\tabu@arc@L \CT@arc@
+ \let\tabu@drsc@L \CT@drsc@
+ \ignorespaces}%
+ \else
+ \ifx \\#1#2\\\gdef\CT@arc@{}%
+ \else \gdef\CT@arc@{\color #1{#2}}%
+ \fi
+ \global\let\tabu@arc@G \CT@arc@
+ \global\let\tabu@drsc@G \CT@drsc@
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@rule@arc@
+\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1}
+\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}}
+\def\tabu@rowc@lors #1#2#3{%
+ \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil
+ \@defaultunits \tabu@start =\number0#1\relax \@nnil
+ \ifnum \count@<\tw@ \count@=\tw@ \fi
+ \advance\tabu@start \m@ne
+ \ifnum \tabu@start<\z@ \tabu@start \z@ \fi
+ \tabu@rowcolorseries #3\in@..\in@ \@nnil
+}% \tabu@rowcolors
+\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {%
+ \ifx \in@#1\relax
+ \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}%
+ \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@
+ \fi
+ \else
+ \ifx \\#2\\\tabu@rowcolorserieserror \fi
+ \tabu@sanitizearg{#1}\tabu@temp
+ \tabu@sanitizearg{#2}\@tempa
+ \advance\count@ \m@ne
+ \iftabu@everyrow
+ \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{%
+ \ifnum ##2=\c@taburow
+ \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi
+ \ifnum \c@taburow<##2 \else
+ \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@
+ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \rowcolor{tabu@rc@\the\tabu@nested}\fi}%
+ }\edef\x{\noexpand\tabu@rc@ {\the\count@}
+ {\the\tabu@start}
+ {\tabu@temp}
+ {\@tempa}%
+ }\x
+ \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}%
+ \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}%
+ \else % inside \noalign
+ \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}%
+ \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}%
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}%
+ \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{%
+ \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne
+ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \rowcolor{tabu@rc@\the\tabu@nested}}%
+ }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x
+ \global\let\tabu@rc@G \tabu@rc@
+ \fi
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@rowcolorseries
+\tabuDisableCommands {\let\tabu@rc@ \@empty }
+\def\tabu@rowcolorserieserror {\PackageError{tabu}
+ {Invalid syntax for \string\taburowcolors
+ \MessageBreak Please look at the documentation!}\@ehd
+}% \tabu@rowcolorserieserror
+\newcommand*\tabureset {%
+ \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@
+ \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}%
+}% \tabureset
+%% Parsing the line styles ------------------------------------------
+\def\tabu@getline #1{\begingroup
+ \csname \ifcsname if@safe@actives\endcsname %
+ @safe@activestrue\else
+ relax\fi \endcsname
+ \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa
+ \let\tabu@thestyle \relax
+ \ifcsname tabu@linestyle@\@tempa \endcsname
+ \edef\tabu@thestyle{\endgroup
+ \def\tabu@thestyle{\expandafter\noexpand
+ \csname tabu@linestyle@\@tempa\endcsname}%
+ }\tabu@thestyle
+ \else \expandafter\tabu@definestyle \tabu@temp \@nil
+ \fi
+}% \tabu@getline
+\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter
+ \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen
+ \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined
+ \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs
+ \def\tabu@temp{\tabu@getparam{thick}}%
+ \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}%
+ \fi
+ {%
+ \let\tabu@ \relax
+ \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-))
+ \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}%
+ \expandafter}\expandafter
+ \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-)
+ \def\;{\def\:}%
+ \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10)
+ \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-)
+ \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi
+ \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi
+ \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi
+ \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen
+ \tabu@on \tabulineon \fi\fi
+ \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen
+ \tabu@off \tabulineoff \fi\fi
+ \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi
+ \in@true %
+ \else \in@false %
+ \fi
+ \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}%
+ \else \edef\tabu@thick{\the\tabu@thick}%
+ \fi
+ \edef \tabu@thestyle ##1##2{\endgroup
+ \def\tabu@thestyle{%
+ \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick}
+ {\the\tabu@on}{##1}
+ {\the\tabu@off}{##2}%
+ \else \noexpand\tabu@rulesstyle
+ {##1\vrule width \tabu@thick}%
+ {##1\leaders \hrule height \tabu@thick \hfil}%
+ \fi}%
+ }\expandafter \expandafter
+ \expandafter \tabu@thestyle \expandafter
+ \expandafter \expandafter
+ {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}%
+}% \tabu@definestyle
+{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active
+ \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}}
+ \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space}
+}% \catcode
+\def\tabu@oxiii #1{%
+ \ifcase \ifx n#1\z@ \else
+ \ifx f#1\@ne\else
+ \tw@ \fi\fi
+ \expandafter\tabu@onxiii
+ \or \expandafter\tabu@ofxiii
+ \else o%
+ \fi#1}%
+\def\tabu@onxiii #1#2{%
+ \ifcase \ifx !#2\tw@ \else
+ \ifcat.\noexpand#2\z@ \else
+ \ifx \tabu@spxiii#2\@ne\else
+ \tw@ \fi\fi\fi
+ \tabu@getparam{on}#2\expandafter\@gobble
+ \or \expandafter\tabu@onxiii % (space is active)
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}%
+\def\tabu@ofxiii #1#2{%
+ \ifx #2f\expandafter\tabu@offxiii
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}
+\def\tabu@offxiii #1#2{%
+ \ifcase \ifx !#2\tw@ \else
+ \ifcat.\noexpand#2\z@ \else
+ \ifx\tabu@spxiii#2\@ne \else
+ \tw@ \fi\fi\fi
+ \tabu@getparam{off}#2\expandafter\@gobble
+ \or \expandafter\tabu@offxiii % (space is active)
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}
+\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=}
+\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef
+ \ifx \tabu@#1\else % no more spec
+ \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi
+}% \tabu@getcolor
+\def\tabu@getc@l@r #1\tabu@ {%
+ \def\tabu@temp{#1}\tabu@strtrim \tabu@temp
+ \ifx \tabu@temp\@empty
+ \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists
+ \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r
+ \else \let\tabu@c@lon \tabu@c@l@r
+ \fi
+ %\else \tabu@warncolour{\tabu@temp}%
+ \fi%\fi
+ \tabu@ % next spec
+}% \tabu@getc@l@r
+\def\tabu@warncolour #1{\PackageWarning{tabu}
+ {Color #1 is not defined. Default color used}%
+}% \tabu@warncolour
+\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}%
+ \ifx \tabu@leaders\tabu@leaders@G \else
+ \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi
+}% \tabu@leadersstyle
+\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined
+ \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}%
+}% \tabu@rulesstyle
+%% The leaders boxes ------------------------------------------------
+\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color
+ {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor
+ {% % but the leaders boxes should have colors !
+ \def\@therule{\vrule}\def\@thick{height}\def\@length{width}%
+ \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}%
+ \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}%
+ \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}%
+ \global\let\tabu@thehleaders \tabu@theleaders
+ }%
+ {%
+ \def\@therule{\hrule}\def\@thick{width}\def\@length{height}%
+ \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}%
+ \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}%
+ \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}%
+ \global\let\tabu@thevleaders \tabu@theleaders
+ }%
+ \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}%
+ }%
+}% \tabu@LEADERS
+\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@}
+\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color
+ \global\setbox \tabu@leads=\@box{%
+ {#3\tabu@therule{#1}{#2}}%
+ \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi
+ {#3\tabu@therule{#1}{#2}}}%
+ \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss
+ {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}%
+ \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {%
+ {##1\tabu@therule{#1}{#2}}%
+ \xleaders \copy\tabu@leads \@ss
+ \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}%
+ }\tabu@theleaders{#3}%
+}% \tabu@l@@d@rs
+%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ----------
+\newcommand*\tabu {\tabu@longfalse
+ \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}%
+ \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi
+ \expandafter\let\csname tabu*\endcsname \tabu
+ \expandafter\def\csname endtabu*\endcsname{\endtabu}%
+ \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget
+}% {tabu}
+\let\tabu@tabular \tabular %
+\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu}
+\newcommand*\longtabu {\tabu@longtrue
+ \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi
+ \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}%
+ \LTchunksize=\@M
+ \expandafter\let\csname tabu*\endcsname \tabu
+ \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}%
+ \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts }
+ \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget
+}% {longtabu}
+\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu}
+\def\tabu@nolongtabu{\PackageError{tabu}
+ {longtabu requires the longtable package}\@ehd}
+%% Read the target and then : \tabular or \@array ------------------
+\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget }
+\def\tabu@sett@rget {\tabu@target \z@
+ \ifcase \ifx \bgroup\@let@token \z@ \else
+ \ifx \@sptoken\@let@token \@ne \else
+ \if t\@let@token \tw@ \else
+ \if s\@let@token \thr@@\else
+ \z@\fi\fi\fi\fi
+ \expandafter\tabu@begin
+ \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget
+ \or \expandafter\tabu@to
+ \or \expandafter\tabu@spread
+ \fi
+}% \tabu@sett@rget
+\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget}
+\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget}
+\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target }
+\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget }
+\def\tabu@linegoalt@rget {%
+ \ifx \tabu@temp\LNGL@setlinegoal
+ \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal
+ \tabu@begin
+}% \tabu@linegoalt@rget
+\def\tabu@begin #1#{%
+ \iftabu@measuring \expandafter\tabu@nestedmeasure \fi
+ \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty
+ \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}%
+ \fi
+ \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil
+}% \tabu@begin
+\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup
+ \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}%
+ \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }%
+}% \tabu@tabu@
+\def\tabu@nestedmeasure {%
+ \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax
+ \tabu@spreadtrue
+ \else \begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}%
+ \expandafter\tabu@collectbody\expandafter\tabu@quickrule
+ \expandafter\endgroup
+ \fi
+}% \tabu@nestedmeasure
+\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target}
+%% \tabu@setup \tabu@init \tabu@indent
+\def\tabu@setup{\tabu@alloc@
+ \ifcase \tabu@nested
+ \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@
+ \let\tabu@afterendpar \par
+ \fi\fi\fi
+ \def\tabu@aligndefault{c}\tabu@init \tabu@indent
+ \else %
+ \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth
+ \fi
+ \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined
+ \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}%
+ \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu...
+ \let\@endpbox \tabu@endpbox % idem " " " " " "
+ \let\@tabarray \tabu@tabarray % idem " " " " " "
+ \tabu@setcleanup \tabu@setreset
+}% \tabu@setup
+\def\tabu@init{\tabu@starttimer \tabu@measuringfalse
+ \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}%
+ \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline
+ \let\firstline \tabu@firstline \let\lastline \tabu@lastline
+ \let\hline \tabu@hline \let\@xhline \tabu@xhline
+ \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox
+ \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi
+ \tabu@trivlist %
+ \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext
+ \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering
+ \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft
+ \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering
+ \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft
+ \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont
+ \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x
+ \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar
+ \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok
+ \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn
+ \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!!
+ \let\tabu@endpbox \@endpbox % idem " " " " " " "
+ \let\tabu@tabarray \@tabarray % idem " " " " " " "
+ \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray)
+ \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi
+}% \tabu@init
+\def\tabu@indent{% correction for indentation
+ \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget
+ \everypar\expandafter{%
+ \the\everypar\everypar\expandafter{\the\everypar}%
+ \setbox\z@=\lastbox
+ \ifdim\wd\z@>\z@ \edef\tabu@thetarget
+ {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi
+ \box\z@}%
+ \fi\fi
+}% \tabu@indent
+\def\tabu@setcleanup {% saves last global assignments
+ \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax
+ \def\tabu@aftergroupcleanup{%
+ \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}%
+ \else
+ \def\tabu@aftergroupcleanup{%
+ \aftergroup\aftergroup\aftergroup\tabu@cleanup
+ \let\tabu@aftergroupcleanup \relax}%
+ \fi
+ \let\tabu@arc@Gsave \tabu@arc@G
+ \let\tabu@arc@G \tabu@arc@L %
+ \let\tabu@drsc@Gsave \tabu@drsc@G
+ \let\tabu@drsc@G \tabu@drsc@L %
+ \let\tabu@ls@Gsave \tabu@ls@G
+ \let\tabu@ls@G \tabu@ls@L %
+ \let\tabu@rc@Gsave \tabu@rc@G
+ \let\tabu@rc@G \tabu@rc@L %
+ \let\tabu@evr@Gsave \tabu@evr@G
+ \let\tabu@evr@G \tabu@evr@L %
+ \let\tabu@celllalign@save \tabu@celllalign
+ \let\tabu@cellralign@save \tabu@cellralign
+ \let\tabu@cellleft@save \tabu@cellleft
+ \let\tabu@cellright@save \tabu@cellright
+ \let\tabu@@celllalign@save \tabu@@celllalign
+ \let\tabu@@cellralign@save \tabu@@cellralign
+ \let\tabu@@cellleft@save \tabu@@cellleft
+ \let\tabu@@cellright@save \tabu@@cellright
+ \let\tabu@rowfontreset@save \tabu@rowfontreset
+ \let\tabu@@rowfontreset@save\tabu@@rowfontreset
+ \let\tabu@rowfontreset \@empty
+ \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset
+ \edef\c@taburow@save {\the\c@taburow}%
+ \edef\tabu@naturalX@save {\the\tabu@naturalX}%
+ \let\tabu@naturalXmin@save \tabu@naturalXmin
+ \let\tabu@naturalXmax@save \tabu@naturalXmax
+ \let\tabu@mkarstrut@save \tabu@mkarstrut
+ \edef\tabu@clarstrut{%
+ \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax
+ \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax
+ \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}%
+}% \tabu@setcleanup
+\def\tabu@cleanup {\begingroup
+ \globaldefs\@ne \tabu@everyrowtrue
+ \let\tabu@arc@G \tabu@arc@Gsave
+ \let\CT@arc@ \tabu@arc@G
+ \let\tabu@drsc@G \tabu@drsc@Gsave
+ \let\CT@drsc@ \tabu@drsc@G
+ \let\tabu@ls@G \tabu@ls@Gsave
+ \let\tabu@ls@ \tabu@ls@G
+ \let\tabu@rc@G \tabu@rc@Gsave
+ \let\tabu@rc@ \tabu@rc@G
+ \let\CT@do@color \relax
+ \let\tabu@evr@G \tabu@evr@Gsave
+ \let\tabu@celllalign \tabu@celllalign@save
+ \let\tabu@cellralign \tabu@cellralign@save
+ \let\tabu@cellleft \tabu@cellleft@save
+ \let\tabu@cellright \tabu@cellright@save
+ \let\tabu@@celllalign \tabu@@celllalign@save
+ \let\tabu@@cellralign \tabu@@cellralign@save
+ \let\tabu@@cellleft \tabu@@cellleft@save
+ \let\tabu@@cellright \tabu@@cellright@save
+ \let\tabu@rowfontreset \tabu@rowfontreset@save
+ \let\tabu@@rowfontreset \tabu@@rowfontreset@save
+ \tabu@naturalX =\tabu@naturalX@save
+ \let\tabu@naturalXmax \tabu@naturalXmax@save
+ \let\tabu@naturalXmin \tabu@naturalXmin@save
+ \let\tabu@mkarstrut \tabu@mkarstrut@save
+ \c@taburow =\c@taburow@save
+ \ifcase \tabu@nested \tabu@alloc \m@ne\fi
+ \endgroup %
+ \ifcase \tabu@nested
+ \the\tabu@footnotes \global\tabu@footnotes{}%
+ \tabu@afterendpar \tabu@elapsedtime
+ \fi
+ \tabu@clarstrut
+ \everyrow\expandafter {\tabu@evr@G}%
+}% \tabu@cleanup
+\let\tabu@afterendpar \relax
+\def\tabu@setreset {%
+ \edef\tabu@savedparams {% \relax for \tabu@message@save
+ \ifmmode \col@sep \the\arraycolsep
+ \else \col@sep \the\tabcolsep \fi \relax
+ \arrayrulewidth \the\arrayrulewidth \relax
+ \doublerulesep \the\doublerulesep \relax
+ \extratabsurround \the\extratabsurround \relax
+ \extrarowheight \the\extrarowheight \relax
+ \extrarowdepth \the\extrarowdepth \relax
+ \abovetabulinesep \the\abovetabulinesep \relax
+ \belowtabulinesep \the\belowtabulinesep \relax
+ \def\noexpand\arraystretch{\arraystretch}%
+ \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}%
+ \begingroup
+ \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu
+ \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi
+ \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi
+ \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L
+ \expandafter \endgroup \expandafter
+ \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena
+ \let\tabu@arc@G \tabu@arc@L
+ \let\tabu@drsc@G \tabu@drsc@L
+ \let\tabu@ls@G \tabu@ls@L
+ \let\tabu@rc@G \tabu@rc@L
+ \let\tabu@evr@G \tabu@evr@L}%
+ \def\tabu@reset{\tabu@savedparams
+ \tabu@everyrowtrue \c@taburow \z@
+ \let\CT@arc@ \tabu@arc@L
+ \let\CT@drsc@ \tabu@drsc@L
+ \let\tabu@ls@ \tabu@ls@L
+ \let\tabu@rc@ \tabu@rc@L
+ \global\tabu@alloc \tabu@alloc@save
+ \everyrow\expandafter{\tabu@evr@L}}%
+}% \tabu@reset
+\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}}
+\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}}
+%% The Rewriting Process -------------------------------------------
+\def\tabu@newcolumntype #1{%
+ \expandafter\tabu@new@columntype
+ \csname NC@find@\string#1\expandafter\endcsname
+ \csname NC@rewrite@\string#1\endcsname
+ {#1}%
+}% \tabu@newcolumntype
+\def\tabu@new@columntype #1#2#3{%
+ \def#1##1#3{\NC@{##1}}%
+ \let#2\relax \newcommand*#2%
+}% \tabu@new@columntype
+\def\tabu@privatecolumntype #1{%
+ \expandafter\tabu@private@columntype
+ \csname NC@find@\string#1\expandafter\endcsname
+ \csname NC@rewrite@\string#1\expandafter\endcsname
+ \csname tabu@NC@find@\string#1\expandafter\endcsname
+ \csname tabu@NC@rewrite@\string#1\endcsname
+ {#1}%
+}% \tabu@privatecolumntype
+\def\tabu@private@columntype#1#2#3#4{%
+ \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}%
+ \tabu@new@columntype#3#4%
+}% \tabu@private@columntype
+\let\tabu@privatecolumns \@empty
+\newcommand*\tabucolumn [1]{\expandafter \def \expandafter
+ \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns
+ \NC@do #1}}%
+\let\tabu@highprioritycolumns \@empty
+%% The | ``column'' : rewriting process --------------------------
+\tabu@privatecolumntype |{\tabu@rewritevline}
+\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}%
+ \expandafter \NC@find \tabu@rewritten}
+\def\tabu@lines #1{%
+ \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi
+ \NC@list\expandafter{\the\NC@list \NC@do #1}%
+}% \tabu@lines@
+\def\tabu@vlinearg #1{%
+ \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}%
+ \else\tabu@getline {#1}%
+ \fi
+ \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}%
+ }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}%
+ \expandafter \tabu@keepls \tabu@thestyle \@nil
+}% \tabu@vlinearg
+\def\tabu@keepls #1\@nil{%
+ \ifcat $\@cdr #1\@nil $%
+ \ifx \relax#1\else
+ \ifx \tabu@ls@#1\else
+ \let#1\relax
+ \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer
+ \tabu@savels\noexpand#1}\fi\fi\fi
+}% \tabu@keepls
+\def\tabu@thevline {\begingroup
+ \ifdefined\tabu@leaders
+ \setbox\@tempboxa=\vtop to\dimexpr
+ \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}%
+ \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox
+ \box\@tempboxa
+ \else
+ \tabu@thevrule
+ \fi \endgroup
+}% \tabu@thevline
+\def\tabu@savels #1{%
+ \expandafter\let\csname\string#1\endcsname #1%
+ \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset
+ \tabu@resetls#1}}%
+\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}%
+%% \multicolumn inside tabu environment -----------------------------
+\tabu@newcolumntype \tabu@rewritemulticolumn{%
+ \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group
+ \NC@list{\NC@do *}\tabu@textbar \tabu@lines
+ \tabu@savedecl
+ \tabu@privatecolumns
+ \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}%
+ \let\tabu@savels \relax
+ \NC@find
+}% \tabu@rewritemulticolumn
+\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup}
+\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI}
+\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup
+ \tabu@everyrowtrue
+ \NC@list{\NC@do \tabu@rewritemulticolumn}%
+ \expandafter\@gobbletwo % gobbles \multispan{#1}
+ \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}%
+ {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi
+ {#3}}%
+}% \tabu@multic@lumn
+%% The X column(s): rewriting process -----------------------------
+\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}}
+\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten }
+\def\tabu@siunitx #1{\@ifnextchar \bgroup
+ {\tabu@rewriteX@Ss{#1}}
+ {\tabu@nosiunitx{#1}}}
+\def\tabu@rewriteX@Ss #1#2{\@temptokena{}%
+ \@defaultunits \let\tabu@temp =#2\relax\@nnil
+ \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi
+ \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}%
+ }\expandafter\NC@find \the\@temptokena \relax
+ }\expandafter\NC@rewrite@S \@gobble #2\relax
+ \else \tabu@siunitxerror
+ \fi
+ \expandafter \NC@find \tabu@rewritten
+}% \tabu@rewriteX@Ss
+\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column !
+ \MessageBreak X column can only embed siunitx S or s columns}\@ehd
+}% \tabu@siunitxerror
+\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}%
+ \iftabu@measuring
+ \else \tabu@measuringtrue % first X column found in the preamble
+ \let\@halignto \relax \let\tabu@halignto \relax
+ \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@
+ \else \tabu@spreadtarget \z@ \fi
+ \ifdim \tabu@target=\z@
+ \setlength\tabu@target \tabu@thetarget
+ \tabu@message{\tabu@message@defaulttarget}%
+ \else \tabu@message{\tabu@message@target}\fi
+ \fi
+}% \tabu@rewriteX
+\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax
+ \def\tabu@rewritten{l}}
+\def\tabu@Xarg #1#2#3{%
+ \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty
+ \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty
+ \ifx\\#1\\%
+ \def\tabu@rewritten{p}\tabucolX \p@ %
+ \else
+ \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@
+ \tabu@Xparse {}#1\relax
+ \fi
+ \tabu@Xrewritten{#2}{#3}%
+}% \tabu@Xarg
+\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest}
+\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}}
+\def\tabu@Xtest{%
+ \ifcase \ifx \relax\@let@token \z@ \else
+ \if ,\@let@token \m@ne\else
+ \if p\@let@token 1\else
+ \if m\@let@token 2\else
+ \if b\@let@token 3\else
+ \if l\@let@token 4\else
+ \if c\@let@token 5\else
+ \if r\@let@token 6\else
+ \if j\@let@token 7\else
+ \if L\@let@token 8\else
+ \if C\@let@token 9\else
+ \if R\@let@token 10\else
+ \if J\@let@token 11\else
+ \ifx \@sptoken\@let@token 12\else
+ \if .\@let@token 13\else
+ \if -\@let@token 13\else
+ \ifcat $\@let@token 14\else
+ 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax
+ \or \tabu@Xtype {p}%
+ \or \tabu@Xtype {m}%
+ \or \tabu@Xtype {b}%
+ \or \tabu@Xalign \raggedright\relax
+ \or \tabu@Xalign \centering\relax
+ \or \tabu@Xalign \raggedleft\relax
+ \or \tabu@Xalign \tabu@justify\relax
+ \or \tabu@Xalign \RaggedRight\raggedright
+ \or \tabu@Xalign \Centering\centering
+ \or \tabu@Xalign \RaggedLeft\raggedleft
+ \or \tabu@Xalign \justifying\tabu@justify
+ \or \expandafter \tabu@Xparsespace
+ \or \expandafter \tabu@Xcoef
+ \or \expandafter \tabu@Xm@th
+ \or \tabu@Xcoef{}%
+ \else\expandafter \tabu@Xparse
+ \fi
+}% \tabu@Xtest
+\def\tabu@Xalign #1#2{%
+ \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu}
+ {Duplicate horizontal alignment specification}\fi
+ \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax
+ \else \def\tabu@Xlcr{#2}\let#2\relax\fi
+ \expandafter\tabu@Xparse
+}% \tabu@Xalign
+\def\tabu@Xtype #1{%
+ \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu}
+ {Duplicate vertical alignment specification}\fi
+ \def\tabu@rewritten{#1}\expandafter\tabu@Xparse
+}% \tabu@Xtype
+\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}%
+ \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi
+}% \tabu@Xcoef
+\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@
+ \tabu@Xparse{}%
+}% \tabu@Xc@ef
+\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp}
+\def\tabu@Xd@sp{\let\tabu@Xmath=$%
+ \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}%
+ \expandafter\tabu@Xparse
+ \else \expandafter\tabu@Xparse\expandafter{\expandafter}%
+ \fi
+}% \tabu@Xd@sp
+\def\tabu@Xrewritten {%
+ \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi
+ \ifdim \tabucolX<\z@ \tabu@negcoeftrue
+ \else\ifdim \tabucolX=\z@ \tabucolX \p@
+ \fi\fi
+ \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}%
+ \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}%
+ \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{%
+ >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}%
+ \tabu@rewritten {\tabu@hsize \tabu@temp}%
+ <{##2\ifx$\tabu@Xmath$\fi}}%
+ }\tabu@rewritten
+}% \tabu@Xrewritten
+\def\tabu@hsize #1#2{%
+ \ifdim #2\p@<\z@
+ \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else
+ \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi
+ \fi
+ \else #2\tabucolX
+ \fi
+}% \tabu@hsize
+%% \usetabu and \preamble: rewriting process ---------------------
+\tabu@privatecolumntype \usetabu [1]{%
+ \ifx\\#1\\\tabu@saveerr{}\else
+ \@ifundefined{tabu@saved@\string#1}
+ {\tabu@saveerr{#1}}
+ {\let\tabu@rewriteX \tabu@rewriteXrestore
+ \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}%
+ \fi
+}% \NC@rewrite@\usetabu
+\tabu@privatecolumntype \preamble [1]{%
+ \ifx\\#1\\\tabu@saveerr{}\else
+ \@ifundefined{tabu@saved@\string#1}
+ {\tabu@saveerr{#1}}
+ {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}%
+ \fi
+}% \NC@rewrite@\preamble
+%% Controlling the rewriting process -------------------------------
+\tabu@newcolumntype \tabu@rewritefirst{%
+ \iftabu@long \aftergroup \tabu@longpream %
+ \else \aftergroup \tabu@pream
+ \fi
+ \let\tabu@ \relax \let\tabu@hsize \relax
+ \let\tabu@Xcoefs \@empty \let\tabu@savels \relax
+ \tabu@Xcol \z@ \tabu@cnt \tw@
+ \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse
+ \global\setbox\@arstrutbox \box\@arstrutbox
+ \NC@list{\NC@do *}\tabu@textbar \tabu@lines
+ \NC@list\expandafter{\the\NC@list \NC@do X}%
+ \iftabu@siunitx %
+ \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi
+ \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}%
+ \expandafter\def\expandafter\tabu@NC@list\expandafter{%
+ \the\expandafter\NC@list \tabu@NC@list}% % * | X S
+ \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu
+ \expandafter \NC@do \expandafter\preamble
+ \the\NC@list \NC@do \tabu@rewritemiddle
+ \NC@do \tabu@rewritelast}%
+ \tabu@savedecl
+ \tabu@privatecolumns
+ \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle
+}% NC@rewrite@\tabu@rewritefirst
+\tabu@newcolumntype \tabu@rewritemiddle{%
+ \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast
+}% \NC@rewrite@\tabu@rewritemiddle
+\tabu@newcolumntype \tabu@rewritelast{%
+ \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne
+ \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle
+ \NC@do \tabu@rewritelast}%
+ \else \let\tabu@prev\tabu@temp
+ \fi
+ \ifcase \tabu@cnt \expandafter\tabu@endrewrite
+ \else \expandafter\NC@find \expandafter\tabu@rewritemiddle
+ \fi
+}% \NC@rewrite@\tabu@rewritelast
+%% Choosing the strategy --------------------------------------------
+\def\tabu@endrewrite {%
+ \let\tabu@temp \NC@find
+ \ifx \@arrayright\relax \let\@arrayright \@empty \fi
+ \count@=%
+ \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print
+ \iftabu@measuring
+ \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer
+ \tabu@target \csname tabu@\the\tabu@nested.T\endcsname
+ \tabucolX \csname tabu@\the\tabu@nested.X\endcsname
+ \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}%
+ \fi
+ \else\iftabu@measuring 4 % X columns
+ \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer
+ \tabu@target \the\tabu@target
+ \tabu@spreadtarget \the\tabu@spreadtarget}%
+ \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}%
+ \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}%
+ \let\tabu@Xcoefs \relax
+ \else\ifcase\tabu@nested \thr@@ % outer, no X
+ \global\let\tabu@afterendpar \relax
+ \else \@ne % inner, no X, outer in mode 1 or 2
+ \fi
+ \ifdefined\tabu@usetabu
+ \else \ifdim\tabu@target=\z@
+ \else \let\tabu@temp \tabu@extracolsep
+ \fi\fi
+ \fi
+ \fi
+ \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}%
+ \tabu@temp
+}% \tabu@endrewrite
+\def\tabu@extracolsep{\@defaultunits \expandafter\let
+ \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil
+ \ifx \tabu@temp\@sptoken
+ \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep
+ \else
+ \edef\tabu@temp{\noexpand\NC@find
+ \if |\noexpand\tabu@temp @%
+ \else\if !\noexpand\tabu@temp @%
+ \else !%
+ \fi\fi
+ {\noexpand\extracolsep\noexpand\@flushglue}}%
+ \fi
+ \tabu@temp
+}% \tabu@extrac@lsep
+%% Implementing the strategy ----------------------------------------
+\long\def\tabu@pream #1\@preamble {%
+ \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup
+ \NC@list\expandafter {\tabu@NC@list}% in case of nesting...
+ \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi
+ \let\tabu@savedpreamble \@preamble
+ \global\let\tabu@elapsedtime \relax
+ \tabu@thebody ={#1\tabu@aftergroupcleanup}%
+ \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody
+ \@preamble}%
+ \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens )
+ \tabu@select
+}% \tabu@pream
+\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{%
+ \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup
+ \NC@list\expandafter {\tabu@NC@list}% in case of nesting...
+ \let\tabu@savedpreamble \@preamble
+ \global\let\tabu@elapsedtime \relax
+ \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}%
+ \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens )
+ \tabu@select
+}% \tabu@longpream
+\def\tabu@select {%
+ \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi
+ \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi
+ \ifcase \count@
+ \global\let\tabu@elapsedtime \relax
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble % vertical adjustment (inherited from outer)
+ \or % exit in vertical measure + struts per cell because no X and outer in mode 3
+ \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble
+ \or % exit without measure because no X and outer in mode 4
+ \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble
+ \else % needs trials
+ \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty
+ \tabu@savecounters
+ \expandafter \tabu@setstrategy
+ \fi
+}% \tabu@select
+\def\tabu@@ {\gdef\tabu@mkpreambuffer}
+%% Protections to set up before trials ------------------------------
+\def\tabu@setstrategy {\begingroup %
+ \tabu@trialh@@k \tabu@cnt \z@ % number of trials
+ \hbadness \@M \let\hbadness \@tempcnta
+ \hfuzz \maxdimen \let\hfuzz \@tempdima
+ \let\write \tabu@nowrite\let\GenericError \tabu@GenericError
+ \let\savetabu \@gobble \let\tabudefaulttarget \linewidth
+ \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote
+ \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor
+ \let\tabu@aftergroupcleanup \relax % only after the last trial
+ \tabu@mkpreambuffer
+ \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init
+ \def\tabu@lasttry{\m@ne\p@}\fi
+ \begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi %
+ \tabu@collectbody \tabu@strategy %
+}% \tabu@setstrategy
+\def\tabu@savecounters{%
+ \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}%
+ \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax
+}% \tabu@savecounters
+\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0)
+ \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs
+ \ifdim \dimen@>\z@
+ \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax
+ \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi
+ \fi
+}% \tabucolX@init
+\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum
+ \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@
+ \else -#2\p@ \tabu@negcoeftrue
+ \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax
+ \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi
+ \tabu@wddef{#1}{0pt}%
+ \fi
+}% \tabu@Xinit
+%% Collecting the environment body ----------------------------------
+\long\def\tabu@collectbody #1#2\end #3{%
+ \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}%
+ \ifx \tabu@stack\@empty
+ \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}%
+ \def\tabu@end@envir{\end{#3}}%
+ \iftabuscantokens
+ \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}%
+ \else \def\tabu@endenvir {\let\endarray \@empty
+ \end{#3}\tabu@gobbleX}%
+ \fi
+ \else \def\tabu@endenvir {\end{#3}}\fi}%
+ \let\tabu@collectbody \tabu@endofcollect
+ \else\def\tabu@temp{#3}%
+ \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }%
+ \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}%
+ \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}%
+ \else \toks@\expandafter{\the\toks@ #2\end{#3}}%
+ \fi\fi\fi
+ \fi
+ \tabu@collectbody{#1}%
+}% \tabu@collectbody
+\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}%
+\def\tabu@endofcollect #1{\ifnum0=`{}\fi
+ \expandafter\endgroup \the\toks@ #1%
+}% \tabu@endofcollect
+%% The trials: switching between strategies -------------------------
+\def\tabu@strategy {\relax % stops \count@ assignment !
+ \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished)
+ \expandafter \tabu@endoftrials
+ \or % case 1 = exit in vertical measure (outer in mode 3)
+ \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}%
+ \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}%
+ \expandafter \tabu@endoftrials
+ \or % case 2 = exit with a rule replacing the table (outer in mode 4)
+ \expandafter \tabu@quickend
+ \or % case 3 = outer is in mode 3 because of no X
+ \begingroup
+ \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \expandafter \tabu@measuring
+ \else % case 4 = horizontal measure
+ \begingroup
+ \global\let\tabu@elapsedtime \tabu@message@etime
+ \long\def\multicolumn##1##2##3{\multispan{##1}}%
+ \let\tabu@startpboxORI \@startpbox
+ \iftabu@spread
+ \def\tabu@naturalXmax {\z@}%
+ \let\tabu@naturalXmin \tabu@naturalXmax
+ \tabu@evr{\global\tabu@naturalX \z@}%
+ \let\@startpbox \tabu@startpboxmeasure
+ \else\iftabu@negcoef
+ \let\@startpbox \tabu@startpboxmeasure
+ \else \let\@startpbox \tabu@startpboxquick
+ \fi\fi
+ \expandafter \tabu@measuring
+ \fi
+}% \tabu@strategy
+\def\tabu@measuring{\expandafter \tabu@trial \expandafter
+ \count@ \the\count@ \tabu@endtrial
+}% \tabu@measuring
+\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi}
+\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr
+ \ifx \tabu@savecounters\relax \else
+ \let\tabu@savecounters \relax \tabu@clckpt \fi
+ $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi
+ \expandafter{\expandafter \tabuthepreamble
+ \the\tabu@thebody
+ \csname tabu@adl@endtrial\endcsname
+ \endarray}$\egroup % got \tabu@box
+}% \tabu@shorttrial
+\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr
+ \ifx \tabu@savecounters\relax \else
+ \let\tabu@savecounters \relax \tabu@clckpt \fi
+ \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi
+ \expandafter{\expandafter \tabuthepreamble
+ \the\tabu@thebody
+ \tabuendlongtrial}\egroup % got \tabu@box
+}% \tabu@longtrial
+\def\tabuendlongtrial{% no @ allowed for \scantokens
+ \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne
+ \LT@get@widths
+}% \tabuendlongtrial
+\def\tabu@adl@endtrial{%
+ \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails !
+\def\tabu@seteverycr {\tabu@reset
+ \everycr \expandafter{\the\everycr \tabu@everycr}%
+ \let\everycr \tabu@noeverycr %
+}% \tabu@seteverycr
+\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@}
+\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr}
+\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi}
+\def\tabu@endoftrials {%
+ \iftabuscantokens \expandafter\@firstoftwo
+ \else \expandafter\@secondoftwo
+ \fi
+ {\expandafter \tabu@closetrialsgroup \expandafter
+ \tabu@rescan \expandafter{%
+ \expandafter\tabuthepreamble
+ \the\expandafter\tabu@thebody
+ \iftabu@long \else \endarray \fi}}
+ {\expandafter\tabu@closetrialsgroup \expandafter
+ \tabuthepreamble
+ \the\tabu@thebody}%
+ \tabu@endenvir % Finish !
+}% \tabu@endoftrials
+\def\tabu@closetrialsgroup {%
+ \toks@\expandafter{\tabu@endenvir}%
+ \edef\tabu@bufferX{\endgroup
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target
+ \tabu@cnt \the\tabu@cnt
+ \def\noexpand\tabu@endenvir{\the\toks@}%
+ %Quid de \@halignto = \tabu@halignto ??
+ }% \tabu@bufferX
+ \tabu@bufferX
+ \ifcase\tabu@nested % print out (outer in mode 0)
+ \global\tabu@cnt \tabu@cnt
+ \tabu@evr{\tabu@verticaldynamicadjustment}%
+ \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty
+ \let\@finalstrut \tabu@finalstrut
+ \else % vertical measure of nested tabu
+ \tabu@evr{\tabu@verticalinit}%
+ \tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \fi
+ \tabu@clckpt \let\@halignto \tabu@halignto
+ \let\@halignto \@empty
+ \tabu@seteverycr
+ \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@
+ \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts)
+ \fi\fi
+}% \tabu@closetrialsgroup
+\def\tabu@quickend {\expandafter \endgroup \expandafter
+ \tabu@target \the\tabu@target \tabu@quickrule
+ \let\endarray \relax \tabu@endenvir
+}% \tabu@quickend
+\def\tabu@endtrial {\relax % stops \count@ assignment !
+ \ifcase \count@ \tabu@err % case 0 = impossible here
+ \or \tabu@err % case 1 = impossible here
+ \or \tabu@err % case 2 = impossible here
+ \or % case 3 = outer goes into mode 0
+ \def\tabu@bufferX{\endgroup}\count@ \z@
+ \else % case 4 = outer goes into mode 3
+ \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3)
+ \else \tabu@arith % or 2 (outer in mode 4)
+ \fi
+ \count@=%
+ \ifcase\tabu@nested \thr@@ % outer goes into mode 3
+ \else\iftabu@measuring \tw@ % outer is in mode 4
+ \else \@ne % outer is in mode 3
+ \fi\fi
+ \edef\tabu@bufferX{\endgroup
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target}%
+ \fi
+ \expandafter \tabu@bufferX \expandafter
+ \count@ \the\count@ \tabu@strategy
+}% \tabu@endtrial
+\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}}
+%% The algorithms: compute the widths / stop or go on ---------------
+\def\tabu@arithnegcoef {%
+ \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs
+}% \tabu@arithnegcoef
+\def\tabu@arith@negcoef #1#2{%
+ \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition
+ \advance\@tempdima #2\tabucolX
+ \else
+ \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated
+ \advance\dimen@ -#2\p@
+ \advance\@tempdima -#2\tabucolX
+ \else
+ \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised
+ \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised
+ \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target)
+ \fi
+ \fi
+ \fi
+}% \tabu@arith@negcoef
+\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@
+ \ifdim \@tempdima=\z@
+ \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}%
+ \else
+ \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2}
+ *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}%
+ \fi
+}% \tabu@givespace
+\def\tabu@arith {\advance\tabu@cnt \@ne
+ \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi
+ \tabu@arithnegcoef
+ \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax %
+ \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax
+ \tabu@message{\tabu@message@arith}%
+ \ifdim \tabu@DELTA <\tabu@hfuzz
+ \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ?
+ \let\tabu@ \tabu@givespace \tabu@Xcoefs
+ \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message
+ \else % already converged: nothing to do but nearly impossible...
+ \fi
+ \tabucolX \maxdimen
+ \tabu@measuringfalse
+ \else % need for narrower X columns
+ \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax
+ \tabu@measuringtrue
+ \@whilesw \iftabu@measuring\fi {%
+ \advance\tabu@cnt \@ne
+ \tabu@arithnegcoef
+ \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here
+ \tabu@message{\tabu@header
+ \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@
+ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@
+ \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else
+ \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@
+ \fi}%
+ \ifdim -\tabu@DELTA<\tabu@hfuzz
+ \advance\@tempdima \@tempdimb % for message
+ \tabu@measuringfalse
+ \else
+ \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax
+ \fi
+ }%
+ \fi
+ \tabu@message{\tabu@message@reached}%
+ \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target}%
+}% \tabu@arith
+\def\tabu@spreadarith {%
+ \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs
+ \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}%
+ \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax
+ \iftabu@measuring
+ \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax
+ \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}%
+ \else
+ \tabu@message{\tabu@message@spreadarith}%
+ \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target
+ \tabu@message{(tabu) spread
+ \ifdim \@tempdimc>\tabu@target useless here: default target used%
+ \else too large: reduced to fit default target\fi.}%
+ \else
+ \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax
+ \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}%
+ \fi
+ \begingroup \let\tabu@wddef \@gobbletwo
+ \@tempdimb \@tempdima
+ \tabucolX@init
+ \tabu@arithnegcoef
+ \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax
+ \expandafter\endgroup \expandafter\tabucolX \the\tabucolX
+ \tabu@arith
+ \fi
+}% \tabu@spreadarith
+\def\tabu@spread@arith #1#2{%
+ \ifdim #2\p@>\z@ \advance\dimen@ #2\p@
+ \else \advance\@tempdima \tabu@wd{#1}\relax
+ \fi
+}% \tabu@spread@arith
+%% Reporting in the .log file ---------------------------------------
+\def\tabu@message@defaulttarget{%
+ \ifnum\tabu@nested=\z@^^J(tabu) Default target:
+ \ifx\tabudefaulttarget\linewidth \string\linewidth
+ \ifdim \tabu@thetarget=\linewidth \else
+ -\the\dimexpr\linewidth-\tabu@thetarget\fi =
+ \else\ifx\tabudefaulttarget\linegoal\string\linegoal=
+ \fi\fi
+ \else (tabu) Default target (nested): \fi
+ \the\tabu@target \on@line
+ \ifnum\tabu@nested=\z@ , page \the\c@page\fi}
+\def\tabu@message@target {^^J(tabu) Target specified:
+ \the\tabu@target \on@line, page \the\c@page}
+\def\tabu@message@arith {\tabu@header
+ \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@
+ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@
+ \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else
+ \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@
+ \fi
+}% \tabu@message@arith
+\def\tabu@message@spreadarith {\tabu@spreadheader
+ \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@
+ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@
+ \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@
+ \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@
+ \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target
+ \else \@tempdimc+\tabu@spreadtarget \fi
+ {}{}{}{}{}\@@}
+\def\tabu@message@negcoef #1#2{
+ \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]:
+ \space width = \tabu@wd {#1}
+ \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname
+ \ifdim -\tabu@pt#2\tabucolX<\tabu@target
+ < \number-\rem@pt#2 X
+ = \the\dimexpr -\tabu@pt#2\tabucolX \relax
+ \else
+ <= \the\tabu@target\space < \number-\rem@pt#2 X\fi}
+\def\tabu@message@reached{\tabu@header
+ ******* Reached Target:
+ hfuzz = \tabu@hfuzz\on@line\space *******}
+\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}%
+ \tabu@message{(tabu)\tabu@spaces Time elapsed during measure:
+ \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec
+ \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime)
+ -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax
+ *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space
+ cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}}
+\def\tabu@message@verticalsp {%
+ \ifdim \@tempdima>\tabu@ht
+ \ifdim \@tempdimb>\tabu@dp
+ \expandafter\expandafter\expandafter\string\tabu@ht =
+ \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@
+ \expandafter\expandafter\expandafter\string\tabu@dp =
+ \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J%
+ \else
+ \expandafter\expandafter\expandafter\string\tabu@ht =
+ \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J%
+ \fi
+ \else\ifdim \@tempdimb>\tabu@dp
+ \tabu@spaces\tabu@spaces\tabu@spaces
+ \expandafter\expandafter\expandafter\string\tabu@dp =
+ \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi
+ \fi
+}% \tabu@message@verticalsp
+\edef\tabu@spaces{\@spaces}
+\def\tabu@strippt{\expandafter\tabu@pt\the}
+{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}}
+\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr}
+\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt}
+\def\do #1{%
+ \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{%
+ \ifnum##1<10 #1 #1\else
+ \ifnum##1<100 #1 \else
+ \ifnum##1<\@m #1\fi\fi\fi
+ ##1.##2##3##4##5##6##7##8#1}%
+ \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }%
+ \def\tabu@titles{\ifnum \tabu@nested=\z@
+ (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target
+ #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}%
+ \def\tabu@spreadheader{%
+ (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min.
+ #1 New Target^^J%
+ (tabu) sprd}
+ \def\tabu@message@save {\begingroup
+ \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@}
+ \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt
+ \dimexpr####1\p@{ }{ }}}%
+ \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}%
+ \let\CT@arc@ \relax \let\@preamble \@gobble
+ \let\tabu@savedpream \@firstofone
+ \let\tabu@savedparams \@firstofone
+ \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}%
+ \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}%
+ \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}%
+ \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}%
+ \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}%
+ \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}%
+ \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}%
+ \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}%
+ \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}%
+ \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}%
+ \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }%
+ \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}%
+ \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}%
+ \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}%
+ \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}%
+ \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}%
+ \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}%
+ \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}%
+ \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}%
+ \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}%
+ \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo
+ \tabu@message{%
+ (tabu) \string\savetabu{\tabu@temp}: \on@line^^J%
+ \tabu@usetabu \@nil^^J}%
+ \endgroup}
+}\do{ }
+%% Measuring the natural width (varwidth) - store the results -------
+\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop
+ \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}%
+ \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ?
+ \iftabu@spread \else % if spread -> measure
+ \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure
+ \let\@startpbox \tabu@startpboxORI % restore immediately (nesting)
+ \tabu@measuringtrue % for the quick option...
+ \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi
+ \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target
+ \tabu@target=\tabu@temp\tabucolX \fi\fi
+ \setbox\tabu@box \hbox \bgroup
+ \begin{varwidth}\tabu@target
+ \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width...
+ \narrowragged \arraybackslash \parfillskip \@flushglue
+ \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi
+ \bgroup \aftergroup\tabu@endpboxmeasure
+ \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi
+ \else \expandafter\@gobble
+ \tabu@startpboxquick{#1}% \@gobble \bgroup
+ \fi
+}% \tabu@startpboxmeasure
+\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty
+ \bgroup\color@begingroup}
+\def\tabu@endpboxmeasure {%
+ \@finalstrut \@arstrutbox
+ \end{varwidth}\egroup %
+ \ifdim \tabu@temp\p@ <\z@ % neg coef
+ \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box
+ \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}%
+ \tabu@debug{\tabu@message@endpboxmeasure}%
+ \fi
+ \else % spread coef>0
+ \global\advance \tabu@naturalX \wd\tabu@box
+ \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax
+ \ifdim \tabu@naturalXmax <\tabu@naturalX
+ \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi
+ \ifdim \tabu@naturalXmin <\@tempdima
+ \xdef\tabu@naturalXmin {\the\@tempdima}\fi
+ \fi
+ \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target
+}% \tabu@endpboxmeasure
+\def\tabu@wddef #1{\expandafter\xdef
+ \csname tabu@\the\tabu@nested.W\number#1\endcsname}
+\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname}
+\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd
+ \the\tabu@Xcol. X[\tabu@temp]:
+ target = \the\tabucolX \space
+ \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol
+ =\tabu@wd\tabu@Xcol
+}% \tabu@message@endpboxmeasure
+\def\tabu@startpboxquick {\bgroup
+ \let\@startpbox \tabu@startpboxORI % restore immediately
+ \let\tabu \tabu@quick % \begin is expanded before...
+ \expandafter\@gobble \@startpbox % gobbles \bgroup
+}% \tabu@startpboxquick
+\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick
+}% \tabu@quick
+\def\tabu@endquick {%
+ \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else
+ \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax
+ \endgroup
+ \else \let\endtabu \relax
+ \tabu@end@envir
+ \fi
+}% \tabu@quick
+\def\tabu@endtabu {\end{tabu}}
+\def\tabu@endtabus {\end{tabu*}}
+%% Measuring the heights and depths - store the results -------------
+\def\tabu@verticalmeasure{\everypar{}%
+ \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group
+ \setbox\tabu@box =\hbox\bgroup
+ \let\tabu@verticalspacing \tabu@verticalsp@lcr
+ \d@llarbegin % after \hbox ...
+ \else
+ \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop
+ \else\ifnum\currentgrouptype=12\vcenter
+ \else\vbox\fi\fi}%
+ \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup
+ \let\tabu@verticalspacing \tabu@verticalsp@pmb
+ \fi
+}% \tabu@verticalmeasure
+\def\tabu@verticalsp@lcr{%
+ \d@llarend \egroup %
+ \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep
+ \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax
+ \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi
+ \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi
+ \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi
+ \noindent\vrule height\@tempdima depth\@tempdimb
+}% \tabu@verticalsp@lcr
+\def\tabu@verticalsp@pmb{% inserts struts as needed
+ \par \expandafter\egroup
+ \expandafter$\expandafter
+ \egroup \expandafter
+ \@tempdimc \the\prevdepth
+ \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep
+ \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax
+ \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi
+ \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi
+ \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi
+ \let\@finalstrut \@gobble
+ \hrule height\@tempdima depth\@tempdimb width\hsize
+%% \box\tabu@box
+}% \tabu@verticalsp@pmb
+
+\def\tabu@verticalinit{%
+ \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset !
+ \advance\c@taburow \@ne
+ \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}%
+ \advance\c@taburow \m@ne
+}% \tabu@verticalinit
+\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname}
+\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname}
+\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname}
+\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname}
+\def\tabu@verticaldynamicadjustment {%
+ \advance\c@taburow \@ne
+ \extrarowheight \dimexpr\tabu@ht - \ht\strutbox
+ \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox
+ \let\arraystretch \@empty
+ \advance\c@taburow \m@ne
+}% \tabu@verticaldynamicadjustment
+\def\tabuphantomline{\crcr \noalign{%
+ {\globaldefs \@ne
+ \setbox\@arstrutbox \box\voidb@x
+ \let\tabu@@celllalign \tabu@celllalign
+ \let\tabu@@cellralign \tabu@cellralign
+ \let\tabu@@cellleft \tabu@cellleft
+ \let\tabu@@cellright \tabu@cellright
+ \let\tabu@@thevline \tabu@thevline
+ \let\tabu@celllalign \@empty
+ \let\tabu@cellralign \@empty
+ \let\tabu@cellright \@empty
+ \let\tabu@cellleft \@empty
+ \let\tabu@thevline \relax}%
+ \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}%
+ \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr
+ \noalign{\tabu@rearstrut
+ {\globaldefs\@ne
+ \let\tabu@celllalign \tabu@@celllalign
+ \let\tabu@cellralign \tabu@@cellralign
+ \let\tabu@cellleft \tabu@@cellleft
+ \let\tabu@cellright \tabu@@cellright
+ \let\tabu@thevline \tabu@@thevline}}}%
+ \expandafter}\the\toks@
+}% \tabuphantomline
+%% \firsthline and \lasthline corrections ---------------------------
+\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}}
+\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline}
+\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}}
+\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline}
+\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument)
+ \noalign{\ifnum0=`}\fi
+ {\CT@arc@\hrule height\arrayrulewidth}%
+ \futurelet \tabu@temp \tabu@xhline
+}% \tabu@hline
+\def\tabu@xhline{%
+ \ifx \tabu@temp \hline
+ {\ifx \CT@drsc@\relax \vskip
+ \else\ifx \CT@drsc@\@empty \vskip
+ \else \CT@drsc@\hrule height
+ \fi\fi
+ \doublerulesep}%
+ \fi
+ \ifnum0=`{\fi}%
+}% \tabu@xhline
+\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@
+ \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}%
+ \tabu@hlineAZsurround
+}% \tabu@hlineAZ
+\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{%
+ \extratabsurround #1\let\tabucline \tabucline@scan
+ \let\hline \tabu@hlinescan \let\firsthline \hline
+ \let\cline \tabu@clinescan \let\lasthline \hline
+ \expandafter \futurelet \expandafter \tabu@temp
+ \expandafter \tabu@nexthlineAZ \tabu@temp
+}% \tabu@hlineAZsurround
+\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline}
+\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}}
+\def\tabucline@scan{\@testopt \tabucline@sc@n {}}
+\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}}
+\def\tabu@nexthlineAZ{%
+ \ifx \tabu@temp\hline \else
+ \ifx \tabu@temp\cline \else
+ \ifx \tabu@temp\tabucline \else
+ \tabu@hlinecorrection
+ \fi\fi\fi
+}% \tabu@nexthlineAZ
+\def\tabu@xhlineAZ #1{%
+ \toks@\expandafter{\the\toks@ #1}%
+ \@tempdimc \tabu@thick % The last line width
+ \ifcase\count@ \@tempdimb \tabu@thick % The first line width
+ \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax
+ \fi
+ \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ
+}% \tabu@xhlineAZ
+\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1
+ \@tempdima \dimexpr \ht\@arstrutbox+\dimen@
+ \edef\firsthline{%
+ \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule
+ height \the\dimexpr\@tempdima+\extratabsurround
+ depth \dp\@arstrutbox
+ width \tabustrutrule}\hss}\cr
+ \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb
+ +\dp\@arstrutbox \relax}%
+ \the\toks@
+ }\ifnum0=`{\fi
+ \expandafter}\firsthline % we are then !
+}% \tabu@firsthlinecorrection
+\def\tabu@lasthlinecorrection{%
+ \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc
+ \edef\lasthline{%
+ \the\toks@
+ \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}%
+ \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule
+ depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@
+ +\extratabsurround-\@tempdimc
+ height \z@
+ width \tabustrutrule}\hss}\cr
+ }\ifnum0=`{\fi
+ \expandafter}\lasthline % we are then !
+}% \tabu@lasthlinecorrection
+\def\tabu@LT@@hline{%
+ \ifx\LT@next\hline
+ \global\let\LT@next \@gobble
+ \ifx \CT@drsc@\relax
+ \gdef\CT@LT@sep{%
+ \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}%
+ \else
+ \gdef\CT@LT@sep{%
+ \multispan\LT@cols{%
+ \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}%
+ \fi
+ \else
+ \global\let\LT@next\empty
+ \gdef\CT@LT@sep{%
+ \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
+ \CT@LT@sep
+ \multispan\LT@cols
+ {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
+ \noalign{\penalty\@M}%
+ \LT@next
+}% \tabu@LT@@hline
+%% Horizontal lines : \tabucline ------------------------------------
+\let\tabu@start \@tempcnta
+\let\tabu@stop \@tempcntb
+\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline}
+\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}%
+ \ifnum \tabu@stop<\z@ \toks@{}%
+ \else \tabu@clinearg{#1}\tabu@thestyle
+ \edef\tabucline{\toks@{%
+ \ifnum \tabu@start>\z@ \omit
+ \tabu@multispan\tabu@start {\span\omit}&\fi
+ \omit \tabu@multispan\tabu@stop {\span\omit}%
+ \tabu@thehline\cr
+ }}\tabucline
+ \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}%
+ \fi
+ \futurelet \tabu@temp \tabu@xcline
+}% \tabu@cline
+\def\tabu@clinearg #1{%
+ \ifx\\#1\\\let\tabu@thestyle \tabu@ls@
+ \else \@defaultunits \expandafter\let\expandafter\@tempa
+ \romannumeral-`\0#1\relax \@nnil
+ \ifx \hbox\@tempa \tabu@clinebox{#1}%
+ \else\ifx \box\@tempa \tabu@clinebox{#1}%
+ \else\ifx \vbox\@tempa \tabu@clinebox{#1}%
+ \else\ifx \vtop\@tempa \tabu@clinebox{#1}%
+ \else\ifx \copy\@tempa \tabu@clinebox{#1}%
+ \else\ifx \leaders\@tempa \tabu@clineleads{#1}%
+ \else\ifx \cleaders\@tempa \tabu@clineleads{#1}%
+ \else\ifx \xleaders\@tempa \tabu@clineleads{#1}%
+ \else\tabu@getline {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi
+ \fi
+}% \tabu@clinearg
+\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}}
+\def\tabu@clineleads #1{%
+ \let\tabu@thestyle \relax \let\tabu@leaders \@undefined
+ \gdef\tabu@thehrule{#1}}
+\def\tabu@thehline{\begingroup
+ \ifdefined\tabu@leaders
+ \noexpand\tabu@thehleaders
+ \else \noexpand\tabu@thehrule
+ \fi \endgroup
+}% \tabu@thehline
+\def\tabu@xcline{%
+ \ifx \tabu@temp\tabucline
+ \toks@\expandafter{\the\toks@ \noalign
+ {\ifx\CT@drsc@\relax \vskip
+ \else \CT@drsc@\hrule height
+ \fi
+ \doublerulesep}}%
+ \fi
+ \tabu@docline
+}% \tabu@xcline
+\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@}
+\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}%
+ \ifnum0=`{\fi}\aftergroup\tabu@doclineafter}
+\def\tabu@multispan #1#2{%
+ \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan
+ \else \expandafter\@gobbletwo
+ \fi {#1-1}{#2}%
+}% \tabu@multispan
+\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil}
+\def\tabu@start@stop #1-#2\@nnil{%
+ \@defaultunits \tabu@start\number 0#1\relax \@nnil
+ \@defaultunits \tabu@stop \number 0#2\relax \@nnil
+ \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne
+ \else\ifnum \tabu@stop=\z@ \tabu@nbcols
+ \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols
+ \else \tabu@stop
+ \fi\fi\fi
+ \advance\tabu@start \m@ne
+ \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi
+}% \tabu@start@stop
+%% Numbers: siunitx S columns (and \tabudecimal) -------------------
+\def\tabu@tabudecimal #1{%
+ \def\tabu@decimal{#1}\@temptokena{}%
+ \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces
+ \tabu@scandecimal
+}% \tabu@tabudecimal
+\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@}
+\def\tabu@skipdecimal#1{#1\tabu@scandecimal}
+\def\tabu@getdecimal@ignorespaces{%
+ \ifcase 0\ifx\tabu@temp\ignorespaces\else
+ \ifx\tabu@temp\@sptoken1\else
+ 2\fi\fi\relax
+ \let\tabu@getdecimal@ \tabu@getdecimal
+ \expandafter\tabu@skipdecimal
+ \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal
+ \else \expandafter\tabu@skipdecimal
+ \fi
+}% \tabu@getdecimal@ignorespaces
+\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}%
+ \tabu@scandecimal}
+\def\do#1{%
+ \def\tabu@get@decimalspace#1{%
+ \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}%
+}\do{ }
+\let\tabu@@tabudecimal \tabu@tabudecimal
+\def\tabu@getdecimal{%
+ \ifcase 0\ifx 0\tabu@temp\else
+ \ifx 1\tabu@temp\else
+ \ifx 2\tabu@temp\else
+ \ifx 3\tabu@temp\else
+ \ifx 4\tabu@temp\else
+ \ifx 5\tabu@temp\else
+ \ifx 6\tabu@temp\else
+ \ifx 7\tabu@temp\else
+ \ifx 8\tabu@temp\else
+ \ifx 9\tabu@temp\else
+ \ifx .\tabu@temp\else
+ \ifx ,\tabu@temp\else
+ \ifx -\tabu@temp\else
+ \ifx +\tabu@temp\else
+ \ifx e\tabu@temp\else
+ \ifx E\tabu@temp\else
+ \ifx\tabu@cellleft\tabu@temp1\else
+ \ifx\ignorespaces\tabu@temp1\else
+ \ifx\@sptoken\tabu@temp2\else
+ 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax
+ \expandafter\tabu@get@decimal
+ \or \expandafter\tabu@skipdecimal
+ \or \expandafter\tabu@get@decimalspace
+ \else\expandafter\tabu@printdecimal
+ \fi
+}% \tabu@getdecimal
+\def\tabu@printdecimal{%
+ \edef\tabu@temp{\the\@temptokena}%
+ \ifx\tabu@temp\@empty\else
+ \ifx\tabu@temp\space\else
+ \expandafter\tabu@decimal\expandafter{\the\@temptokena}%
+ \fi\fi
+}% \tabu@printdecimal
+%% Verbatim inside X columns ----------------------------------------
+\def\tabu@verbatim{%
+ \let\verb \tabu@verb
+ \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd
+}% \tabu@verbatim
+\let\tabu@ltx@verb \verb
+\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb}
+\def\tabu@fancyvrb {%
+ \def\tabu@FV@DefineCheckEnd ##1{%
+ \def\tabu@FV@DefineCheckEnd{%
+ ##1%
+ \let\FV@CheckEnd \tabu@FV@CheckEnd
+ \let\FV@@CheckEnd \tabu@FV@@CheckEnd
+ \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd
+ \edef\FV@EndScanning{%
+ \def\noexpand\next{\noexpand\end{\FV@EnvironName}}%
+ \global\let\noexpand\FV@EnvironName\relax
+ \noexpand\next}%
+ \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}%
+ }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd}
+}% \tabu@fancyvrb
+\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil}
+\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}}
+\begingroup
+\catcode`\[1 \catcode`\]2
+\@makeother\{ \@makeother\}
+ \edef\x[\endgroup
+ \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3%
+ ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}}
+\def\tabu@FV@ListProcessLine #1{%
+ \hbox {%to \hsize{%
+ \kern\leftmargin
+ \hbox {%to \linewidth{%
+ \FV@LeftListNumber
+ \FV@LeftListFrame
+ \FancyVerbFormatLine{#1}\hss
+%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on)
+%% \FV@RightListFrame}%
+ \FV@RightListFrame
+ \FV@RightListNumber}%
+%% DG/SR modification end
+ \hss}}
+%% \savetabu --------------------------------------------------------
+\newcommand*\savetabu[1]{\noalign{%
+ \tabu@sanitizearg{#1}\tabu@temp
+ \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else
+ \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}%
+ \ifdefined\tabu@restored \expandafter\let
+ \csname tabu@saved@\tabu@temp \endcsname \tabu@restored
+ \else {\tabu@save}%
+ \fi
+ \fi}%
+}% \savetabu
+\def\tabu@save {%
+ \toks0\expandafter{\tabu@saved@}%
+ \iftabu@negcoef
+ \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}%
+ \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi
+ \toks1\expandafter{\tabu@savedpream}%
+ \toks2\expandafter{\tabu@savedpreamble}%
+ \let\@preamble \relax
+ \let\tabu@savedpream \relax \let\tabu@savedparams \relax
+ \edef\tabu@preamble{%
+ \def\noexpand\tabu@aligndefault{\tabu@align}%
+ \def\tabu@savedparams {\noexpand\the\toks0}%
+ \def\tabu@savedpream {\noexpand\the\toks1}}%
+ \edef\tabu@usetabu{%
+ \def\@preamble {\noexpand\the\toks2}%
+ \tabu@target \the\tabu@target \relax
+ \tabucolX \the\tabucolX \relax
+ \tabu@nbcols \the\tabu@nbcols \relax
+ \def\noexpand\tabu@aligndefault{\tabu@align}%
+ \def\tabu@savedparams {\noexpand\the\toks0}%
+ \def\tabu@savedpream {\noexpand\the\toks1}}%
+ \let\tabu@aligndefault \relax \let\@sharp \relax
+ \edef\@tempa{\noexpand\tabu@s@ved
+ {\tabu@usetabu}
+ {\tabu@preamble}
+ {\the\toks1}}\@tempa
+ \tabu@message@save
+}% \tabu@save
+\long\def\tabu@s@ved #1#2#3{%
+ \def\tabu@usetabu{#1}%
+ \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{%
+ \ifodd ##1% \usetabu
+ \tabu@measuringfalse \tabu@spreadfalse % Just in case...
+ \gdef\tabu@usetabu {%
+ \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi
+ \global\let\tabu@usetabu \@undefined
+ \def\@halignto {to\tabu@target}%
+ #1%
+ \ifx \tabu@align\tabu@aligndefault@text
+ \ifnum \tabu@nested=\z@
+ \let\tabu@align \tabu@aligndefault \fi\fi}%
+ \else % \preamble
+ \gdef\tabu@preamble {%
+ \global\let\tabu@preamble \@undefined
+ #2%
+ \ifx \tabu@align\tabu@aligndefault@text
+ \ifnum \tabu@nested=\z@
+ \let\tabu@align \tabu@aligndefault \fi\fi}%
+ \fi
+ #3}%
+}% \tabu@s@ved
+\def\tabu@aligndefault@text {\tabu@aligndefault}%
+\def\tabu@warn@usetabu {\PackageWarning{tabu}
+ {Specifying a target with \string\usetabu\space is useless
+ \MessageBreak The target cannot be changed!}}
+\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi}
+\def\tabu@savewarn#1#2{\PackageInfo{tabu}
+ {User-name `#1' already used for \string\savetabu
+ \MessageBreak #2}}%
+\def\tabu@saveerr#1{\PackageError{tabu}
+ {User-name `#1' is unknown for \string\usetabu
+ \MessageBreak I cannot restore an unknown preamble!}\@ehd}
+%% \rowfont ---------------------------------------------------------
+\newskip \tabu@cellskip
+\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi
+ {\ifnum0=`}\fi \tabu@row@font}
+\newcommand*\tabu@row@font[2][]{%
+ \ifnum7=\currentgrouptype
+ \global\let\tabu@@cellleft \tabu@cellleft
+ \global\let\tabu@@cellright \tabu@cellright
+ \global\let\tabu@@celllalign \tabu@celllalign
+ \global\let\tabu@@cellralign \tabu@cellralign
+ \global\let\tabu@@rowfontreset\tabu@rowfontreset
+ \fi
+ \global\let\tabu@rowfontreset \tabu@rowfont@reset
+ \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}%
+ \ifcsname tabu@cell@#1\endcsname % row alignment
+ \csname tabu@cell@#1\endcsname \fi
+ \ifnum0=`{\fi}% end of group / noalign group
+}% \rowfont
+\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}%
+\def\tabu@rowfont@reset{%
+ \global\let\tabu@rowfontreset \tabu@@rowfontreset
+ \global\let\tabu@cellleft \tabu@@cellleft
+ \global\let\tabu@cellright \tabu@@cellright
+ \global\let\tabu@cellfont \@empty
+ \global\let\tabu@celllalign \tabu@@celllalign
+ \global\let\tabu@cellralign \tabu@@cellralign
+}% \tabu@@rowfontreset
+\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl
+%% \tabu@prepnext@tok -----------------------------------------------
+\newif \iftabu@cellright
+\def\tabu@prepnext@tok{%
+ \ifnum \count@<\z@ %
+ \@tempcnta \@M %
+ \tabu@nbcols\z@
+ \let\tabu@fornoopORI \@fornoop
+ \tabu@cellrightfalse
+ \else
+ \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left
+ \advance \tabu@nbcols \@ne
+ \iftabu@cellright % before-previous token is right and is finished
+ \tabu@cellrightfalse %
+ \tabu@righttok
+ \fi
+ \tabu@lefttok
+ \or % (case 1) previous token is right
+ \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop
+ \else % special column: do not change the token
+ \iftabu@cellright % before-previous token is right
+ \tabu@cellrightfalse
+ \tabu@righttok
+ \fi
+ \fi % \ifcase
+ \fi
+ \tabu@prepnext@tokORI
+}% \tabu@prepnext@tok
+\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@}
+\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{%
+ \ifx \in@#2\else
+ \let\@fornoop \tabu@fornoopORI
+ \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}%
+ \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}%
+ \expandafter\prepnext@tok
+ \fi
+}% \tabu@lastnoop
+\def\tabu@righttok{%
+ \advance \count@ \m@ne
+ \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}%
+ \advance \count@ \@ne
+}% \tabu@righttok
+\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign
+ \the\toks\count@ \tabu@cellleft}% after because of $
+}% \tabu@lefttok
+%% Neutralisation of glues ------------------------------------------
+\let\tabu@cellleft \@empty
+\let\tabu@cellright \@empty
+\tabu@celllalign@def{\tabu@cellleft}%
+\let\tabu@cellralign \@empty
+\def\tabu@cell@align #1#2#3{%
+ \let\tabu@maybesiunitx \toks@ \tabu@celllalign
+ \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}%
+ \toks@\expandafter{\tabu@cellralign #2}%
+ \xdef\tabu@cellralign{\the\toks@}%
+ \toks@\expandafter{\tabu@cellleft #3}%
+ \xdef\tabu@cellleft{\the\toks@}%
+}% \tabu@cell@align
+\def\tabu@cell@l{% force alignment to left
+ \tabu@cell@align
+ {\tabu@removehfil \raggedright \tabu@cellleft}% left
+ {\tabu@flush1\tabu@ignorehfil}% right
+ \raggedright
+}% \tabu@cell@l
+\def\tabu@cell@c{% force alignment to center
+ \tabu@cell@align
+ {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft}
+ {\tabu@flush{.5}\tabu@ignorehfil}
+ \centering
+}% \tabu@cell@c
+\def\tabu@cell@r{% force alignment to right
+ \tabu@cell@align
+ {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft}
+ \tabu@ignorehfil
+ \raggedleft
+}% \tabu@cell@r
+\def\tabu@cell@j{% force justification (for p, m, b columns)
+ \tabu@cell@align
+ {\tabu@justify\tabu@cellleft}
+ {}
+ \tabu@justify
+}% \tabu@cell@j
+\def\tabu@justify{%
+ \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip
+ \parfillskip\@flushglue
+}% \tabu@justify
+%% ragged2e settings
+\def\tabu@cell@L{% force alignment to left (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \RaggedRight \tabu@cellleft}
+ {\tabu@flush 1\tabu@ignorehfil}
+ \RaggedRight
+}% \tabu@cell@L
+\def\tabu@cell@C{% force alignment to center (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft}
+ {\tabu@flush{.5}\tabu@ignorehfil}
+ \Centering
+}% \tabu@cell@C
+\def\tabu@cell@R{% force alignment to right (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft}
+ \tabu@ignorehfil
+ \RaggedLeft
+}% \tabu@cell@R
+\def\tabu@cell@J{% force justification (ragged2e)
+ \tabu@cell@align
+ {\justifying \tabu@cellleft}
+ {}
+ \justifying
+}% \tabu@cell@J
+\def\tabu@flush#1{%
+ \iftabu@colortbl % colortbl uses \hfill rather than \hfil
+ \hskip \ifnum13<\currentgrouptype \stretch{#1}%
+ \else \ifdim#1pt<\p@ \tabu@cellskip
+ \else \stretch{#1}
+ \fi\fi \relax
+ \else % array.sty
+ \ifnum 13<\currentgrouptype
+ \hfil \hskip1sp \relax \fi
+ \fi
+}% \tabu@flush
+\let\tabu@hfil \hfil
+\let\tabu@hfill \hfill
+\let\tabu@hskip \hskip
+\def\tabu@removehfil{%
+ \iftabu@colortbl
+ \unkern \tabu@cellskip =\lastskip
+ \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip
+ \else \tabu@cellskip \z@skip
+ \fi
+ \else
+ \ifdim\lastskip=1sp\unskip\fi
+ \ifnum\gluestretchorder\lastskip =\@ne
+ \hfilneg % \hfilneg for array.sty but not for colortbl...
+ \fi
+ \fi
+}% \tabu@removehfil
+\def\tabu@ignorehfil{\aftergroup \tabu@nohfil}
+\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil
+ \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group
+}% \tabu@nohfil
+\def\tabu@colortblalignments {% if colortbl
+ \def\tabu@nohfil{%
+ \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group
+ \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff...
+ \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local
+}% \tabu@colortblalignments
+%% Taking care of footnotes and hyperfootnotes ----------------------
+\long\def\tabu@footnotetext #1{%
+ \edef\@tempa{\the\tabu@footnotes
+ \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}%
+ \global\tabu@footnotes\expandafter{\@tempa {#1}}}%
+\long\def\tabu@xfootnotetext [#1]#2{%
+ \global\tabu@footnotes\expandafter{\the\tabu@footnotes
+ \footnotetext [{#1}]{#2}}}
+\let\tabu@xfootnote \@xfootnote
+\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }}
+\long\def\tabu@Hy@xfootnote [#1]{%
+ \begingroup
+ \value\@mpfn #1\relax
+ \protected@xdef \@thefnmark {\thempfn}%
+ \endgroup
+ \@footnotemark \tabu@Hy@ftntxt {#1}%
+}% \tabu@Hy@xfootnote
+\long\def\tabu@Hy@ftntxt #1#2{%
+ \edef\@tempa{%
+ \the\tabu@footnotes
+ \begingroup
+ \value\@mpfn #1\relax
+ \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}%
+ \expandafter \noexpand \expandafter
+ \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}%
+ }%
+ \global\tabu@footnotes\expandafter{\@tempa {#2}%
+ \endgroup}%
+}% \tabu@Hy@ftntxt
+\long\def\tabu@Hy@footnotetext #1#2{%
+ \H@@footnotetext{%
+ \ifHy@nesting
+ \hyper@@anchor {#1}{#2}%
+ \else
+ \Hy@raisedlink{%
+ \hyper@@anchor {#1}{\relax}%
+ }%
+ \def\@currentHref {#1}%
+ \let\@currentlabelname \@empty
+ #2%
+ \fi
+ }%
+}% \tabu@Hy@footnotetext
+%% No need for \arraybackslash ! ------------------------------------
+\def\tabu@latextwoe {%
+\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}}
+\tabu@temp \tabu@centering \centering \arraybackslash
+\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash
+\tabu@temp \tabu@raggedright \raggedright \arraybackslash
+}% \tabu@latextwoe
+\def\tabu@raggedtwoe {%
+\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}}
+\tabu@temp \tabu@Centering \Centering \arraybackslash
+\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash
+\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash
+\tabu@temp \tabu@justifying \justifying \arraybackslash
+}% \tabu@raggedtwoe
+\def\tabu@normalcrbackslash{\let\\\@normalcr}
+\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{%
+ \expandafter\tabu@normalcrbackslash \@trivlist}}
+%% Utilities: \fbox \fcolorbox and \tabudecimal -------------------
+\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox}
+\def\tabu@beginfbox {\bgroup \kern\fboxsep
+ \bgroup\aftergroup\tabu@endfbox}
+\def\tabu@endfbox {\kern\fboxsep\egroup\egroup
+ \@frameb@x\relax}
+\def\tabu@color@b@x #1#2{\leavevmode \bgroup
+ \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}%
+ \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox
+}% \tabu@color@b@x
+\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup
+ \aftergroup\tabu@endcolor@b@x \set@color}
+\def\tabu@endcolor@b@x {\kern\fboxsep \egroup
+ \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@
+ \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@
+ \tabu@docolor@b@x \egroup
+}% \tabu@endcolor@b@x
+%% Corrections (arydshln, delarray, colortbl) -----------------------
+\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray
+ \iftabu@colortbl
+ \ifdefined\adl@array %
+ \def\tabu@endarray{%
+ \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup %
+ \@arrayright %
+ \gdef\@preamble{}}%
+ \else %
+ \def\tabu@endarray{%
+ \crcr \egroup \egroup %
+ \@arrayright %
+ \gdef\@preamble{}\CT@end}%
+ \fi
+ \else
+ \ifdefined\adl@array %
+ \def\tabu@endarray{%
+ \adl@endarray \egroup \adl@arrayrestore \egroup %
+ \@arrayright %
+ \gdef\@preamble{}}%
+ \else %
+ \PackageWarning{tabu}
+ {\string\@arrayright\space is missing from the
+ \MessageBreak definition of \string\endarray.
+ \MessageBreak Compatibility with delarray.sty is broken.}%
+ \fi\fi
+}% \tabu@fix@arrayright
+\def\tabu@adl@xarraydashrule #1#2#3{%
+ \ifnum\@lastchclass=\adl@class@start\else
+ \ifnum\@lastchclass=\@ne\else
+ \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1)
+ \adl@leftrulefalse \fi\fi % must be treated the same
+ \fi
+ \ifadl@zwvrule\else \ifadl@inactive\else
+ \@addtopreamble{\vrule\@width\arrayrulewidth
+ \@height\z@ \@depth\z@}\fi \fi
+ \ifadl@leftrule
+ \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}%
+ {\number#1}#3}%
+ \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}%
+ {\number#2}#3}
+ \fi
+}% \tabu@adl@xarraydashrule
+\def\tabu@adl@act@endpbox {%
+ \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox
+ \egroup \egroup
+ \adl@colhtdp \box\adl@box \hfil
+}% \tabu@adl@act@endpbox
+\def\tabu@adl@fix {%
+ \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln
+ \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln
+ \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln
+ \let\@preamerror \@preamerr % arydshln
+}% \tabu@adl@fix
+%% Correction for longtable' \@startbox definition ------------------
+%% => \everypar is ``missing'' : TeX should be in vertical mode
+\def\tabu@LT@startpbox #1{%
+ \bgroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \everypar{%
+ \vrule \@height \ht\@arstrutbox \@width \z@
+ \everypar{}}%
+}% \tabu@LT@startpbox
+%% \tracingtabu and the package options ------------------
+\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}}
+\DeclareOption{linegoal}{%
+ \AtEndOfPackage{%
+ \RequirePackage{linegoal}[2010/12/07]%
+ \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX
+}}
+\DeclareOption{scantokens}{\tabuscantokenstrue}
+\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}}
+\def\tracingtabu {\begingroup\@ifnextchar=%
+ {\afterassignment\tabu@tracing\count@}
+ {\afterassignment\tabu@tracing\count@1\relax}}
+\def\tabu@tracing{\expandafter\endgroup
+ \expandafter\tabu@tr@cing \the\count@ \relax
+}% \tabu@tracing
+\def\tabu@tr@cing #1\relax {%
+ \ifnum#1>\thr@@ \let\tabu@tracinglines\message
+ \else \let\tabu@tracinglines\@gobble
+ \fi
+ \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG
+ \def\tabu@mkarstrut {\tabu@DBG@arstrut}%
+ \tabustrutrule 1.5\p@
+ \else \let\tabu@DBG \@gobble
+ \def\tabu@mkarstrut {\tabu@arstrut}%
+ \tabustrutrule \z@
+ \fi
+ \ifnum#1>\@ne \let\tabu@debug \message
+ \else \let\tabu@debug \@gobble
+ \fi
+ \ifnum#1>\z@
+ \let\tabu@message \message
+ \let\tabu@tracing@save \tabu@message@save
+ \let\tabu@starttimer \tabu@pdftimer
+ \else
+ \let\tabu@message \@gobble
+ \let\tabu@tracing@save \@gobble
+ \let\tabu@starttimer \relax
+ \fi
+}% \tabu@tr@cing
+%% Setup \AtBeginDocument
+\AtBeginDocument{\tabu@AtBeginDocument}
+\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined
+ \ifdefined\arrayrulecolor \tabu@colortbltrue %
+ \tabu@colortblalignments % different glues are used
+ \else \tabu@colortblfalse \fi
+ \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi
+ \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi
+ \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@
+ \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname %
+ \expandafter\ifx
+ \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax
+ \tabu@siunitxtrue
+ \else \let\tabu@maybesiunitx \@firstofone %
+ \let\tabu@siunitx \tabu@nosiunitx
+ \tabu@siunitxfalse
+ \fi
+ \ifdefined\adl@array %
+ \else \let\tabu@adl@fix \relax
+ \let\tabu@adl@endtrial \@empty \fi
+ \ifdefined\longtable %
+ \else \let\longtabu \tabu@nolongtabu \fi
+ \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi
+ \csname\ifcsname ifHy@hyperfootnotes\endcsname %
+ ifHy@hyperfootnotes\else iffalse\fi\endcsname
+ \let\tabu@footnotetext \tabu@Hy@ftntext
+ \let\tabu@xfootnote \tabu@Hy@xfootnote \fi
+ \ifdefined\FV@DefineCheckEnd%
+ \tabu@fancyvrb \fi
+ \ifdefined\color %
+ \let\tabu@color \color
+ \def\tabu@leavevmodecolor ##1{%
+ \def\tabu@leavevmodecolor {\leavevmode ##1}%
+ }\expandafter\tabu@leavevmodecolor\expandafter{\color}%
+ \else
+ \let\tabu@color \tabu@nocolor
+ \let\tabu@leavevmodecolor \@firstofone \fi
+ \tabu@latextwoe
+ \ifdefined\@raggedtwoe@everyselectfont %
+ \tabu@raggedtwoe
+ \else
+ \let\tabu@cell@L \tabu@cell@l
+ \let\tabu@cell@R \tabu@cell@r
+ \let\tabu@cell@C \tabu@cell@c
+ \let\tabu@cell@J \tabu@cell@j \fi
+ \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}%
+ \ifin@ \let\tabu@endarray \endarray
+ \else \tabu@fix@arrayright \fi%
+ \everyrow{}%
+}% \tabu@AtBeginDocument
+\def\tabu@warn@cellspace{%
+ \PackageWarning{tabu}{%
+ Package cellspace has some limitations
+ \MessageBreak And redefines some macros of array.sty.
+ \MessageBreak Please use \string\tabulinesep\space to control
+ \MessageBreak vertical spacing of lines inside tabu environment}%
+}% \tabu@warn@cellspace
+%% tabu Package initialisation
+\tabuscantokensfalse
+\let\tabu@arc@G \relax
+\let\tabu@drsc@G \relax
+\let\tabu@evr@G \@empty
+\let\tabu@rc@G \@empty
+\def\tabu@ls@G {\tabu@linestyle@}%
+\let\tabu@@rowfontreset \@empty %
+\let\tabu@@celllalign \@empty
+\let\tabu@@cellralign \@empty
+\let\tabu@@cellleft \@empty
+\let\tabu@@cellright \@empty
+\def\tabu@naturalXmin {\z@}
+\def\tabu@naturalXmax {\z@}
+\let\tabu@rowfontreset \@empty
+\def\tabulineon {4pt}\let\tabulineoff \tabulineon
+\tabu@everyrowtrue
+\ifdefined\pdfelapsedtime %
+ \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}%
+\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax
+\fi
+\tracingtabu=\z@
+\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@
+\tabulinestyle{}
+\taburowcolors{}
+\let\tabudefaulttarget \linewidth
+\ProcessOptions* % \ProcessOptions* is quicker !
+\endinput
+%%
+%% End of file `tabu.sty'.
diff --git a/docs/latex/test__commit__commands_8py.tex b/docs/latex/test__commit__commands_8py.tex
new file mode 100644
index 0000000..f296e5f
--- /dev/null
+++ b/docs/latex/test__commit__commands_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{test__commit__commands_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/test\+\_\+commit\+\_\+commands.py File Reference}
+\label{test__commit__commands_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/test\_commit\_commands.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/test\_commit\_commands.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classtests_1_1test__commit__commands_1_1TestCommitCommands}{tests.\+test\+\_\+commit\+\_\+commands.\+Test\+Commit\+Commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacetests}{tests}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1test__commit__commands}{tests.\+test\+\_\+commit\+\_\+commands}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/test__config__commands_8py.tex b/docs/latex/test__config__commands_8py.tex
new file mode 100644
index 0000000..4526e6d
--- /dev/null
+++ b/docs/latex/test__config__commands_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{test__config__commands_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/test\+\_\+config\+\_\+commands.py File Reference}
+\label{test__config__commands_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/test\_config\_commands.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/test\_config\_commands.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classtests_1_1test__config__commands_1_1TestConfigCommands}{tests.\+test\+\_\+config\+\_\+commands.\+Test\+Config\+Commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacetests}{tests}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1test__config__commands}{tests.\+test\+\_\+config\+\_\+commands}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/test__doc__commands_8py.tex b/docs/latex/test__doc__commands_8py.tex
new file mode 100644
index 0000000..5d94064
--- /dev/null
+++ b/docs/latex/test__doc__commands_8py.tex
@@ -0,0 +1,34 @@
+\hypertarget{test__doc__commands_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/test\+\_\+doc\+\_\+commands.py File Reference}
+\label{test__doc__commands_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/test\_doc\_commands.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/test\_doc\_commands.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacetests}{tests}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1test__doc__commands}{tests.\+test\+\_\+doc\+\_\+commands}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+no\+\_\+location}} (mock\+\_\+getcwd, mock\+\_\+api\+\_\+client, mock\+\_\+folder\+\_\+analyzer, mock\+\_\+file\+\_\+analyzer, mock\+\_\+git\+\_\+analyzer)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+file\+\_\+location}} (mock\+\_\+api\+\_\+client, mock\+\_\+folder\+\_\+analyzer, mock\+\_\+file\+\_\+analyzer, mock\+\_\+git\+\_\+analyzer)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+folder\+\_\+location}} (mock\+\_\+api\+\_\+client, mock\+\_\+folder\+\_\+analyzer, mock\+\_\+file\+\_\+analyzer, mock\+\_\+git\+\_\+analyzer)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+error\+\_\+handling}} (mock\+\_\+api\+\_\+client, mock\+\_\+git\+\_\+analyzer, mock\+\_\+exit)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+setup\+\_\+docgen\+\_\+parser}} ()
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+handle\+\_\+docgen\+\_\+install\+\_\+hook}} (mock\+\_\+exit, mock\+\_\+get\+\_\+token, mock\+\_\+generate\+\_\+doc, mock\+\_\+uninstall\+\_\+hook, mock\+\_\+install\+\_\+hook)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+handle\+\_\+docgen\+\_\+uninstall\+\_\+hook}} (mock\+\_\+exit, mock\+\_\+get\+\_\+token, mock\+\_\+generate\+\_\+doc, mock\+\_\+uninstall\+\_\+hook, mock\+\_\+install\+\_\+hook)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+handle\+\_\+docgen\+\_\+generate}} (mock\+\_\+get\+\_\+token, mock\+\_\+generate\+\_\+doc, mock\+\_\+uninstall\+\_\+hook, mock\+\_\+install\+\_\+hook)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+handle\+\_\+docgen\+\_\+no\+\_\+token}} (mock\+\_\+exit, mock\+\_\+get\+\_\+token)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+with\+\_\+file\+\_\+exception}} (mock\+\_\+api\+\_\+client, mock\+\_\+getcwd)
+\item
+def \mbox{\hyperlink{namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3}{tests.\+test\+\_\+doc\+\_\+commands.\+test\+\_\+generate\+\_\+doc\+\_\+with\+\_\+folder\+\_\+exception}} (mock\+\_\+api\+\_\+client, mock\+\_\+getcwd)
+\end{DoxyCompactItemize}
diff --git a/docs/latex/test__web__config_8py.tex b/docs/latex/test__web__config_8py.tex
new file mode 100644
index 0000000..345bde0
--- /dev/null
+++ b/docs/latex/test__web__config_8py.tex
@@ -0,0 +1,14 @@
+\hypertarget{test__web__config_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/test\+\_\+web\+\_\+config.py File Reference}
+\label{test__web__config_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/test\_web\_config.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/test\_web\_config.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classtests_1_1test__web__config_1_1TestWebConfig}{tests.\+test\+\_\+web\+\_\+config.\+Test\+Web\+Config}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacetests}{tests}}
+\item
+namespace \mbox{\hyperlink{namespacetests_1_1test__web__config}{tests.\+test\+\_\+web\+\_\+config}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/tests_2____init_____8py.tex b/docs/latex/tests_2____init_____8py.tex
new file mode 100644
index 0000000..a063f1a
--- /dev/null
+++ b/docs/latex/tests_2____init_____8py.tex
@@ -0,0 +1,7 @@
+\hypertarget{tests_2____init_____8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/tests/\+\_\+\+\_\+init\+\_\+\+\_\+.py File Reference}
+\label{tests_2____init_____8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/\_\_init\_\_.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/tests/\_\_init\_\_.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacetests}{tests}}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/ui__utils_8py.tex b/docs/latex/ui__utils_8py.tex
new file mode 100644
index 0000000..7c06518
--- /dev/null
+++ b/docs/latex/ui__utils_8py.tex
@@ -0,0 +1,67 @@
+\hypertarget{ui__utils_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/ui\+\_\+utils.py File Reference}
+\label{ui__utils_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/ui\_utils.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/ui\_utils.py}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils}{penify\+\_\+hook.\+ui\+\_\+utils}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6}{penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+info}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776}{penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+success}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2}{penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+warning}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e}{penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+error}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_adcb97fc26b405d2b9cdf5eb7aecc5452}{penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+highlight}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4}{penify\+\_\+hook.\+ui\+\_\+utils.\+format\+\_\+file\+\_\+path}} (file\+\_\+path)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44}{penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+info}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a}{penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+success}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa}{penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+warning}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f}{penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+error}} (message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115}{penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+processing}} (file\+\_\+path)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c}{penify\+\_\+hook.\+ui\+\_\+utils.\+print\+\_\+status}} (status, message)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c}{penify\+\_\+hook.\+ui\+\_\+utils.\+create\+\_\+progress\+\_\+bar}} (total, desc=\char`\"{}Processing\char`\"{}, unit=\char`\"{}item\char`\"{})
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef}{penify\+\_\+hook.\+ui\+\_\+utils.\+create\+\_\+stage\+\_\+progress\+\_\+bar}} (stages, desc=\char`\"{}Processing\char`\"{})
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d}{penify\+\_\+hook.\+ui\+\_\+utils.\+update\+\_\+stage}} (pbar, stage\+\_\+name)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_ab560cfade398ac1e0bd47befb52d9f71}{penify\+\_\+hook.\+ui\+\_\+utils.\+autoreset}}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a9fdcb180915696f5d217032a62c3857c}{penify\+\_\+hook.\+ui\+\_\+utils.\+INFO\+\_\+\+COLOR}} = Fore.\+CYAN
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a22c450c5e2b5394618ecf9b636560df4}{penify\+\_\+hook.\+ui\+\_\+utils.\+SUCCESS\+\_\+\+COLOR}} = Fore.\+GREEN
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a177bc9b44157844c999e0c1c2c6936ff}{penify\+\_\+hook.\+ui\+\_\+utils.\+WARNING\+\_\+\+COLOR}} = Fore.\+YELLOW
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a4ab4e61dfab7973c87bef59c6e1977fe}{penify\+\_\+hook.\+ui\+\_\+utils.\+ERROR\+\_\+\+COLOR}} = Fore.\+RED
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_aba01b8259f0d66cdc2b4a1b58f9736fc}{penify\+\_\+hook.\+ui\+\_\+utils.\+HIGHLIGHT\+\_\+\+COLOR}} = Fore.\+BLUE
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_aca0fcee81606857497520ae4290bc9f5}{penify\+\_\+hook.\+ui\+\_\+utils.\+NEUTRAL\+\_\+\+COLOR}} = Fore.\+WHITE
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a3c6fe4bd17c1a5fe76587225ae4beb3e}{penify\+\_\+hook.\+ui\+\_\+utils.\+SUCCESS\+\_\+\+SYMBOL}} = \char`\"{}✓\char`\"{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a6eaea98f1a8cbe16a181647da2fc0a16}{penify\+\_\+hook.\+ui\+\_\+utils.\+WARNING\+\_\+\+SYMBOL}} = \char`\"{}○\char`\"{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_aa564e1e1d016c8227d076542e74cecb0}{penify\+\_\+hook.\+ui\+\_\+utils.\+ERROR\+\_\+\+SYMBOL}} = \char`\"{}✗\char`\"{}
+\item
+string \mbox{\hyperlink{namespacepenify__hook_1_1ui__utils_a3b208e2750a38dd09467a73e4afd9756}{penify\+\_\+hook.\+ui\+\_\+utils.\+PROCESSING\+\_\+\+SYMBOL}} = \char`\"{}⟳\char`\"{}
+\end{DoxyCompactItemize}
diff --git a/docs/latex/utils_8py.tex b/docs/latex/utils_8py.tex
new file mode 100644
index 0000000..595fc7e
--- /dev/null
+++ b/docs/latex/utils_8py.tex
@@ -0,0 +1,28 @@
+\hypertarget{utils_8py}{}\doxysection{/tmp/github\+\_\+repos\+Repo\+Arch\+Doc\+Gen\+Context/\+Penify-\/dev/penify-\/cli/penify\+\_\+hook/utils.py File Reference}
+\label{utils_8py}\index{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/utils.py@{/tmp/github\_reposRepoArchDocGenContext/Penify-\/dev/penify-\/cli/penify\_hook/utils.py}}
+\doxysubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classpenify__hook_1_1utils_1_1GitRepoNotFoundError}{penify\+\_\+hook.\+utils.\+Git\+Repo\+Not\+Found\+Error}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook}{penify\+\_\+hook}}
+\item
+namespace \mbox{\hyperlink{namespacepenify__hook_1_1utils}{penify\+\_\+hook.\+utils}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1utils_ae236f3c4c8bf5dcddbb92b4c2065eea3}{penify\+\_\+hook.\+utils.\+get\+\_\+repo\+\_\+details}} (Repo repo)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f}{penify\+\_\+hook.\+utils.\+recursive\+\_\+search\+\_\+git\+\_\+folder}} (folder\+\_\+path)
+\item
+def \mbox{\hyperlink{namespacepenify__hook_1_1utils_a4ec5335a4026c22a34a3a8ccf665a5f2}{penify\+\_\+hook.\+utils.\+find\+\_\+git\+\_\+parent}} (path)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{namespacepenify__hook_1_1utils_a0c0c1ed6b197038085c94a90ceedfb01}{penify\+\_\+hook.\+utils.\+logger}} = logging.\+get\+Logger(\+\_\+\+\_\+name\+\_\+\+\_\+)
+\end{DoxyCompactItemize}