@vyuhlabs/dxkit 2.4.8 → 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 (243) hide show
  1. package/CHANGELOG.md +235 -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/types.d.ts +6 -4
  18. package/dist/analyzers/types.d.ts.map +1 -1
  19. package/dist/baseline/baseline-file.d.ts +104 -0
  20. package/dist/baseline/baseline-file.d.ts.map +1 -0
  21. package/dist/baseline/baseline-file.js +110 -0
  22. package/dist/baseline/baseline-file.js.map +1 -0
  23. package/dist/baseline/check-renderers.d.ts +108 -0
  24. package/dist/baseline/check-renderers.d.ts.map +1 -0
  25. package/dist/baseline/check-renderers.js +379 -0
  26. package/dist/baseline/check-renderers.js.map +1 -0
  27. package/dist/baseline/check.d.ts +127 -0
  28. package/dist/baseline/check.d.ts.map +1 -0
  29. package/dist/baseline/check.js +462 -0
  30. package/dist/baseline/check.js.map +1 -0
  31. package/dist/baseline/content-hash.d.ts +83 -0
  32. package/dist/baseline/content-hash.d.ts.map +1 -0
  33. package/dist/baseline/content-hash.js +131 -0
  34. package/dist/baseline/content-hash.js.map +1 -0
  35. package/dist/baseline/create.d.ts +96 -0
  36. package/dist/baseline/create.d.ts.map +1 -0
  37. package/dist/baseline/create.js +339 -0
  38. package/dist/baseline/create.js.map +1 -0
  39. package/dist/baseline/entry-to-located.d.ts +35 -0
  40. package/dist/baseline/entry-to-located.d.ts.map +1 -0
  41. package/dist/baseline/entry-to-located.js +72 -0
  42. package/dist/baseline/entry-to-located.js.map +1 -0
  43. package/dist/baseline/finding-identity.d.ts +47 -0
  44. package/dist/baseline/finding-identity.d.ts.map +1 -0
  45. package/dist/baseline/finding-identity.js +292 -0
  46. package/dist/baseline/finding-identity.js.map +1 -0
  47. package/dist/baseline/git-aware-match.d.ts +146 -0
  48. package/dist/baseline/git-aware-match.d.ts.map +1 -0
  49. package/dist/baseline/git-aware-match.js +439 -0
  50. package/dist/baseline/git-aware-match.js.map +1 -0
  51. package/dist/baseline/policy.d.ts +171 -0
  52. package/dist/baseline/policy.d.ts.map +1 -0
  53. package/dist/baseline/policy.js +206 -0
  54. package/dist/baseline/policy.js.map +1 -0
  55. package/dist/baseline/producers/health.d.ts +30 -0
  56. package/dist/baseline/producers/health.d.ts.map +1 -0
  57. package/dist/baseline/producers/health.js +42 -0
  58. package/dist/baseline/producers/health.js.map +1 -0
  59. package/dist/baseline/producers/index.d.ts +164 -0
  60. package/dist/baseline/producers/index.d.ts.map +1 -0
  61. package/dist/baseline/producers/index.js +200 -0
  62. package/dist/baseline/producers/index.js.map +1 -0
  63. package/dist/baseline/producers/licenses.d.ts +23 -0
  64. package/dist/baseline/producers/licenses.d.ts.map +1 -0
  65. package/dist/baseline/producers/licenses.js +46 -0
  66. package/dist/baseline/producers/licenses.js.map +1 -0
  67. package/dist/baseline/producers/quality.d.ts +39 -0
  68. package/dist/baseline/producers/quality.d.ts.map +1 -0
  69. package/dist/baseline/producers/quality.js +84 -0
  70. package/dist/baseline/producers/quality.js.map +1 -0
  71. package/dist/baseline/producers/secret-hmac.d.ts +45 -0
  72. package/dist/baseline/producers/secret-hmac.d.ts.map +1 -0
  73. package/dist/baseline/producers/secret-hmac.js +70 -0
  74. package/dist/baseline/producers/secret-hmac.js.map +1 -0
  75. package/dist/baseline/producers/security.d.ts +59 -0
  76. package/dist/baseline/producers/security.d.ts.map +1 -0
  77. package/dist/baseline/producers/security.js +135 -0
  78. package/dist/baseline/producers/security.js.map +1 -0
  79. package/dist/baseline/producers/tests.d.ts +36 -0
  80. package/dist/baseline/producers/tests.d.ts.map +1 -0
  81. package/dist/baseline/producers/tests.js +69 -0
  82. package/dist/baseline/producers/tests.js.map +1 -0
  83. package/dist/baseline/salt.d.ts +45 -0
  84. package/dist/baseline/salt.d.ts.map +1 -0
  85. package/dist/baseline/salt.js +113 -0
  86. package/dist/baseline/salt.js.map +1 -0
  87. package/dist/baseline/show.d.ts +79 -0
  88. package/dist/baseline/show.d.ts.map +1 -0
  89. package/dist/baseline/show.js +233 -0
  90. package/dist/baseline/show.js.map +1 -0
  91. package/dist/baseline/types.d.ts +482 -0
  92. package/dist/baseline/types.d.ts.map +1 -0
  93. package/dist/baseline/types.js +53 -0
  94. package/dist/baseline/types.js.map +1 -0
  95. package/dist/cli.d.ts.map +1 -1
  96. package/dist/cli.js +360 -81
  97. package/dist/cli.js.map +1 -1
  98. package/dist/codebase-scanner.d.ts.map +1 -1
  99. package/dist/codebase-scanner.js +0 -1
  100. package/dist/codebase-scanner.js.map +1 -1
  101. package/dist/constants.d.ts.map +1 -1
  102. package/dist/constants.js +0 -4
  103. package/dist/constants.js.map +1 -1
  104. package/dist/doctor.d.ts.map +1 -1
  105. package/dist/doctor.js +22 -25
  106. package/dist/doctor.js.map +1 -1
  107. package/dist/fail-on.d.ts +84 -0
  108. package/dist/fail-on.d.ts.map +1 -0
  109. package/dist/fail-on.js +128 -0
  110. package/dist/fail-on.js.map +1 -0
  111. package/dist/generator.d.ts.map +1 -1
  112. package/dist/generator.js +2 -141
  113. package/dist/generator.js.map +1 -1
  114. package/dist/languages/csharp.d.ts.map +1 -1
  115. package/dist/languages/csharp.js +0 -9
  116. package/dist/languages/csharp.js.map +1 -1
  117. package/dist/languages/go.d.ts.map +1 -1
  118. package/dist/languages/go.js +0 -15
  119. package/dist/languages/go.js.map +1 -1
  120. package/dist/languages/index.d.ts +1 -1
  121. package/dist/languages/index.d.ts.map +1 -1
  122. package/dist/languages/index.js.map +1 -1
  123. package/dist/languages/java.d.ts.map +1 -1
  124. package/dist/languages/java.js +0 -6
  125. package/dist/languages/java.js.map +1 -1
  126. package/dist/languages/kotlin.d.ts.map +1 -1
  127. package/dist/languages/kotlin.js +0 -11
  128. package/dist/languages/kotlin.js.map +1 -1
  129. package/dist/languages/python.d.ts.map +1 -1
  130. package/dist/languages/python.js +0 -15
  131. package/dist/languages/python.js.map +1 -1
  132. package/dist/languages/ruby.d.ts.map +1 -1
  133. package/dist/languages/ruby.js +0 -6
  134. package/dist/languages/ruby.js.map +1 -1
  135. package/dist/languages/rust.d.ts.map +1 -1
  136. package/dist/languages/rust.js +0 -4
  137. package/dist/languages/rust.js.map +1 -1
  138. package/dist/languages/types.d.ts +2 -28
  139. package/dist/languages/types.d.ts.map +1 -1
  140. package/dist/languages/typescript.d.ts.map +1 -1
  141. package/dist/languages/typescript.js +26 -4
  142. package/dist/languages/typescript.js.map +1 -1
  143. package/dist/lib.d.ts +2 -3
  144. package/dist/lib.d.ts.map +1 -1
  145. package/dist/lib.js +3 -6
  146. package/dist/lib.js.map +1 -1
  147. package/dist/prompts.d.ts.map +1 -1
  148. package/dist/prompts.js +0 -10
  149. package/dist/prompts.js.map +1 -1
  150. package/dist/report-schema.d.ts +42 -0
  151. package/dist/report-schema.d.ts.map +1 -0
  152. package/dist/report-schema.js +54 -0
  153. package/dist/report-schema.js.map +1 -0
  154. package/dist/ship-installers.d.ts +106 -0
  155. package/dist/ship-installers.d.ts.map +1 -0
  156. package/dist/ship-installers.js +415 -0
  157. package/dist/ship-installers.js.map +1 -0
  158. package/dist/types.d.ts +0 -4
  159. package/dist/types.d.ts.map +1 -1
  160. package/dist/update.d.ts.map +1 -1
  161. package/dist/update.js +0 -4
  162. package/dist/update.js.map +1 -1
  163. package/package.json +17 -11
  164. package/templates/.claude/agents/onboarding.md +5 -4
  165. package/templates/.claude/agents-available/codebase-explorer.md +1 -1
  166. package/templates/.claude/agents-available/debugger.md +2 -2
  167. package/templates/.claude/agents-available/health-auditor.md +2 -2
  168. package/templates/.claude/commands/doctor.md +20 -12
  169. package/templates/.claude/skills/build/SKILL.md.template +22 -30
  170. package/templates/.claude/skills/deploy/SKILL.md.template +5 -25
  171. package/templates/.claude/skills/doctor/SKILL.md +24 -47
  172. package/templates/.claude/skills/gcloud/SKILL.md +5 -5
  173. package/templates/.claude/skills/learned/SKILL.md +1 -1
  174. package/templates/.claude/skills/pulumi/SKILL.md +2 -2
  175. package/templates/.claude/skills/quality/SKILL.md.template +4 -23
  176. package/templates/.claude/skills/review/SKILL.md.template +4 -3
  177. package/templates/.claude/skills/scaffold/SKILL.md.template +5 -15
  178. package/templates/.claude/skills/secrets/SKILL.md +20 -21
  179. package/templates/.claude/skills/session/SKILL.md +20 -31
  180. package/templates/.claude/skills/test/SKILL.md.template +1 -7
  181. package/templates/.devcontainer/devcontainer.json +81 -0
  182. package/templates/.devcontainer/install-agent-clis.sh +42 -0
  183. package/templates/.devcontainer/post-create.sh +67 -0
  184. package/templates/.githooks/pre-commit +55 -0
  185. package/templates/.githooks/pre-push +63 -0
  186. package/templates/.github/workflows/dxkit-baseline-refresh.yml +78 -0
  187. package/templates/.github/workflows/dxkit-guardrails.yml +98 -0
  188. package/templates/CLAUDE.md.template +62 -196
  189. package/dist/project-yaml.d.ts +0 -13
  190. package/dist/project-yaml.d.ts.map +0 -1
  191. package/dist/project-yaml.js +0 -188
  192. package/dist/project-yaml.js.map +0 -1
  193. package/templates/.ai/README.md +0 -117
  194. package/templates/.ai/prompts/execution-prompt.md +0 -9
  195. package/templates/.ai/prompts/planning-prompt.md +0 -18
  196. package/templates/.ai/prompts/session-end-template.md +0 -182
  197. package/templates/.ai/prompts/session-end.md +0 -132
  198. package/templates/.ai/prompts/session-start.md +0 -109
  199. package/templates/.ai/prompts/step-by-step.md +0 -113
  200. package/templates/.ai/sessions/.gitkeep +0 -0
  201. package/templates/.claude/commands/setup-pr-review.md +0 -72
  202. package/templates/.devcontainer/Dockerfile.dev.template +0 -89
  203. package/templates/.devcontainer/devcontainer.json.template +0 -184
  204. package/templates/.devcontainer/docker-compose.yml.template +0 -105
  205. package/templates/.devcontainer/init-scripts/01-init.sql.template +0 -12
  206. package/templates/.devcontainer/post-create.sh.template +0 -298
  207. package/templates/.github/workflows/ci.yml.template +0 -399
  208. package/templates/.github/workflows/quality.yml.template +0 -376
  209. package/templates/.pre-commit-config.yaml.template +0 -106
  210. package/templates/.project/config/edit_config.py +0 -275
  211. package/templates/.project/config/project_config.py +0 -894
  212. package/templates/.project/scripts/codegen/generate-all.sh +0 -20
  213. package/templates/.project/scripts/codegen/validate-all.sh +0 -17
  214. package/templates/.project/scripts/docs/generate-all.sh +0 -30
  215. package/templates/.project/scripts/docs/serve.sh +0 -20
  216. package/templates/.project/scripts/quality/fix-all.sh +0 -138
  217. package/templates/.project/scripts/quality/lint-go.sh +0 -34
  218. package/templates/.project/scripts/quality/lint-python.sh +0 -54
  219. package/templates/.project/scripts/quality/run-all.sh +0 -497
  220. package/templates/.project/scripts/session/commit.sh +0 -70
  221. package/templates/.project/scripts/session/create-pr.sh +0 -165
  222. package/templates/.project/scripts/session/end.sh +0 -207
  223. package/templates/.project/scripts/session/start.sh +0 -233
  224. package/templates/.project/scripts/setup/doctor.sh +0 -404
  225. package/templates/.project/scripts/setup/interactive-setup.sh +0 -585
  226. package/templates/.project/scripts/sync/sync-template.sh +0 -328
  227. package/templates/.project/scripts/test/run-all.sh +0 -179
  228. package/templates/.project/scripts/test/run-quick.sh +0 -25
  229. package/templates/Makefile +0 -514
  230. package/templates/config/versions.yaml +0 -57
  231. package/templates/configs/go/.golangci.yml.template +0 -172
  232. package/templates/configs/go/go.mod.template +0 -15
  233. package/templates/configs/java/README.md +0 -6
  234. package/templates/configs/kotlin/README.md +0 -6
  235. package/templates/configs/node/package.json.template +0 -67
  236. package/templates/configs/node/tsconfig.json.template +0 -53
  237. package/templates/configs/python/pyproject.toml.template +0 -92
  238. package/templates/configs/python/pytest.ini.template +0 -64
  239. package/templates/configs/python/ruff.toml.template +0 -79
  240. package/templates/configs/ruby/README.md +0 -6
  241. package/templates/configs/rust/Cargo.toml.template +0 -51
  242. package/templates/configs/shared/.editorconfig +0 -67
  243. package/templates/scripts/validate-templates.sh +0 -449
