ai-docs-gen 0.1.3__py3-none-any.whl → 0.1.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ai_docs/generator.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import json
2
2
  from datetime import datetime
3
3
  import os
4
+ import re
4
5
  import shutil
5
6
  import subprocess
6
7
  from pathlib import Path
@@ -942,6 +943,7 @@ def generate_docs(
942
943
  if not mkdocs_bin:
943
944
  raise RuntimeError("mkdocs is not installed or not on PATH")
944
945
  subprocess.check_call([mkdocs_bin, "build", "-f", "mkdocs.yml"], cwd=output_root)
946
+ _postprocess_mermaid_html(output_root / "ai_docs_site")
945
947
  print("[ai-docs] mkdocs: done")
946
948
 
947
949
  # Save cache
@@ -957,3 +959,33 @@ def generate_docs(
957
959
  print("[ai-docs] errors summary:")
958
960
  for item in errors:
959
961
  print(f"[ai-docs] error: {item}")
962
+
963
+
964
+ def _postprocess_mermaid_html(site_dir: Path) -> None:
965
+ if not site_dir.exists():
966
+ return
967
+
968
+ mermaid_div_re = re.compile(r'(<div class="mermaid">)(.*?)(</div>)', re.DOTALL)
969
+ bracket_re = re.compile(r"\\[([^\\]]*)\\]")
970
+
971
+ for path in site_dir.rglob("*.html"):
972
+ text = path.read_text(encoding="utf-8")
973
+ if 'class="mermaid"' not in text:
974
+ continue
975
+
976
+ def _fix_mermaid(match: re.Match) -> str:
977
+ head, body, tail = match.groups()
978
+ body = body.replace("&gt;", ">")
979
+
980
+ def _fix_brackets(bmatch: re.Match) -> str:
981
+ inner = bmatch.group(1).replace("(", " ").replace(")", "")
982
+ inner = re.sub(r"[ \\t]+", " ", inner)
983
+ return f"[{inner}]"
984
+
985
+ body = bracket_re.sub(_fix_brackets, body)
986
+ body = re.sub(r"[ \\t]+", " ", body)
987
+ return f"{head}{body}{tail}"
988
+
989
+ updated = mermaid_div_re.sub(_fix_mermaid, text)
990
+ if updated != text:
991
+ path.write_text(updated, encoding="utf-8")
ai_docs/scanner.py CHANGED
@@ -40,6 +40,7 @@ DEFAULT_EXCLUDE_PATTERNS = {
40
40
  ".github/*", ".github/**", "**/.github/*", "**/.github/**",
41
41
  "mkdocs.yml", "**/mkdocs.yml", "mkdocs_yml.md", "**/mkdocs_yml.md",
42
42
  ".ai-docs.yaml", "**/.ai-docs.yaml",
43
+ "ai_docs/assets/*", "ai_docs/assets/**", "**/ai_docs/assets/*", "**/ai_docs/assets/**",
43
44
  }
44
45
 
45
46
 
ai_docs/tokenizer.py CHANGED
@@ -3,11 +3,22 @@ from typing import List
3
3
  import tiktoken
4
4
 
5
5
 
6
+ class _ByteEncoding:
7
+ def encode(self, text: str):
8
+ return list(text.encode("utf-8", errors="ignore"))
9
+
10
+ def decode(self, tokens):
11
+ return bytes(tokens).decode("utf-8", errors="ignore")
12
+
13
+
6
14
  def get_encoding(model: str):
7
15
  try:
8
16
  return tiktoken.encoding_for_model(model)
9
17
  except KeyError:
10
- return tiktoken.get_encoding("cl100k_base")
18
+ try:
19
+ return tiktoken.get_encoding("cl100k_base")
20
+ except Exception:
21
+ return _ByteEncoding()
11
22
 
12
23
 
13
24
  def count_tokens(text: str, model: str) -> int:
@@ -23,4 +34,3 @@ def chunk_text(text: str, model: str, max_tokens: int) -> List[str]:
23
34
  chunk = tokens[i:i + max_tokens]
24
35
  chunks.append(enc.decode(chunk))
25
36
  return chunks
26
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ai-docs-gen
3
- Version: 0.1.3
3
+ Version: 0.1.8
4
4
  Summary: CLI-инструмент для генерации технической документации по коду и конфигурациям
5
5
  Requires-Python: >=3.8
6
6
  Description-Content-Type: text/markdown
@@ -16,6 +16,8 @@ Requires-Dist: pymdown-extensions
16
16
 
17
17
  # ai_docs — генератор технической документации
18
18
 
19
+ [English version](README_EN.md) | [Русская версия](README.md)
20
+
19
21
  ## Обзор
20
22
  `ai_docs` — CLI‑инструмент для генерации технической документации по коду и конфигурациям.
21
23
  Поддерживает локальные папки, локальные git‑проекты и удалённые git‑репозитории.
@@ -51,7 +53,7 @@ python3 -m venv .venv
51
53
  pip install -e .
52
54
  ```
53
55
 
54
- 2) Настройка `.env` (пример — `.env.example`):
56
+ 2) Настройка переменных окружения (пример — `.env.example`):
55
57
  ```env
56
58
  OPENAI_API_KEY=your_api_key_here
57
59
  OPENAI_BASE_URL=https://api.openai.com/v1
@@ -63,6 +65,18 @@ AI_DOCS_THREADS=1
63
65
  AI_DOCS_LOCAL_SITE=false
64
66
  ```
65
67
 
68
+ Если инструмент установлен как пакет, можно задать переменные окружения так:
69
+ ```bash
70
+ export OPENAI_API_KEY="your_api_key_here"
71
+ export OPENAI_BASE_URL="https://api.openai.com/v1"
72
+ export OPENAI_MODEL="gpt-4o-mini"
73
+ export OPENAI_MAX_TOKENS="1200"
74
+ export OPENAI_CONTEXT_TOKENS="8192"
75
+ export OPENAI_TEMPERATURE="0.2"
76
+ export AI_DOCS_THREADS="1"
77
+ export AI_DOCS_LOCAL_SITE="false"
78
+ ```
79
+
66
80
  3) Генерация README и MkDocs:
67
81
  ```bash
68
82
  python -m ai_docs --source .
@@ -78,6 +92,22 @@ python ai_docs --source .
78
92
  ai-docs --source .
79
93
  ```
80
94
 
95
+ Примечание для Windows:
96
+ - Пути обрабатываются корректно, но внутри всегда нормализуются в формат с `/`.
97
+ - Если используете PowerShell, пример активации venv и переменных окружения:
98
+ ```powershell
99
+ python -m venv .venv
100
+ .\\.venv\\Scripts\\Activate.ps1
101
+ $env:OPENAI_API_KEY="your_api_key_here"
102
+ $env:OPENAI_BASE_URL="https://api.openai.com/v1"
103
+ $env:OPENAI_MODEL="gpt-4o-mini"
104
+ $env:OPENAI_MAX_TOKENS="1200"
105
+ $env:OPENAI_CONTEXT_TOKENS="8192"
106
+ $env:OPENAI_TEMPERATURE="0.2"
107
+ $env:AI_DOCS_THREADS="1"
108
+ $env:AI_DOCS_LOCAL_SITE="false"
109
+ ```
110
+
81
111
  ## Примеры использования
82
112
 
83
113
  Локальная папка:
@@ -4,16 +4,16 @@ ai_docs/cache.py,sha256=Z3Mwg2QEYZNaC6bRyv6Py0FcFDV0d9KnyFiBf-EsyFE,1784
4
4
  ai_docs/changes.py,sha256=tA6kf79XPiywqWBBfBaqf-upRyowyInsw-BFYOIUAmA,973
5
5
  ai_docs/cli.py,sha256=XhZO6b49lYGqefITwu-R57-pN6t5esyARGlcMz7cXAA,3639
6
6
  ai_docs/domain.py,sha256=HrbdDw_Qxe1gk7J4dzYN1MHbYXDGY3-Tyr5--LgSjzc,6253
7
- ai_docs/generator.py,sha256=n_sdUxHPFF4c4CPplbxEGDYmK32tfXq2w7a1sEVqa8E,41146
7
+ ai_docs/generator.py,sha256=LECWo5Od62wCEHdTXg0qTzMKkP43Sb9TpqdWpdTSk-w,42261
8
8
  ai_docs/llm.py,sha256=BCVcMM1X_B_LMEuyLBM6jFNz8jYONikM4pEJVhJ16c0,2633
9
9
  ai_docs/mkdocs.py,sha256=Zh23S3T3gTou2TryfLSwDWzWTwDtLYf5kM5eTnLpGek,5243
10
- ai_docs/scanner.py,sha256=KwJnu3GYL1lABeSVTlxlrddOuKkHyomQ39g6AdPbPh0,8793
10
+ ai_docs/scanner.py,sha256=M9K0S_Pb0490csiT4HW41mzD8UfkSb8X0suh6rob2f8,8885
11
11
  ai_docs/summary.py,sha256=01cJer00yJnT7p7nKgvPy-H37A3PqHHVeA8RuzkwX8M,10357
12
- ai_docs/tokenizer.py,sha256=G8btLH0IRJCx4b2jM8lWSzS0dcOZP-sAqwWYUQ5jF40,614
12
+ ai_docs/tokenizer.py,sha256=oXiE-1G_OiWYbzXmWH1CUSBOhxHaMPosGpCuFLMJTQU,899
13
13
  ai_docs/utils.py,sha256=kJKgO2R8ZQa58MBUZK2oEr03wFvVkRaWZYruxxJigGo,993
14
14
  ai_docs/assets/mermaid.min.js,sha256=LPe7bNxKbqlto9MkpER9gwDR2nA85fMTEWCGQsD4Ymk,2908475
15
- ai_docs_gen-0.1.3.dist-info/METADATA,sha256=LQ2eXZdiR4rFBq8Nq92vNbHQsUjZdQtq7K8JyTKM4JQ,7723
16
- ai_docs_gen-0.1.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
17
- ai_docs_gen-0.1.3.dist-info/entry_points.txt,sha256=C5tKlnOjrwbPgVbOB_zA8WeFjk05DXsMhq2UgTw5BDk,45
18
- ai_docs_gen-0.1.3.dist-info/top_level.txt,sha256=Uqf4JT1_bI7m3yV5gs5kuL5Nmws5E2XT3W9yajZck2c,8
19
- ai_docs_gen-0.1.3.dist-info/RECORD,,
15
+ ai_docs_gen-0.1.8.dist-info/METADATA,sha256=EKIPGUjtC5ReK17kckU9FWBBQNhzTSRsPQkQjgQvrWw,8925
16
+ ai_docs_gen-0.1.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
17
+ ai_docs_gen-0.1.8.dist-info/entry_points.txt,sha256=C5tKlnOjrwbPgVbOB_zA8WeFjk05DXsMhq2UgTw5BDk,45
18
+ ai_docs_gen-0.1.8.dist-info/top_level.txt,sha256=Uqf4JT1_bI7m3yV5gs5kuL5Nmws5E2XT3W9yajZck2c,8
19
+ ai_docs_gen-0.1.8.dist-info/RECORD,,