@vyuhlabs/dxkit 2.4.8 → 2.5.1

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 (319) hide show
  1. package/CHANGELOG.md +312 -0
  2. package/README.md +360 -439
  3. package/dist/analyzers/security/aggregator.d.ts.map +1 -1
  4. package/dist/analyzers/security/aggregator.js +4 -46
  5. package/dist/analyzers/security/aggregator.js.map +1 -1
  6. package/dist/analyzers/tools/fingerprint.d.ts +91 -26
  7. package/dist/analyzers/tools/fingerprint.d.ts.map +1 -1
  8. package/dist/analyzers/tools/fingerprint.js +111 -22
  9. package/dist/analyzers/tools/fingerprint.js.map +1 -1
  10. package/dist/analyzers/tools/generic.d.ts.map +1 -1
  11. package/dist/analyzers/tools/generic.js +6 -1
  12. package/dist/analyzers/tools/generic.js.map +1 -1
  13. package/dist/analyzers/tools/gitleaks.d.ts +24 -1
  14. package/dist/analyzers/tools/gitleaks.d.ts.map +1 -1
  15. package/dist/analyzers/tools/gitleaks.js +20 -11
  16. package/dist/analyzers/tools/gitleaks.js.map +1 -1
  17. package/dist/analyzers/tools/graphify.d.ts.map +1 -1
  18. package/dist/analyzers/tools/graphify.js +9 -5
  19. package/dist/analyzers/tools/graphify.js.map +1 -1
  20. package/dist/analyzers/tools/tool-registry.d.ts +19 -1
  21. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
  22. package/dist/analyzers/tools/tool-registry.js +25 -0
  23. package/dist/analyzers/tools/tool-registry.js.map +1 -1
  24. package/dist/analyzers/types.d.ts +6 -4
  25. package/dist/analyzers/types.d.ts.map +1 -1
  26. package/dist/baseline/baseline-file.d.ts +104 -0
  27. package/dist/baseline/baseline-file.d.ts.map +1 -0
  28. package/dist/baseline/baseline-file.js +110 -0
  29. package/dist/baseline/baseline-file.js.map +1 -0
  30. package/dist/baseline/check-renderers.d.ts +108 -0
  31. package/dist/baseline/check-renderers.d.ts.map +1 -0
  32. package/dist/baseline/check-renderers.js +379 -0
  33. package/dist/baseline/check-renderers.js.map +1 -0
  34. package/dist/baseline/check.d.ts +127 -0
  35. package/dist/baseline/check.d.ts.map +1 -0
  36. package/dist/baseline/check.js +462 -0
  37. package/dist/baseline/check.js.map +1 -0
  38. package/dist/baseline/content-hash.d.ts +83 -0
  39. package/dist/baseline/content-hash.d.ts.map +1 -0
  40. package/dist/baseline/content-hash.js +131 -0
  41. package/dist/baseline/content-hash.js.map +1 -0
  42. package/dist/baseline/create.d.ts +96 -0
  43. package/dist/baseline/create.d.ts.map +1 -0
  44. package/dist/baseline/create.js +339 -0
  45. package/dist/baseline/create.js.map +1 -0
  46. package/dist/baseline/entry-to-located.d.ts +35 -0
  47. package/dist/baseline/entry-to-located.d.ts.map +1 -0
  48. package/dist/baseline/entry-to-located.js +72 -0
  49. package/dist/baseline/entry-to-located.js.map +1 -0
  50. package/dist/baseline/finding-identity.d.ts +47 -0
  51. package/dist/baseline/finding-identity.d.ts.map +1 -0
  52. package/dist/baseline/finding-identity.js +292 -0
  53. package/dist/baseline/finding-identity.js.map +1 -0
  54. package/dist/baseline/git-aware-match.d.ts +146 -0
  55. package/dist/baseline/git-aware-match.d.ts.map +1 -0
  56. package/dist/baseline/git-aware-match.js +439 -0
  57. package/dist/baseline/git-aware-match.js.map +1 -0
  58. package/dist/baseline/policy.d.ts +171 -0
  59. package/dist/baseline/policy.d.ts.map +1 -0
  60. package/dist/baseline/policy.js +206 -0
  61. package/dist/baseline/policy.js.map +1 -0
  62. package/dist/baseline/producers/health.d.ts +30 -0
  63. package/dist/baseline/producers/health.d.ts.map +1 -0
  64. package/dist/baseline/producers/health.js +42 -0
  65. package/dist/baseline/producers/health.js.map +1 -0
  66. package/dist/baseline/producers/index.d.ts +164 -0
  67. package/dist/baseline/producers/index.d.ts.map +1 -0
  68. package/dist/baseline/producers/index.js +200 -0
  69. package/dist/baseline/producers/index.js.map +1 -0
  70. package/dist/baseline/producers/licenses.d.ts +23 -0
  71. package/dist/baseline/producers/licenses.d.ts.map +1 -0
  72. package/dist/baseline/producers/licenses.js +46 -0
  73. package/dist/baseline/producers/licenses.js.map +1 -0
  74. package/dist/baseline/producers/quality.d.ts +39 -0
  75. package/dist/baseline/producers/quality.d.ts.map +1 -0
  76. package/dist/baseline/producers/quality.js +84 -0
  77. package/dist/baseline/producers/quality.js.map +1 -0
  78. package/dist/baseline/producers/secret-hmac.d.ts +45 -0
  79. package/dist/baseline/producers/secret-hmac.d.ts.map +1 -0
  80. package/dist/baseline/producers/secret-hmac.js +70 -0
  81. package/dist/baseline/producers/secret-hmac.js.map +1 -0
  82. package/dist/baseline/producers/security.d.ts +59 -0
  83. package/dist/baseline/producers/security.d.ts.map +1 -0
  84. package/dist/baseline/producers/security.js +135 -0
  85. package/dist/baseline/producers/security.js.map +1 -0
  86. package/dist/baseline/producers/tests.d.ts +36 -0
  87. package/dist/baseline/producers/tests.d.ts.map +1 -0
  88. package/dist/baseline/producers/tests.js +69 -0
  89. package/dist/baseline/producers/tests.js.map +1 -0
  90. package/dist/baseline/salt.d.ts +45 -0
  91. package/dist/baseline/salt.d.ts.map +1 -0
  92. package/dist/baseline/salt.js +113 -0
  93. package/dist/baseline/salt.js.map +1 -0
  94. package/dist/baseline/show.d.ts +79 -0
  95. package/dist/baseline/show.d.ts.map +1 -0
  96. package/dist/baseline/show.js +233 -0
  97. package/dist/baseline/show.js.map +1 -0
  98. package/dist/baseline/types.d.ts +482 -0
  99. package/dist/baseline/types.d.ts.map +1 -0
  100. package/dist/baseline/types.js +53 -0
  101. package/dist/baseline/types.js.map +1 -0
  102. package/dist/cli.d.ts.map +1 -1
  103. package/dist/cli.js +398 -82
  104. package/dist/cli.js.map +1 -1
  105. package/dist/constants.d.ts.map +1 -1
  106. package/dist/constants.js +0 -4
  107. package/dist/constants.js.map +1 -1
  108. package/dist/doctor.d.ts.map +1 -1
  109. package/dist/doctor.js +39 -35
  110. package/dist/doctor.js.map +1 -1
  111. package/dist/fail-on.d.ts +84 -0
  112. package/dist/fail-on.d.ts.map +1 -0
  113. package/dist/fail-on.js +128 -0
  114. package/dist/fail-on.js.map +1 -0
  115. package/dist/generator.d.ts +1 -1
  116. package/dist/generator.d.ts.map +1 -1
  117. package/dist/generator.js +81 -274
  118. package/dist/generator.js.map +1 -1
  119. package/dist/hooks-cli.d.ts +20 -0
  120. package/dist/hooks-cli.d.ts.map +1 -0
  121. package/dist/hooks-cli.js +145 -0
  122. package/dist/hooks-cli.js.map +1 -0
  123. package/dist/languages/csharp.d.ts.map +1 -1
  124. package/dist/languages/csharp.js +4 -9
  125. package/dist/languages/csharp.js.map +1 -1
  126. package/dist/languages/go.d.ts.map +1 -1
  127. package/dist/languages/go.js +3 -14
  128. package/dist/languages/go.js.map +1 -1
  129. package/dist/languages/index.d.ts +19 -1
  130. package/dist/languages/index.d.ts.map +1 -1
  131. package/dist/languages/index.js +32 -0
  132. package/dist/languages/index.js.map +1 -1
  133. package/dist/languages/java.d.ts.map +1 -1
  134. package/dist/languages/java.js +4 -6
  135. package/dist/languages/java.js.map +1 -1
  136. package/dist/languages/kotlin.d.ts.map +1 -1
  137. package/dist/languages/kotlin.js +9 -11
  138. package/dist/languages/kotlin.js.map +1 -1
  139. package/dist/languages/python.d.ts.map +1 -1
  140. package/dist/languages/python.js +4 -15
  141. package/dist/languages/python.js.map +1 -1
  142. package/dist/languages/ruby.d.ts.map +1 -1
  143. package/dist/languages/ruby.js +4 -6
  144. package/dist/languages/ruby.js.map +1 -1
  145. package/dist/languages/rust.d.ts.map +1 -1
  146. package/dist/languages/rust.js +4 -4
  147. package/dist/languages/rust.js.map +1 -1
  148. package/dist/languages/types.d.ts +29 -28
  149. package/dist/languages/types.d.ts.map +1 -1
  150. package/dist/languages/typescript.d.ts.map +1 -1
  151. package/dist/languages/typescript.js +31 -4
  152. package/dist/languages/typescript.js.map +1 -1
  153. package/dist/lib.d.ts +2 -3
  154. package/dist/lib.d.ts.map +1 -1
  155. package/dist/lib.js +3 -6
  156. package/dist/lib.js.map +1 -1
  157. package/dist/prompts.d.ts.map +1 -1
  158. package/dist/prompts.js +0 -10
  159. package/dist/prompts.js.map +1 -1
  160. package/dist/report-schema.d.ts +42 -0
  161. package/dist/report-schema.d.ts.map +1 -0
  162. package/dist/report-schema.js +54 -0
  163. package/dist/report-schema.js.map +1 -0
  164. package/dist/ship-installers.d.ts +112 -0
  165. package/dist/ship-installers.d.ts.map +1 -0
  166. package/dist/ship-installers.js +530 -0
  167. package/dist/ship-installers.js.map +1 -0
  168. package/dist/tools-cli.d.ts.map +1 -1
  169. package/dist/tools-cli.js +45 -9
  170. package/dist/tools-cli.js.map +1 -1
  171. package/dist/types.d.ts +0 -4
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/update.d.ts.map +1 -1
  174. package/dist/update.js +0 -4
  175. package/dist/update.js.map +1 -1
  176. package/package.json +17 -11
  177. package/templates/.claude/skills/dxkit-action/SKILL.md +150 -0
  178. package/templates/.claude/skills/dxkit-config/SKILL.md +124 -0
  179. package/templates/.claude/skills/dxkit-hooks/SKILL.md +109 -0
  180. package/templates/.claude/skills/dxkit-init/SKILL.md +93 -0
  181. package/templates/.claude/skills/dxkit-learn/SKILL.md +84 -0
  182. package/templates/.claude/skills/dxkit-reports/SKILL.md +111 -0
  183. package/templates/.devcontainer/devcontainer.json +55 -0
  184. package/templates/.devcontainer/install-agent-clis.sh +42 -0
  185. package/templates/.devcontainer/post-create.sh +81 -0
  186. package/templates/.githooks/pre-commit +55 -0
  187. package/templates/.githooks/pre-push +63 -0
  188. package/templates/.github/workflows/dxkit-baseline-refresh.yml +78 -0
  189. package/templates/.github/workflows/dxkit-guardrails.yml +98 -0
  190. package/templates/AGENTS.md.template +137 -0
  191. package/templates/CLAUDE.md.template +16 -245
  192. package/dist/codebase-scanner.d.ts +0 -36
  193. package/dist/codebase-scanner.d.ts.map +0 -1
  194. package/dist/codebase-scanner.js +0 -688
  195. package/dist/codebase-scanner.js.map +0 -1
  196. package/dist/project-yaml.d.ts +0 -13
  197. package/dist/project-yaml.d.ts.map +0 -1
  198. package/dist/project-yaml.js +0 -188
  199. package/dist/project-yaml.js.map +0 -1
  200. package/templates/.ai/README.md +0 -117
  201. package/templates/.ai/prompts/execution-prompt.md +0 -9
  202. package/templates/.ai/prompts/planning-prompt.md +0 -18
  203. package/templates/.ai/prompts/session-end-template.md +0 -182
  204. package/templates/.ai/prompts/session-end.md +0 -132
  205. package/templates/.ai/prompts/session-start.md +0 -109
  206. package/templates/.ai/prompts/step-by-step.md +0 -113
  207. package/templates/.ai/sessions/.gitkeep +0 -0
  208. package/templates/.claude/agents/doc-writer.md +0 -107
  209. package/templates/.claude/agents/knowledge-bot.md +0 -64
  210. package/templates/.claude/agents/onboarding.md +0 -61
  211. package/templates/.claude/agents/quality-reviewer.md +0 -85
  212. package/templates/.claude/agents-available/code-reviewer.md +0 -29
  213. package/templates/.claude/agents-available/codebase-explorer.md +0 -100
  214. package/templates/.claude/agents-available/dashboard-builder.md +0 -433
  215. package/templates/.claude/agents-available/debugger.md +0 -29
  216. package/templates/.claude/agents-available/dependency-mapper.md +0 -80
  217. package/templates/.claude/agents-available/dev-report.md +0 -108
  218. package/templates/.claude/agents-available/doc-writer.md +0 -107
  219. package/templates/.claude/agents-available/feature-builder.md +0 -163
  220. package/templates/.claude/agents-available/feature-planner.md +0 -185
  221. package/templates/.claude/agents-available/health-auditor.md +0 -95
  222. package/templates/.claude/agents-available/hooks-configurator.md +0 -211
  223. package/templates/.claude/agents-available/knowledge-bot.md +0 -62
  224. package/templates/.claude/agents-available/plan-executor.md +0 -133
  225. package/templates/.claude/agents-available/strategic-planner.md +0 -141
  226. package/templates/.claude/agents-available/test-gap-finder.md +0 -67
  227. package/templates/.claude/agents-available/test-writer.md +0 -34
  228. package/templates/.claude/agents-available/vulnerability-scanner.md +0 -173
  229. package/templates/.claude/commands/ask.md +0 -7
  230. package/templates/.claude/commands/build-feature.md +0 -26
  231. package/templates/.claude/commands/build.md.template +0 -30
  232. package/templates/.claude/commands/check.md.template +0 -43
  233. package/templates/.claude/commands/dashboard.md +0 -28
  234. package/templates/.claude/commands/deps.md +0 -15
  235. package/templates/.claude/commands/dev-report.md +0 -50
  236. package/templates/.claude/commands/docs.md +0 -21
  237. package/templates/.claude/commands/doctor.md +0 -21
  238. package/templates/.claude/commands/enable-agent.md +0 -12
  239. package/templates/.claude/commands/execute-plan.md +0 -25
  240. package/templates/.claude/commands/explore-codebase.md +0 -12
  241. package/templates/.claude/commands/export-pdf.md +0 -30
  242. package/templates/.claude/commands/feature.md +0 -25
  243. package/templates/.claude/commands/fix-issue.md +0 -12
  244. package/templates/.claude/commands/fix.md.template +0 -32
  245. package/templates/.claude/commands/health.md +0 -58
  246. package/templates/.claude/commands/help.md +0 -36
  247. package/templates/.claude/commands/learn.md +0 -48
  248. package/templates/.claude/commands/onboarding.md +0 -21
  249. package/templates/.claude/commands/plan.md +0 -20
  250. package/templates/.claude/commands/quality.md.template +0 -65
  251. package/templates/.claude/commands/session-end.md +0 -40
  252. package/templates/.claude/commands/session-start.md +0 -30
  253. package/templates/.claude/commands/setup-hooks.md +0 -18
  254. package/templates/.claude/commands/setup-pr-review.md +0 -72
  255. package/templates/.claude/commands/stealth-mode.md +0 -17
  256. package/templates/.claude/commands/test-gaps.md +0 -49
  257. package/templates/.claude/commands/test.md.template +0 -40
  258. package/templates/.claude/commands/vulnerabilities.md +0 -49
  259. package/templates/.claude/skills/build/SKILL.md.template +0 -98
  260. package/templates/.claude/skills/deploy/SKILL.md.template +0 -131
  261. package/templates/.claude/skills/deploy/references/gotchas.md +0 -5
  262. package/templates/.claude/skills/doctor/SKILL.md +0 -54
  263. package/templates/.claude/skills/gcloud/SKILL.md +0 -66
  264. package/templates/.claude/skills/gcloud/references/gotchas.md +0 -5
  265. package/templates/.claude/skills/learned/SKILL.md +0 -55
  266. package/templates/.claude/skills/learned/references/conventions.md +0 -11
  267. package/templates/.claude/skills/learned/references/deny-recommendations.md +0 -18
  268. package/templates/.claude/skills/learned/references/gotchas.md +0 -11
  269. package/templates/.claude/skills/pulumi/SKILL.md +0 -73
  270. package/templates/.claude/skills/quality/SKILL.md.template +0 -108
  271. package/templates/.claude/skills/quality/references/gotchas.md +0 -5
  272. package/templates/.claude/skills/review/SKILL.md.template +0 -73
  273. package/templates/.claude/skills/scaffold/SKILL.md.template +0 -123
  274. package/templates/.claude/skills/secrets/SKILL.md +0 -52
  275. package/templates/.claude/skills/session/SKILL.md +0 -43
  276. package/templates/.claude/skills/test/SKILL.md.template +0 -122
  277. package/templates/.claude/skills/test/references/gotchas.md +0 -5
  278. package/templates/.devcontainer/Dockerfile.dev.template +0 -89
  279. package/templates/.devcontainer/devcontainer.json.template +0 -184
  280. package/templates/.devcontainer/docker-compose.yml.template +0 -105
  281. package/templates/.devcontainer/init-scripts/01-init.sql.template +0 -12
  282. package/templates/.devcontainer/post-create.sh.template +0 -298
  283. package/templates/.github/workflows/ci.yml.template +0 -399
  284. package/templates/.github/workflows/quality.yml.template +0 -376
  285. package/templates/.pre-commit-config.yaml.template +0 -106
  286. package/templates/.project/config/edit_config.py +0 -275
  287. package/templates/.project/config/project_config.py +0 -894
  288. package/templates/.project/scripts/codegen/generate-all.sh +0 -20
  289. package/templates/.project/scripts/codegen/validate-all.sh +0 -17
  290. package/templates/.project/scripts/docs/generate-all.sh +0 -30
  291. package/templates/.project/scripts/docs/serve.sh +0 -20
  292. package/templates/.project/scripts/quality/fix-all.sh +0 -138
  293. package/templates/.project/scripts/quality/lint-go.sh +0 -34
  294. package/templates/.project/scripts/quality/lint-python.sh +0 -54
  295. package/templates/.project/scripts/quality/run-all.sh +0 -497
  296. package/templates/.project/scripts/session/commit.sh +0 -70
  297. package/templates/.project/scripts/session/create-pr.sh +0 -165
  298. package/templates/.project/scripts/session/end.sh +0 -207
  299. package/templates/.project/scripts/session/start.sh +0 -233
  300. package/templates/.project/scripts/setup/doctor.sh +0 -404
  301. package/templates/.project/scripts/setup/interactive-setup.sh +0 -585
  302. package/templates/.project/scripts/sync/sync-template.sh +0 -328
  303. package/templates/.project/scripts/test/run-all.sh +0 -179
  304. package/templates/.project/scripts/test/run-quick.sh +0 -25
  305. package/templates/Makefile +0 -514
  306. package/templates/config/versions.yaml +0 -57
  307. package/templates/configs/go/.golangci.yml.template +0 -172
  308. package/templates/configs/go/go.mod.template +0 -15
  309. package/templates/configs/java/README.md +0 -6
  310. package/templates/configs/kotlin/README.md +0 -6
  311. package/templates/configs/node/package.json.template +0 -67
  312. package/templates/configs/node/tsconfig.json.template +0 -53
  313. package/templates/configs/python/pyproject.toml.template +0 -92
  314. package/templates/configs/python/pytest.ini.template +0 -64
  315. package/templates/configs/python/ruff.toml.template +0 -79
  316. package/templates/configs/ruby/README.md +0 -6
  317. package/templates/configs/rust/Cargo.toml.template +0 -51
  318. package/templates/configs/shared/.editorconfig +0 -67
  319. 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())