@@ -1,404 +0,0 @@
1
- #!/bin/bash
2
- #
3
- # Doctor Script - Diagnose common setup issues
4
- # =============================================
5
- #
6
- # Checks:
7
- # - Required files exist (.project.yaml, Makefile, etc.)
8
- # - Language toolchains match enabled languages
9
- # - Quality tools installed
10
- # - Git hooks configured (if precommit enabled)
11
- # - Config syntax valid
12
- #
13
-
14
- set -e
15
-
16
- # Colors
17
- CYAN='\033[36m'
18
- GREEN='\033[32m'
19
- YELLOW='\033[33m'
20
- RED='\033[31m'
21
- BOLD='\033[1m'
22
- DIM='\033[2m'
23
- RESET='\033[0m'
24
-
25
- # Counters
26
- CHECKS_PASSED=0
27
- CHECKS_WARNED=0
28
- CHECKS_FAILED=0
29
-
30
- # ============================================================================
31
- # Helper Functions
32
- # ============================================================================
33
-
34
- print_header() {
35
- echo ""
36
- echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
37
- echo -e "${CYAN} $1${RESET}"
38
- echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
39
- echo ""
40
- }
41
-
42
- check_pass() {
43
- echo -e " ${GREEN}✓${RESET} $1"
44
- CHECKS_PASSED=$((CHECKS_PASSED + 1))
45
- }
46
-
47
- check_warn() {
48
- echo -e " ${YELLOW}!${RESET} $1"
49
- if [ -n "$2" ]; then
50
- echo -e " ${DIM}→ $2${RESET}"
51
- fi
52
- CHECKS_WARNED=$((CHECKS_WARNED + 1))
53
- }
54
-
55
- check_fail() {
56
- echo -e " ${RED}✗${RESET} $1"
57
- if [ -n "$2" ]; then
58
- echo -e " ${DIM}→ $2${RESET}"
59
- fi
60
- CHECKS_FAILED=$((CHECKS_FAILED + 1))
61
- }
62
-
63
- # ============================================================================
64
- # Core File Checks
65
- # ============================================================================
66
-
67
- check_core_files() {
68
- echo -e "${BOLD}Core Files${RESET}"
69
- echo ""
70
-
71
- # .project.yaml
72
- if [ -f ".project.yaml" ]; then
73
- check_pass ".project.yaml exists"
74
-
75
- # Validate YAML syntax
76
- if python3 -c "import yaml; yaml.safe_load(open('.project.yaml'))" 2>/dev/null; then
77
- check_pass ".project.yaml is valid YAML"
78
- else
79
- check_fail ".project.yaml has invalid YAML syntax" "Run: python3 -c \"import yaml; yaml.safe_load(open('.project.yaml'))\""
80
- fi
81
- else
82
- check_fail ".project.yaml not found" "Run: ./bootstrap.sh to initialize"
83
- fi
84
-
85
- # Makefile
86
- if [ -f "Makefile" ]; then
87
- check_pass "Makefile exists"
88
- else
89
- check_fail "Makefile not found" "Run: ./bootstrap.sh to initialize"
90
- fi
91
-
92
- # .project directory
93
- if [ -d ".project" ]; then
94
- check_pass ".project/ directory exists"
95
-
96
- # Check key scripts
97
- if [ -f ".project/config/project_config.py" ]; then
98
- check_pass "project_config.py exists"
99
- else
100
- check_warn "project_config.py missing" "Some make commands may not work"
101
- fi
102
- else
103
- check_fail ".project/ directory not found" "Run: ./bootstrap.sh to initialize"
104
- fi
105
-
106
- echo ""
107
- }
108
-
109
- # ============================================================================
110
- # Language Toolchain Checks
111
- # ============================================================================
112
-
113
- check_language_toolchains() {
114
- echo -e "${BOLD}Language Toolchains${RESET}"
115
- echo ""
116
-
117
- # Helper function to extract major.minor version
118
- get_major_minor() {
119
- echo "$1" | sed 's/^\([0-9]*\.[0-9]*\).*/\1/'
120
- }
121
-
122
- # Read enabled languages from config
123
- if [ -f ".project.yaml" ]; then
124
- # Python
125
- PYTHON_ENABLED=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print('true' if c.get('languages',{}).get('python',{}).get('enabled', False) else 'false')" 2>/dev/null || echo "false")
126
- PYTHON_VERSION_CONFIG=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print(c.get('languages',{}).get('python',{}).get('version', '3.12'))" 2>/dev/null || echo "3.12")
127
-
128
- if [ "$PYTHON_ENABLED" = "true" ]; then
129
- if command -v python3 &> /dev/null; then
130
- ACTUAL_VERSION=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
131
- # Compare only major.minor versions (ignore patch)
132
- CONFIG_MAJOR_MINOR=$(get_major_minor "$PYTHON_VERSION_CONFIG")
133
- ACTUAL_MAJOR_MINOR=$(get_major_minor "$ACTUAL_VERSION")
134
- if [[ "$ACTUAL_MAJOR_MINOR" == "$CONFIG_MAJOR_MINOR" ]]; then
135
- check_pass "Python $ACTUAL_VERSION installed (config: $PYTHON_VERSION_CONFIG)"
136
- else
137
- check_warn "Python version mismatch" "Config: $PYTHON_VERSION_CONFIG, Installed: $ACTUAL_VERSION"
138
- fi
139
- else
140
- check_fail "Python not found but enabled in config" "Install Python $PYTHON_VERSION_CONFIG"
141
- fi
142
- else
143
- echo -e " ${DIM}○ Python not enabled${RESET}"
144
- fi
145
-
146
- # Go
147
- GO_ENABLED=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print('true' if c.get('languages',{}).get('go',{}).get('enabled', False) else 'false')" 2>/dev/null || echo "false")
148
- GO_VERSION=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print(c.get('languages',{}).get('go',{}).get('version', '1.24.0'))" 2>/dev/null || echo "1.24.0")
149
-
150
- if [ "$GO_ENABLED" = "true" ]; then
151
- if command -v go &> /dev/null; then
152
- ACTUAL_VERSION=$(go version | awk '{print $3}' | sed 's/go//')
153
- check_pass "Go $ACTUAL_VERSION installed (config: $GO_VERSION)"
154
- else
155
- check_fail "Go not found but enabled in config" "Install Go $GO_VERSION"
156
- fi
157
- else
158
- echo -e " ${DIM}○ Go not enabled${RESET}"
159
- fi
160
-
161
- # Node.js
162
- NODE_ENABLED=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print('true' if c.get('languages',{}).get('node',{}).get('enabled', False) else 'false')" 2>/dev/null || echo "false")
163
- NODE_VERSION_CONFIG=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print(c.get('languages',{}).get('node',{}).get('version', '20'))" 2>/dev/null || echo "20")
164
-
165
- if [ "$NODE_ENABLED" = "true" ]; then
166
- if command -v node &> /dev/null; then
167
- ACTUAL_VERSION=$(node --version | sed 's/v//')
168
- # Compare major version only for Node.js (config typically specifies major only)
169
- ACTUAL_MAJOR=$(echo "$ACTUAL_VERSION" | cut -d. -f1)
170
- CONFIG_MAJOR=$(echo "$NODE_VERSION_CONFIG" | cut -d. -f1)
171
- if [[ "$ACTUAL_MAJOR" == "$CONFIG_MAJOR" ]]; then
172
- check_pass "Node.js $ACTUAL_VERSION installed (config: $NODE_VERSION_CONFIG)"
173
- else
174
- check_warn "Node.js version mismatch" "Config: $NODE_VERSION_CONFIG, Installed: $ACTUAL_VERSION"
175
- fi
176
- else
177
- check_fail "Node.js not found but enabled in config" "Install Node.js $NODE_VERSION_CONFIG"
178
- fi
179
- else
180
- echo -e " ${DIM}○ Node.js not enabled${RESET}"
181
- fi
182
-
183
- # Rust
184
- RUST_ENABLED=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print('true' if c.get('languages',{}).get('rust',{}).get('enabled', False) else 'false')" 2>/dev/null || echo "false")
185
-
186
- if [ "$RUST_ENABLED" = "true" ]; then
187
- if command -v rustc &> /dev/null; then
188
- ACTUAL_VERSION=$(rustc --version | awk '{print $2}')
189
- check_pass "Rust $ACTUAL_VERSION installed"
190
- else
191
- check_fail "Rust not found but enabled in config" "Install Rust via rustup"
192
- fi
193
- else
194
- echo -e " ${DIM}○ Rust not enabled${RESET}"
195
- fi
196
- else
197
- check_warn "Cannot check toolchains" ".project.yaml not found"
198
- fi
199
-
200
- echo ""
201
- }
202
-
203
- # ============================================================================
204
- # Quality Tools Checks
205
- # ============================================================================
206
-
207
- check_quality_tools() {
208
- echo -e "${BOLD}Quality Tools${RESET}"
209
- echo ""
210
-
211
- if [ -f ".project.yaml" ]; then
212
- # Python quality tools
213
- PYTHON_ENABLED=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print('true' if c.get('languages',{}).get('python',{}).get('enabled', False) else 'false')" 2>/dev/null || echo "false")
214
-
215
- if [ "$PYTHON_ENABLED" = "true" ]; then
216
- # ruff
217
- if command -v ruff &> /dev/null; then
218
- check_pass "ruff installed (Python linter)"
219
- else
220
- check_warn "ruff not installed" "pip install ruff"
221
- fi
222
-
223
- # mypy
224
- if command -v mypy &> /dev/null; then
225
- check_pass "mypy installed (Python type checker)"
226
- else
227
- check_warn "mypy not installed" "pip install mypy"
228
- fi
229
-
230
- # pytest
231
- if python3 -c "import pytest" 2>/dev/null; then
232
- check_pass "pytest installed (Python testing)"
233
- else
234
- check_warn "pytest not installed" "pip install pytest pytest-cov"
235
- fi
236
- fi
237
-
238
- # Go quality tools
239
- GO_ENABLED=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print('true' if c.get('languages',{}).get('go',{}).get('enabled', False) else 'false')" 2>/dev/null || echo "false")
240
-
241
- if [ "$GO_ENABLED" = "true" ]; then
242
- if command -v golangci-lint &> /dev/null; then
243
- check_pass "golangci-lint installed (Go linter)"
244
- else
245
- check_warn "golangci-lint not installed" "go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"
246
- fi
247
- fi
248
-
249
- # Node quality tools
250
- NODE_ENABLED=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print('true' if c.get('languages',{}).get('node',{}).get('enabled', False) else 'false')" 2>/dev/null || echo "false")
251
-
252
- if [ "$NODE_ENABLED" = "true" ]; then
253
- if command -v eslint &> /dev/null || [ -f "node_modules/.bin/eslint" ]; then
254
- check_pass "eslint available (Node linter)"
255
- else
256
- check_warn "eslint not installed" "npm install -D eslint"
257
- fi
258
- fi
259
- else
260
- check_warn "Cannot check quality tools" ".project.yaml not found"
261
- fi
262
-
263
- echo ""
264
- }
265
-
266
- # ============================================================================
267
- # Git Hooks Checks
268
- # ============================================================================
269
-
270
- check_git_hooks() {
271
- echo -e "${BOLD}Git Configuration${RESET}"
272
- echo ""
273
-
274
- # Check if we're in a git repo
275
- if [ -d ".git" ]; then
276
- check_pass "Git repository initialized"
277
-
278
- # Check git user config
279
- if git config user.name &> /dev/null; then
280
- check_pass "Git user.name configured: $(git config user.name)"
281
- else
282
- check_warn "Git user.name not set" "git config user.name 'Your Name'"
283
- fi
284
-
285
- if git config user.email &> /dev/null; then
286
- check_pass "Git user.email configured"
287
- else
288
- check_warn "Git user.email not set" "git config user.email 'you@example.com'"
289
- fi
290
-
291
- # Check pre-commit hooks if enabled
292
- if [ -f ".project.yaml" ]; then
293
- PRECOMMIT_ENABLED=$(python3 -c "import yaml; c=yaml.safe_load(open('.project.yaml')); print('true' if c.get('precommit', False) else 'false')" 2>/dev/null || echo "false")
294
-
295
- if [ "$PRECOMMIT_ENABLED" = "true" ]; then
296
- if [ -f ".git/hooks/pre-commit" ]; then
297
- check_pass "Pre-commit hook installed"
298
- else
299
- check_warn "Pre-commit hook not installed" "Run: pre-commit install"
300
- fi
301
-
302
- if command -v pre-commit &> /dev/null; then
303
- check_pass "pre-commit tool installed"
304
- else
305
- check_warn "pre-commit tool not installed" "pip install pre-commit"
306
- fi
307
- else
308
- echo -e " ${DIM}○ Pre-commit hooks not enabled${RESET}"
309
- fi
310
- fi
311
- else
312
- check_warn "Not a git repository" "Run: git init"
313
- fi
314
-
315
- echo ""
316
- }
317
-
318
- # ============================================================================
319
- # Environment Checks
320
- # ============================================================================
321
-
322
- check_environment() {
323
- echo -e "${BOLD}Environment${RESET}"
324
- echo ""
325
-
326
- # Make
327
- if command -v make &> /dev/null; then
328
- check_pass "make available"
329
- else
330
- check_warn "make not installed" "Install via package manager"
331
- fi
332
-
333
- # PyYAML (required for config tools)
334
- if python3 -c "import yaml" 2>/dev/null; then
335
- check_pass "PyYAML installed"
336
- else
337
- check_fail "PyYAML not installed" "pip install pyyaml"
338
- fi
339
-
340
- # Docker (optional)
341
- if command -v docker &> /dev/null; then
342
- check_pass "Docker available"
343
- else
344
- echo -e " ${DIM}○ Docker not installed (optional)${RESET}"
345
- fi
346
-
347
- echo ""
348
- }
349
-
350
- # ============================================================================
351
- # Summary
352
- # ============================================================================
353
-
354
- print_summary() {
355
- print_header "DIAGNOSTIC SUMMARY"
356
-
357
- TOTAL=$((CHECKS_PASSED + CHECKS_WARNED + CHECKS_FAILED))
358
-
359
- echo -e " ${GREEN}✓ Passed:${RESET} $CHECKS_PASSED"
360
- echo -e " ${YELLOW}! Warnings:${RESET} $CHECKS_WARNED"
361
- echo -e " ${RED}✗ Failed:${RESET} $CHECKS_FAILED"
362
- echo ""
363
-
364
- if [ $CHECKS_FAILED -gt 0 ]; then
365
- echo -e " ${RED}${BOLD}Some checks failed.${RESET}"
366
- echo -e " ${DIM}Fix the issues above and run 'make doctor' again.${RESET}"
367
- echo ""
368
- exit 1
369
- elif [ $CHECKS_WARNED -gt 0 ]; then
370
- echo -e " ${YELLOW}${BOLD}Setup complete with warnings.${RESET}"
371
- echo -e " ${DIM}Consider fixing warnings for best experience.${RESET}"
372
- echo ""
373
- else
374
- echo -e " ${GREEN}${BOLD}All checks passed!${RESET}"
375
- echo -e " ${DIM}Your environment is ready for development.${RESET}"
376
- echo ""
377
- fi
378
-
379
- echo -e " ${CYAN}Next steps:${RESET}"
380
- echo -e " • Run ${CYAN}make info${RESET} to see your configuration"
381
- echo -e " • Run ${CYAN}make help${RESET} to see available commands"
382
- echo -e " • Run ${CYAN}make test${RESET} to verify everything works"
383
- echo ""
384
- }
385
-
386
- # ============================================================================
387
- # Main
388
- # ============================================================================
389
-
390
- main() {
391
- print_header "PROJECT DIAGNOSTICS"
392
- echo -e " ${DIM}Checking your development environment...${RESET}"
393
- echo ""
394
-
395
- check_core_files
396
- check_language_toolchains
397
- check_quality_tools
398
- check_git_hooks
399
- check_environment
400
-
401
- print_summary
402
- }
403
-
404
- main "$@"