@vyuhlabs/dxkit 2.4.7 → 2.5.0

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.
Files changed (309) hide show
  1. package/CHANGELOG.md +456 -30
  2. package/README.md +360 -439
  3. package/dist/analyzers/bom/gather.d.ts +3 -3
  4. package/dist/analyzers/bom/gather.js +3 -3
  5. package/dist/analyzers/bom/index.js +2 -2
  6. package/dist/analyzers/bom/index.js.map +1 -1
  7. package/dist/analyzers/dashboard/index.d.ts.map +1 -1
  8. package/dist/analyzers/dashboard/index.js +4 -3
  9. package/dist/analyzers/dashboard/index.js.map +1 -1
  10. package/dist/analyzers/developer/index.d.ts.map +1 -1
  11. package/dist/analyzers/developer/index.js +2 -1
  12. package/dist/analyzers/developer/index.js.map +1 -1
  13. package/dist/analyzers/dispatcher.d.ts +15 -0
  14. package/dist/analyzers/dispatcher.d.ts.map +1 -1
  15. package/dist/analyzers/dispatcher.js +42 -6
  16. package/dist/analyzers/dispatcher.js.map +1 -1
  17. package/dist/analyzers/health.d.ts.map +1 -1
  18. package/dist/analyzers/health.js +11 -1
  19. package/dist/analyzers/health.js.map +1 -1
  20. package/dist/analyzers/licenses/gather.d.ts +1 -1
  21. package/dist/analyzers/licenses/gather.d.ts.map +1 -1
  22. package/dist/analyzers/licenses/gather.js +18 -2
  23. package/dist/analyzers/licenses/gather.js.map +1 -1
  24. package/dist/analyzers/quality/index.d.ts.map +1 -1
  25. package/dist/analyzers/quality/index.js +10 -2
  26. package/dist/analyzers/quality/index.js.map +1 -1
  27. package/dist/analyzers/security/aggregator.d.ts.map +1 -1
  28. package/dist/analyzers/security/aggregator.js +8 -48
  29. package/dist/analyzers/security/aggregator.js.map +1 -1
  30. package/dist/analyzers/security/gather.d.ts +4 -3
  31. package/dist/analyzers/security/gather.d.ts.map +1 -1
  32. package/dist/analyzers/security/gather.js +23 -5
  33. package/dist/analyzers/security/gather.js.map +1 -1
  34. package/dist/analyzers/security/index.d.ts +1 -1
  35. package/dist/analyzers/security/index.js +2 -2
  36. package/dist/analyzers/security/index.js.map +1 -1
  37. package/dist/analyzers/tools/autogen-header.js +1 -1
  38. package/dist/analyzers/tools/cloc.js +3 -3
  39. package/dist/analyzers/tools/cloc.js.map +1 -1
  40. package/dist/analyzers/tools/deadline.d.ts +67 -0
  41. package/dist/analyzers/tools/deadline.d.ts.map +1 -0
  42. package/dist/analyzers/tools/deadline.js +81 -0
  43. package/dist/analyzers/tools/deadline.js.map +1 -0
  44. package/dist/analyzers/tools/exclusions.d.ts +6 -6
  45. package/dist/analyzers/tools/exclusions.js +6 -6
  46. package/dist/analyzers/tools/fingerprint.d.ts +91 -26
  47. package/dist/analyzers/tools/fingerprint.d.ts.map +1 -1
  48. package/dist/analyzers/tools/fingerprint.js +111 -22
  49. package/dist/analyzers/tools/fingerprint.js.map +1 -1
  50. package/dist/analyzers/tools/generic.d.ts.map +1 -1
  51. package/dist/analyzers/tools/generic.js +7 -2
  52. package/dist/analyzers/tools/generic.js.map +1 -1
  53. package/dist/analyzers/tools/gitleaks.d.ts +24 -1
  54. package/dist/analyzers/tools/gitleaks.d.ts.map +1 -1
  55. package/dist/analyzers/tools/gitleaks.js +21 -12
  56. package/dist/analyzers/tools/gitleaks.js.map +1 -1
  57. package/dist/analyzers/tools/graphify.js +1 -1
  58. package/dist/analyzers/tools/jscpd.js +1 -1
  59. package/dist/analyzers/tools/jscpd.js.map +1 -1
  60. package/dist/analyzers/tools/lint-label.d.ts +29 -0
  61. package/dist/analyzers/tools/lint-label.d.ts.map +1 -0
  62. package/dist/analyzers/tools/lint-label.js +23 -0
  63. package/dist/analyzers/tools/lint-label.js.map +1 -0
  64. package/dist/analyzers/tools/nuget-package-reference.d.ts +6 -4
  65. package/dist/analyzers/tools/nuget-package-reference.d.ts.map +1 -1
  66. package/dist/analyzers/tools/nuget-package-reference.js +7 -5
  67. package/dist/analyzers/tools/nuget-package-reference.js.map +1 -1
  68. package/dist/analyzers/tools/report-date.d.ts +17 -0
  69. package/dist/analyzers/tools/report-date.d.ts.map +1 -0
  70. package/dist/analyzers/tools/report-date.js +26 -0
  71. package/dist/analyzers/tools/report-date.js.map +1 -0
  72. package/dist/analyzers/tools/runner.js +3 -3
  73. package/dist/analyzers/tools/runner.js.map +1 -1
  74. package/dist/analyzers/tools/vendored-advisor.js +1 -1
  75. package/dist/analyzers/tools/walk-paths.d.ts +1 -1
  76. package/dist/analyzers/tools/walk-paths.js +1 -1
  77. package/dist/analyzers/tools/walk-source-files.js +1 -1
  78. package/dist/analyzers/types.d.ts +6 -4
  79. package/dist/analyzers/types.d.ts.map +1 -1
  80. package/dist/baseline/baseline-file.d.ts +104 -0
  81. package/dist/baseline/baseline-file.d.ts.map +1 -0
  82. package/dist/baseline/baseline-file.js +110 -0
  83. package/dist/baseline/baseline-file.js.map +1 -0
  84. package/dist/baseline/check-renderers.d.ts +108 -0
  85. package/dist/baseline/check-renderers.d.ts.map +1 -0
  86. package/dist/baseline/check-renderers.js +379 -0
  87. package/dist/baseline/check-renderers.js.map +1 -0
  88. package/dist/baseline/check.d.ts +127 -0
  89. package/dist/baseline/check.d.ts.map +1 -0
  90. package/dist/baseline/check.js +462 -0
  91. package/dist/baseline/check.js.map +1 -0
  92. package/dist/baseline/content-hash.d.ts +83 -0
  93. package/dist/baseline/content-hash.d.ts.map +1 -0
  94. package/dist/baseline/content-hash.js +131 -0
  95. package/dist/baseline/content-hash.js.map +1 -0
  96. package/dist/baseline/create.d.ts +96 -0
  97. package/dist/baseline/create.d.ts.map +1 -0
  98. package/dist/baseline/create.js +339 -0
  99. package/dist/baseline/create.js.map +1 -0
  100. package/dist/baseline/entry-to-located.d.ts +35 -0
  101. package/dist/baseline/entry-to-located.d.ts.map +1 -0
  102. package/dist/baseline/entry-to-located.js +72 -0
  103. package/dist/baseline/entry-to-located.js.map +1 -0
  104. package/dist/baseline/finding-identity.d.ts +47 -0
  105. package/dist/baseline/finding-identity.d.ts.map +1 -0
  106. package/dist/baseline/finding-identity.js +292 -0
  107. package/dist/baseline/finding-identity.js.map +1 -0
  108. package/dist/baseline/git-aware-match.d.ts +146 -0
  109. package/dist/baseline/git-aware-match.d.ts.map +1 -0
  110. package/dist/baseline/git-aware-match.js +439 -0
  111. package/dist/baseline/git-aware-match.js.map +1 -0
  112. package/dist/baseline/policy.d.ts +171 -0
  113. package/dist/baseline/policy.d.ts.map +1 -0
  114. package/dist/baseline/policy.js +206 -0
  115. package/dist/baseline/policy.js.map +1 -0
  116. package/dist/baseline/producers/health.d.ts +30 -0
  117. package/dist/baseline/producers/health.d.ts.map +1 -0
  118. package/dist/baseline/producers/health.js +42 -0
  119. package/dist/baseline/producers/health.js.map +1 -0
  120. package/dist/baseline/producers/index.d.ts +164 -0
  121. package/dist/baseline/producers/index.d.ts.map +1 -0
  122. package/dist/baseline/producers/index.js +200 -0
  123. package/dist/baseline/producers/index.js.map +1 -0
  124. package/dist/baseline/producers/licenses.d.ts +23 -0
  125. package/dist/baseline/producers/licenses.d.ts.map +1 -0
  126. package/dist/baseline/producers/licenses.js +46 -0
  127. package/dist/baseline/producers/licenses.js.map +1 -0
  128. package/dist/baseline/producers/quality.d.ts +39 -0
  129. package/dist/baseline/producers/quality.d.ts.map +1 -0
  130. package/dist/baseline/producers/quality.js +84 -0
  131. package/dist/baseline/producers/quality.js.map +1 -0
  132. package/dist/baseline/producers/secret-hmac.d.ts +45 -0
  133. package/dist/baseline/producers/secret-hmac.d.ts.map +1 -0
  134. package/dist/baseline/producers/secret-hmac.js +70 -0
  135. package/dist/baseline/producers/secret-hmac.js.map +1 -0
  136. package/dist/baseline/producers/security.d.ts +59 -0
  137. package/dist/baseline/producers/security.d.ts.map +1 -0
  138. package/dist/baseline/producers/security.js +135 -0
  139. package/dist/baseline/producers/security.js.map +1 -0
  140. package/dist/baseline/producers/tests.d.ts +36 -0
  141. package/dist/baseline/producers/tests.d.ts.map +1 -0
  142. package/dist/baseline/producers/tests.js +69 -0
  143. package/dist/baseline/producers/tests.js.map +1 -0
  144. package/dist/baseline/salt.d.ts +45 -0
  145. package/dist/baseline/salt.d.ts.map +1 -0
  146. package/dist/baseline/salt.js +113 -0
  147. package/dist/baseline/salt.js.map +1 -0
  148. package/dist/baseline/show.d.ts +79 -0
  149. package/dist/baseline/show.d.ts.map +1 -0
  150. package/dist/baseline/show.js +233 -0
  151. package/dist/baseline/show.js.map +1 -0
  152. package/dist/baseline/types.d.ts +482 -0
  153. package/dist/baseline/types.d.ts.map +1 -0
  154. package/dist/baseline/types.js +53 -0
  155. package/dist/baseline/types.js.map +1 -0
  156. package/dist/cli.d.ts.map +1 -1
  157. package/dist/cli.js +395 -92
  158. package/dist/cli.js.map +1 -1
  159. package/dist/codebase-scanner.d.ts.map +1 -1
  160. package/dist/codebase-scanner.js +0 -1
  161. package/dist/codebase-scanner.js.map +1 -1
  162. package/dist/constants.d.ts.map +1 -1
  163. package/dist/constants.js +0 -4
  164. package/dist/constants.js.map +1 -1
  165. package/dist/detect.js +3 -3
  166. package/dist/detect.js.map +1 -1
  167. package/dist/doctor.d.ts.map +1 -1
  168. package/dist/doctor.js +22 -25
  169. package/dist/doctor.js.map +1 -1
  170. package/dist/fail-on.d.ts +84 -0
  171. package/dist/fail-on.d.ts.map +1 -0
  172. package/dist/fail-on.js +128 -0
  173. package/dist/fail-on.js.map +1 -0
  174. package/dist/generator.d.ts.map +1 -1
  175. package/dist/generator.js +2 -141
  176. package/dist/generator.js.map +1 -1
  177. package/dist/languages/capabilities/provider.d.ts +4 -4
  178. package/dist/languages/capabilities/types.d.ts +1 -1
  179. package/dist/languages/csharp.d.ts.map +1 -1
  180. package/dist/languages/csharp.js +15 -24
  181. package/dist/languages/csharp.js.map +1 -1
  182. package/dist/languages/go.d.ts.map +1 -1
  183. package/dist/languages/go.js +0 -15
  184. package/dist/languages/go.js.map +1 -1
  185. package/dist/languages/index.d.ts +4 -3
  186. package/dist/languages/index.d.ts.map +1 -1
  187. package/dist/languages/index.js +3 -2
  188. package/dist/languages/index.js.map +1 -1
  189. package/dist/languages/java.d.ts.map +1 -1
  190. package/dist/languages/java.js +0 -6
  191. package/dist/languages/java.js.map +1 -1
  192. package/dist/languages/kotlin.d.ts.map +1 -1
  193. package/dist/languages/kotlin.js +0 -11
  194. package/dist/languages/kotlin.js.map +1 -1
  195. package/dist/languages/python.d.ts.map +1 -1
  196. package/dist/languages/python.js +0 -15
  197. package/dist/languages/python.js.map +1 -1
  198. package/dist/languages/ruby.d.ts.map +1 -1
  199. package/dist/languages/ruby.js +0 -6
  200. package/dist/languages/ruby.js.map +1 -1
  201. package/dist/languages/rust.d.ts.map +1 -1
  202. package/dist/languages/rust.js +0 -4
  203. package/dist/languages/rust.js.map +1 -1
  204. package/dist/languages/types.d.ts +9 -35
  205. package/dist/languages/types.d.ts.map +1 -1
  206. package/dist/languages/typescript.d.ts.map +1 -1
  207. package/dist/languages/typescript.js +26 -4
  208. package/dist/languages/typescript.js.map +1 -1
  209. package/dist/lib.d.ts +2 -3
  210. package/dist/lib.d.ts.map +1 -1
  211. package/dist/lib.js +3 -6
  212. package/dist/lib.js.map +1 -1
  213. package/dist/prompts.d.ts.map +1 -1
  214. package/dist/prompts.js +0 -10
  215. package/dist/prompts.js.map +1 -1
  216. package/dist/report-schema.d.ts +42 -0
  217. package/dist/report-schema.d.ts.map +1 -0
  218. package/dist/report-schema.js +54 -0
  219. package/dist/report-schema.js.map +1 -0
  220. package/dist/ship-installers.d.ts +106 -0
  221. package/dist/ship-installers.d.ts.map +1 -0
  222. package/dist/ship-installers.js +415 -0
  223. package/dist/ship-installers.js.map +1 -0
  224. package/dist/types.d.ts +0 -4
  225. package/dist/types.d.ts.map +1 -1
  226. package/dist/update.d.ts.map +1 -1
  227. package/dist/update.js +0 -4
  228. package/dist/update.js.map +1 -1
  229. package/package.json +17 -11
  230. package/templates/.claude/agents/onboarding.md +5 -4
  231. package/templates/.claude/agents-available/codebase-explorer.md +1 -1
  232. package/templates/.claude/agents-available/debugger.md +2 -2
  233. package/templates/.claude/agents-available/health-auditor.md +2 -2
  234. package/templates/.claude/commands/doctor.md +20 -12
  235. package/templates/.claude/skills/build/SKILL.md.template +22 -30
  236. package/templates/.claude/skills/deploy/SKILL.md.template +5 -25
  237. package/templates/.claude/skills/doctor/SKILL.md +24 -47
  238. package/templates/.claude/skills/gcloud/SKILL.md +5 -5
  239. package/templates/.claude/skills/learned/SKILL.md +1 -1
  240. package/templates/.claude/skills/pulumi/SKILL.md +2 -2
  241. package/templates/.claude/skills/quality/SKILL.md.template +4 -23
  242. package/templates/.claude/skills/review/SKILL.md.template +4 -3
  243. package/templates/.claude/skills/scaffold/SKILL.md.template +5 -15
  244. package/templates/.claude/skills/secrets/SKILL.md +20 -21
  245. package/templates/.claude/skills/session/SKILL.md +20 -31
  246. package/templates/.claude/skills/test/SKILL.md.template +1 -7
  247. package/templates/.devcontainer/devcontainer.json +81 -0
  248. package/templates/.devcontainer/install-agent-clis.sh +42 -0
  249. package/templates/.devcontainer/post-create.sh +67 -0
  250. package/templates/.githooks/pre-commit +55 -0
  251. package/templates/.githooks/pre-push +63 -0
  252. package/templates/.github/workflows/dxkit-baseline-refresh.yml +78 -0
  253. package/templates/.github/workflows/dxkit-guardrails.yml +98 -0
  254. package/templates/CLAUDE.md.template +62 -196
  255. package/dist/project-yaml.d.ts +0 -13
  256. package/dist/project-yaml.d.ts.map +0 -1
  257. package/dist/project-yaml.js +0 -188
  258. package/dist/project-yaml.js.map +0 -1
  259. package/templates/.ai/README.md +0 -117
  260. package/templates/.ai/prompts/execution-prompt.md +0 -9
  261. package/templates/.ai/prompts/planning-prompt.md +0 -18
  262. package/templates/.ai/prompts/session-end-template.md +0 -182
  263. package/templates/.ai/prompts/session-end.md +0 -132
  264. package/templates/.ai/prompts/session-start.md +0 -109
  265. package/templates/.ai/prompts/step-by-step.md +0 -113
  266. package/templates/.ai/sessions/.gitkeep +0 -0
  267. package/templates/.claude/commands/setup-pr-review.md +0 -72
  268. package/templates/.devcontainer/Dockerfile.dev.template +0 -89
  269. package/templates/.devcontainer/devcontainer.json.template +0 -184
  270. package/templates/.devcontainer/docker-compose.yml.template +0 -105
  271. package/templates/.devcontainer/init-scripts/01-init.sql.template +0 -12
  272. package/templates/.devcontainer/post-create.sh.template +0 -298
  273. package/templates/.github/workflows/ci.yml.template +0 -399
  274. package/templates/.github/workflows/quality.yml.template +0 -376
  275. package/templates/.pre-commit-config.yaml.template +0 -106
  276. package/templates/.project/config/edit_config.py +0 -275
  277. package/templates/.project/config/project_config.py +0 -894
  278. package/templates/.project/scripts/codegen/generate-all.sh +0 -20
  279. package/templates/.project/scripts/codegen/validate-all.sh +0 -17
  280. package/templates/.project/scripts/docs/generate-all.sh +0 -30
  281. package/templates/.project/scripts/docs/serve.sh +0 -20
  282. package/templates/.project/scripts/quality/fix-all.sh +0 -138
  283. package/templates/.project/scripts/quality/lint-go.sh +0 -34
  284. package/templates/.project/scripts/quality/lint-python.sh +0 -54
  285. package/templates/.project/scripts/quality/run-all.sh +0 -497
  286. package/templates/.project/scripts/session/commit.sh +0 -70
  287. package/templates/.project/scripts/session/create-pr.sh +0 -165
  288. package/templates/.project/scripts/session/end.sh +0 -207
  289. package/templates/.project/scripts/session/start.sh +0 -233
  290. package/templates/.project/scripts/setup/doctor.sh +0 -404
  291. package/templates/.project/scripts/setup/interactive-setup.sh +0 -585
  292. package/templates/.project/scripts/sync/sync-template.sh +0 -328
  293. package/templates/.project/scripts/test/run-all.sh +0 -179
  294. package/templates/.project/scripts/test/run-quick.sh +0 -25
  295. package/templates/Makefile +0 -514
  296. package/templates/config/versions.yaml +0 -57
  297. package/templates/configs/go/.golangci.yml.template +0 -172
  298. package/templates/configs/go/go.mod.template +0 -15
  299. package/templates/configs/java/README.md +0 -6
  300. package/templates/configs/kotlin/README.md +0 -6
  301. package/templates/configs/node/package.json.template +0 -67
  302. package/templates/configs/node/tsconfig.json.template +0 -53
  303. package/templates/configs/python/pyproject.toml.template +0 -92
  304. package/templates/configs/python/pytest.ini.template +0 -64
  305. package/templates/configs/python/ruff.toml.template +0 -79
  306. package/templates/configs/ruby/README.md +0 -6
  307. package/templates/configs/rust/Cargo.toml.template +0 -51
  308. package/templates/configs/shared/.editorconfig +0 -67
  309. package/templates/scripts/validate-templates.sh +0 -449
@@ -1,275 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Interactive Project Configuration Editor
4
- =========================================
5
-
6
- Provides an interactive menu to edit .project.yaml settings.
7
-
8
- USAGE
9
- -----
10
- python3 edit_config.py # Interactive menu
11
- python3 edit_config.py --quick # Quick toggle menu (languages only)
12
- """
13
-
14
- from __future__ import annotations
15
-
16
- import os
17
- import sys
18
- from importlib.util import find_spec
19
-
20
-
21
- # Check if yaml is available
22
- HAS_YAML = find_spec("yaml") is not None
23
-
24
- CONFIG_FILE = ".project.yaml"
25
-
26
- # ANSI colors
27
- CYAN = "\033[36m"
28
- GREEN = "\033[32m"
29
- RED = "\033[31m"
30
- YELLOW = "\033[33m"
31
- DIM = "\033[2m"
32
- BOLD = "\033[1m"
33
- RESET = "\033[0m"
34
-
35
-
36
- def load_config() -> dict:
37
- """Load configuration from YAML file."""
38
- from project_config import load_config as _load
39
- return _load()
40
-
41
-
42
- def save_config(config: dict) -> None:
43
- """Save configuration to YAML file."""
44
- from project_config import save_config as _save
45
- _save(config)
46
-
47
-
48
- def clear_screen():
49
- """Clear terminal screen."""
50
- os.system('clear' if os.name == 'posix' else 'cls')
51
-
52
-
53
- def prompt(message: str, default: str = "") -> str:
54
- """Prompt for input with optional default."""
55
- if default:
56
- result = input(f"{message} [{default}]: ").strip()
57
- return result if result else default
58
- return input(f"{message}: ").strip()
59
-
60
-
61
- def prompt_bool(message: str, default: bool = True) -> bool:
62
- """Prompt for yes/no."""
63
- default_str = "Y/n" if default else "y/N"
64
- result = input(f"{message} [{default_str}]: ").strip().lower()
65
- if not result:
66
- return default
67
- return result in ("y", "yes", "true", "1")
68
-
69
-
70
- def prompt_int(message: str, default: int, min_val: int = 0, max_val: int = 100) -> int:
71
- """Prompt for integer."""
72
- while True:
73
- result = input(f"{message} [{default}]: ").strip()
74
- if not result:
75
- return default
76
- try:
77
- val = int(result)
78
- if min_val <= val <= max_val:
79
- return val
80
- print(f"{RED}Value must be between {min_val} and {max_val}{RESET}")
81
- except ValueError:
82
- print(f"{RED}Please enter a number{RESET}")
83
-
84
-
85
- def prompt_choice(message: str, options: list[str], default: int = 0) -> int:
86
- """Prompt for choice from list."""
87
- print(f"\n{message}")
88
- for i, opt in enumerate(options):
89
- marker = f"{GREEN}>{RESET}" if i == default else " "
90
- print(f" {marker} {i + 1}. {opt}")
91
-
92
- while True:
93
- result = input(f"Choice [1-{len(options)}]: ").strip()
94
- if not result:
95
- return default
96
- try:
97
- idx = int(result) - 1
98
- if 0 <= idx < len(options):
99
- return idx
100
- print(f"{RED}Please enter 1-{len(options)}{RESET}")
101
- except ValueError:
102
- print(f"{RED}Please enter a number{RESET}")
103
-
104
-
105
- def edit_language(config: dict, lang_key: str, lang_name: str) -> None:
106
- """Edit settings for a specific language."""
107
- lang = config["languages"].get(lang_key, {})
108
- quality = lang.get("quality", {})
109
-
110
- clear_screen()
111
- print(f"\n{BOLD}{CYAN}═══ {lang_name} Configuration ═══{RESET}\n")
112
-
113
- # Enable/disable
114
- enabled = prompt_bool(
115
- f"Enable {lang_name}",
116
- lang.get("enabled", False)
117
- )
118
- lang["enabled"] = enabled
119
-
120
- if enabled:
121
- # Version
122
- lang["version"] = prompt(
123
- f"{lang_name} version",
124
- lang.get("version", "")
125
- )
126
-
127
- print(f"\n{BOLD}Quality settings:{RESET}")
128
-
129
- # Coverage
130
- quality["coverage"] = prompt_int(
131
- " Coverage threshold (%)",
132
- quality.get("coverage", 80)
133
- )
134
-
135
- # Lint
136
- quality["lint"] = prompt_bool(
137
- " Enable linting",
138
- quality.get("lint", True)
139
- )
140
-
141
- # Typecheck (not all languages)
142
- if lang_key in ("python", "node"):
143
- quality["typecheck"] = prompt_bool(
144
- " Enable type checking",
145
- quality.get("typecheck", True)
146
- )
147
-
148
- # Format
149
- quality["format"] = prompt_bool(
150
- " Enable formatting",
151
- quality.get("format", True)
152
- )
153
-
154
- lang["quality"] = quality
155
-
156
- config["languages"][lang_key] = lang
157
-
158
-
159
- def edit_infrastructure(config: dict) -> None:
160
- """Edit infrastructure settings."""
161
- infra = config.get("infrastructure", {})
162
-
163
- clear_screen()
164
- print(f"\n{BOLD}{CYAN}═══ Infrastructure Configuration ═══{RESET}\n")
165
-
166
- # PostgreSQL
167
- pg = infra.get("postgres", {})
168
- pg["enabled"] = prompt_bool("Enable PostgreSQL", pg.get("enabled", False))
169
- if pg["enabled"]:
170
- pg["version"] = prompt("PostgreSQL version", pg.get("version", "16"))
171
- infra["postgres"] = pg
172
-
173
- # Redis
174
- redis = infra.get("redis", {})
175
- redis["enabled"] = prompt_bool("Enable Redis", redis.get("enabled", False))
176
- if redis["enabled"]:
177
- redis["version"] = prompt("Redis version", redis.get("version", "7"))
178
- infra["redis"] = redis
179
-
180
- config["infrastructure"] = infra
181
-
182
-
183
- def main_menu(config: dict) -> bool:
184
- """Main configuration menu. Returns True to continue, False to exit."""
185
- clear_screen()
186
-
187
- project_name = config.get("project", {}).get("name", "unknown")
188
- languages = config.get("languages", {})
189
-
190
- print(f"\n{BOLD}{CYAN}═══ Project Configuration: {project_name} ═══{RESET}\n")
191
- print(f"Config file: {CONFIG_FILE}\n")
192
-
193
- # Show current state summary
194
- print(f"{BOLD}Current settings:{RESET}")
195
- for lang_key, lang_name in [("python", "Python"), ("go", "Go"), ("node", "Node.js"), ("rust", "Rust")]:
196
- lang = languages.get(lang_key, {})
197
- if lang.get("enabled"):
198
- cov = lang.get("quality", {}).get("coverage", 0)
199
- print(f" {GREEN}✓{RESET} {lang_name} {lang.get('version', '')} (cov: {cov}%)")
200
- else:
201
- print(f" {DIM}✗ {lang_name}{RESET}")
202
-
203
- precommit = config.get("precommit", False)
204
- print(f"\n Pre-commit: {GREEN}enabled{RESET}" if precommit else f"\n Pre-commit: {DIM}disabled{RESET}")
205
-
206
- print(f"\n{BOLD}Menu:{RESET}")
207
- print(f" 1. Edit {CYAN}Python{RESET} settings")
208
- print(f" 2. Edit {CYAN}Go{RESET} settings")
209
- print(f" 3. Edit {CYAN}Node.js{RESET} settings")
210
- print(f" 4. Edit {CYAN}Rust{RESET} settings")
211
- print(f" 5. Edit {CYAN}Infrastructure{RESET} (Postgres, Redis)")
212
- print(f" 6. Toggle {CYAN}Pre-commit{RESET} hooks")
213
- print(f" 7. Edit {CYAN}Project{RESET} name/description")
214
- print()
215
- print(f" {GREEN}s{RESET}. Save and exit")
216
- print(f" {RED}q{RESET}. Quit without saving")
217
-
218
- choice = input("\nChoice: ").strip().lower()
219
-
220
- if choice == "1":
221
- edit_language(config, "python", "Python")
222
- elif choice == "2":
223
- edit_language(config, "go", "Go")
224
- elif choice == "3":
225
- edit_language(config, "node", "Node.js")
226
- elif choice == "4":
227
- edit_language(config, "rust", "Rust")
228
- elif choice == "5":
229
- edit_infrastructure(config)
230
- elif choice == "6":
231
- config["precommit"] = not config.get("precommit", False)
232
- status = "enabled" if config["precommit"] else "disabled"
233
- print(f"\n{GREEN}Pre-commit hooks {status}{RESET}")
234
- input("Press Enter to continue...")
235
- elif choice == "7":
236
- clear_screen()
237
- print(f"\n{BOLD}{CYAN}═══ Project Settings ═══{RESET}\n")
238
- project = config.get("project", {})
239
- project["name"] = prompt("Project name", project.get("name", "my-project"))
240
- project["description"] = prompt("Project description", project.get("description", ""))
241
- config["project"] = project
242
- elif choice == "s":
243
- save_config(config)
244
- print(f"\n{GREEN}Configuration saved to {CONFIG_FILE}{RESET}")
245
- return False
246
- elif choice == "q":
247
- print(f"\n{YELLOW}Changes discarded{RESET}")
248
- return False
249
-
250
- return True
251
-
252
-
253
- def main() -> int:
254
- """CLI entry point."""
255
- if not HAS_YAML:
256
- print(f"{RED}Error: PyYAML is required for config editing{RESET}")
257
- print("Install with: pip install pyyaml")
258
- return 1
259
-
260
- # Check if running in a terminal
261
- if not sys.stdin.isatty():
262
- print(f"{RED}Error: Interactive mode requires a terminal{RESET}")
263
- return 1
264
-
265
- config = load_config()
266
-
267
- # Main loop
268
- while main_menu(config):
269
- pass
270
-
271
- return 0
272
-
273
-
274
- if __name__ == "__main__":
275
- sys.exit(main())