@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,399 +0,0 @@
1
- # Generated from template - CI/CD Pipeline
2
- # This workflow runs tests for all enabled languages
3
- # Configuration is loaded from .project.yaml via project_config.py
4
-
5
- name: CI Pipeline
6
-
7
- on:
8
- push:
9
- branches: [main, develop]
10
- pull_request:
11
- branches: [main, develop]
12
-
13
- jobs:
14
- # Validate project configuration exists
15
- validate:
16
- name: Validate Configuration
17
- runs-on: ubuntu-latest
18
- steps:
19
- - name: Checkout code
20
- uses: actions/checkout@v4
21
-
22
- - name: Validate .project.yaml exists
23
- run: |
24
- if [ ! -f ".project.yaml" ]; then
25
- echo "::error::Missing .project.yaml - run 'make init' or bootstrap the project"
26
- exit 1
27
- fi
28
- echo "✓ .project.yaml found"
29
-
30
- - name: Set up Python for config
31
- uses: actions/setup-python@v5
32
- with:
33
- python-version: "3.12"
34
-
35
- - name: Install PyYAML
36
- run: pip install pyyaml
37
-
38
- - name: Validate configuration
39
- run: |
40
- python3 .project/config/project_config.py info
41
- echo ""
42
- echo "Configuration validated successfully"
43
-
44
- {{#IF_PYTHON}}
45
- test-python:
46
- name: Python {{PYTHON_VERSION}} Tests
47
- runs-on: ubuntu-latest
48
- needs: validate
49
-
50
- steps:
51
- - name: Checkout code
52
- uses: actions/checkout@v4
53
-
54
- - name: Set up Python {{PYTHON_VERSION}}
55
- uses: actions/setup-python@v5
56
- with:
57
- python-version: "{{PYTHON_VERSION}}"
58
- cache: 'pip'
59
-
60
- - name: Install dependencies
61
- run: |
62
- python -m pip install --upgrade pip
63
- pip install pyyaml # For config loading
64
- if [ -f pyproject.toml ]; then
65
- pip install -e .[dev]
66
- elif [ -f requirements.txt ]; then
67
- pip install -r requirements.txt
68
- fi
69
- if [ -f requirements-dev.txt ]; then
70
- pip install -r requirements-dev.txt
71
- fi
72
-
73
- - name: Load quality configuration
74
- id: quality
75
- run: |
76
- # Load from .project.yaml via project_config.py (primary source)
77
- if [ -f .project/config/project_config.py ]; then
78
- eval "$(python3 .project/config/project_config.py export python)"
79
- echo "coverage_threshold=${PYTHON_COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
80
- echo "lint_enabled=${PYTHON_LINT_ENABLED:-true}" >> $GITHUB_OUTPUT
81
- # Fallback to legacy .quality.env
82
- elif [ -f .quality.env ]; then
83
- source .quality.env
84
- echo "coverage_threshold=${COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
85
- echo "lint_enabled=true" >> $GITHUB_OUTPUT
86
- else
87
- echo "coverage_threshold={{COVERAGE_THRESHOLD}}" >> $GITHUB_OUTPUT
88
- echo "lint_enabled=true" >> $GITHUB_OUTPUT
89
- fi
90
-
91
- - name: Run tests with pytest
92
- run: |
93
- THRESHOLD=${{ steps.quality.outputs.coverage_threshold }}
94
- if [ "$THRESHOLD" = "0" ]; then
95
- pytest --cov=. --cov-report=xml --cov-report=term
96
- else
97
- pytest --cov=. --cov-report=xml --cov-report=term --cov-fail-under=$THRESHOLD
98
- fi
99
-
100
- - name: Upload coverage to Codecov
101
- uses: codecov/codecov-action@v3
102
- with:
103
- file: ./coverage.xml
104
- flags: python
105
- name: python-{{PYTHON_VERSION}}
106
-
107
- {{/IF_PYTHON}}
108
- {{#IF_GO}}
109
- test-go:
110
- name: Go {{GO_VERSION}} Tests
111
- runs-on: ubuntu-latest
112
- needs: validate
113
-
114
- steps:
115
- - name: Checkout code
116
- uses: actions/checkout@v4
117
-
118
- - name: Set up Go {{GO_VERSION}}
119
- uses: actions/setup-go@v5
120
- with:
121
- go-version: "{{GO_VERSION}}"
122
- cache: true
123
-
124
- - name: Set up Python for config
125
- uses: actions/setup-python@v5
126
- with:
127
- python-version: "3.12"
128
-
129
- - name: Install PyYAML
130
- run: pip install pyyaml
131
-
132
- - name: Load quality configuration
133
- id: quality
134
- run: |
135
- # Load from .project.yaml via project_config.py (primary source)
136
- if [ -f .project/config/project_config.py ]; then
137
- eval "$(python3 .project/config/project_config.py export go)"
138
- echo "coverage_threshold=${GO_COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
139
- # Fallback to legacy .quality.env
140
- elif [ -f .quality.env ]; then
141
- source .quality.env
142
- echo "coverage_threshold=${COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
143
- else
144
- echo "coverage_threshold={{COVERAGE_THRESHOLD}}" >> $GITHUB_OUTPUT
145
- fi
146
-
147
- - name: Download dependencies
148
- run: go mod download
149
-
150
- - name: Run tests
151
- run: go test -v -race -coverprofile=coverage.out -covermode=atomic ./...
152
-
153
- {{#IF_COVERAGE_ENABLED}}
154
- - name: Check coverage threshold
155
- run: |
156
- THRESHOLD=${{ steps.quality.outputs.coverage_threshold }}
157
-
158
- if [ "$THRESHOLD" = "0" ]; then
159
- echo "Coverage check skipped (threshold=0)"
160
- exit 0
161
- fi
162
-
163
- COVERAGE=$(go tool cover -func=coverage.out | grep total | awk '{print substr($3, 1, length($3)-1)}')
164
- echo "Total coverage: ${COVERAGE}%"
165
- echo "Required threshold: ${THRESHOLD}%"
166
- if (( $(echo "$COVERAGE < $THRESHOLD" | bc -l) )); then
167
- echo "Coverage ${COVERAGE}% is below threshold ${THRESHOLD}%"
168
- exit 1
169
- fi
170
- echo "Coverage check passed!"
171
-
172
- {{/IF_COVERAGE_ENABLED}}
173
- - name: Upload coverage to Codecov
174
- uses: codecov/codecov-action@v3
175
- with:
176
- file: ./coverage.out
177
- flags: go
178
- name: go-{{GO_VERSION}}
179
-
180
- {{/IF_GO}}
181
- {{#IF_NODE}}
182
- test-node:
183
- name: Node.js {{NODE_VERSION}} Tests
184
- runs-on: ubuntu-latest
185
- needs: validate
186
-
187
- steps:
188
- - name: Checkout code
189
- uses: actions/checkout@v4
190
-
191
- - name: Set up Node.js {{NODE_VERSION}}
192
- uses: actions/setup-node@v4
193
- with:
194
- node-version: "{{NODE_VERSION}}"
195
- cache: 'npm'
196
-
197
- - name: Set up Python for config
198
- uses: actions/setup-python@v5
199
- with:
200
- python-version: "3.12"
201
-
202
- - name: Install PyYAML
203
- run: pip install pyyaml
204
-
205
- - name: Load quality configuration
206
- id: quality
207
- run: |
208
- # Load from .project.yaml via project_config.py (primary source)
209
- if [ -f .project/config/project_config.py ]; then
210
- eval "$(python3 .project/config/project_config.py export node)"
211
- echo "coverage_threshold=${NODE_COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
212
- # Fallback to legacy .quality.env
213
- elif [ -f .quality.env ]; then
214
- source .quality.env
215
- echo "coverage_threshold=${COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
216
- else
217
- echo "coverage_threshold={{COVERAGE_THRESHOLD}}" >> $GITHUB_OUTPUT
218
- fi
219
-
220
- - name: Install dependencies
221
- run: npm ci
222
-
223
- - name: Run tests
224
- run: |
225
- THRESHOLD=${{ steps.quality.outputs.coverage_threshold }}
226
- if [ "$THRESHOLD" = "0" ]; then
227
- npm test -- --coverage
228
- else
229
- npm test -- --coverage --coverageThreshold='{"global":{"branches":'$THRESHOLD',"functions":'$THRESHOLD',"lines":'$THRESHOLD',"statements":'$THRESHOLD'}}'
230
- fi
231
-
232
- - name: Upload coverage to Codecov
233
- uses: codecov/codecov-action@v3
234
- with:
235
- file: ./coverage/coverage-final.json
236
- flags: node
237
- name: node-{{NODE_VERSION}}
238
-
239
- {{/IF_NODE}}
240
- {{#IF_NEXTJS}}
241
- build-nextjs:
242
- name: Next.js Build & Test
243
- runs-on: ubuntu-latest
244
- needs: validate
245
- defaults:
246
- run:
247
- working-directory: frontend
248
-
249
- steps:
250
- - name: Checkout code
251
- uses: actions/checkout@v4
252
-
253
- - name: Set up Node.js {{NODE_VERSION}}
254
- uses: actions/setup-node@v4
255
- with:
256
- node-version: "{{NODE_VERSION}}"
257
- cache: 'npm'
258
- cache-dependency-path: frontend/package-lock.json
259
-
260
- - name: Install dependencies
261
- run: npm ci
262
-
263
- - name: Run linting
264
- run: npm run lint
265
-
266
- - name: Run type checking
267
- run: npx tsc --noEmit
268
-
269
- - name: Build Next.js app
270
- run: npm run build
271
- env:
272
- NEXT_TELEMETRY_DISABLED: 1
273
-
274
- - name: Determine coverage threshold
275
- id: quality
276
- run: |
277
- if [ -f "../.project.yaml" ]; then
278
- echo "coverage_threshold=${NEXTJS_COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
279
- else
280
- echo "coverage_threshold={{COVERAGE_THRESHOLD}}" >> $GITHUB_OUTPUT
281
- fi
282
-
283
- - name: Run tests with coverage
284
- run: |
285
- THRESHOLD=${{ steps.quality.outputs.coverage_threshold }}
286
- if grep -q '"test"' package.json; then
287
- {{#IF_COVERAGE_ENABLED}}
288
- npm test -- --coverage --passWithNoTests --coverageThreshold='{"global":{"branches":'$THRESHOLD',"functions":'$THRESHOLD',"lines":'$THRESHOLD',"statements":'$THRESHOLD'}}'
289
- {{#ELSE}}
290
- npm test -- --passWithNoTests
291
- {{/IF_COVERAGE_ENABLED}}
292
- else
293
- echo "No test script configured, skipping"
294
- fi
295
-
296
- {{#IF_COVERAGE_ENABLED}}
297
- - name: Upload coverage to Codecov
298
- uses: codecov/codecov-action@v4
299
- with:
300
- file: ./frontend/coverage/coverage-final.json
301
- flags: nextjs
302
- fail_ci_if_error: false
303
- {{/IF_COVERAGE_ENABLED}}
304
-
305
- {{/IF_NEXTJS}}
306
- {{#IF_RUST}}
307
- test-rust:
308
- name: Rust {{RUST_VERSION}} Tests
309
- runs-on: ubuntu-latest
310
- needs: validate
311
-
312
- steps:
313
- - name: Checkout code
314
- uses: actions/checkout@v4
315
-
316
- - name: Set up Rust {{RUST_VERSION}}
317
- uses: actions-rs/toolchain@v1
318
- with:
319
- toolchain: {{RUST_VERSION}}
320
- override: true
321
- components: rustfmt, clippy
322
-
323
- - name: Set up Python for config
324
- uses: actions/setup-python@v5
325
- with:
326
- python-version: "3.12"
327
-
328
- - name: Install PyYAML
329
- run: pip install pyyaml
330
-
331
- - name: Load quality configuration
332
- id: quality
333
- run: |
334
- # Load from .project.yaml via project_config.py (primary source)
335
- if [ -f .project/config/project_config.py ]; then
336
- eval "$(python3 .project/config/project_config.py export rust)"
337
- echo "coverage_threshold=${RUST_COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
338
- # Fallback to legacy .quality.env
339
- elif [ -f .quality.env ]; then
340
- source .quality.env
341
- echo "coverage_threshold=${COVERAGE_THRESHOLD:-{{COVERAGE_THRESHOLD}}}" >> $GITHUB_OUTPUT
342
- else
343
- echo "coverage_threshold={{COVERAGE_THRESHOLD}}" >> $GITHUB_OUTPUT
344
- fi
345
-
346
- - name: Cache cargo registry
347
- uses: actions/cache@v3
348
- with:
349
- path: ~/.cargo/registry
350
- key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
351
-
352
- - name: Cache cargo index
353
- uses: actions/cache@v3
354
- with:
355
- path: ~/.cargo/git
356
- key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }}
357
-
358
- - name: Cache target directory
359
- uses: actions/cache@v3
360
- with:
361
- path: target
362
- key: ${{ runner.os }}-cargo-target-${{ hashFiles('**/Cargo.lock') }}
363
-
364
- - name: Run tests
365
- run: cargo test --verbose
366
-
367
- - name: Generate coverage
368
- run: |
369
- cargo install cargo-tarpaulin
370
- cargo tarpaulin --out Xml
371
- {{#IF_COVERAGE_ENABLED}}
372
- - name: Check coverage threshold
373
- run: |
374
- THRESHOLD=${{ steps.quality.outputs.coverage_threshold }}
375
-
376
- if [ "$THRESHOLD" = "0" ]; then
377
- echo "Coverage check skipped (threshold=0)"
378
- exit 0
379
- fi
380
-
381
- COVERAGE=$(grep -oP 'line-rate="\K[^"]+' cobertura.xml | head -1)
382
- COVERAGE_PCT=$(echo "$COVERAGE * 100" | bc)
383
- echo "Total coverage: ${COVERAGE_PCT}%"
384
- echo "Required threshold: ${THRESHOLD}%"
385
- if (( $(echo "$COVERAGE_PCT < $THRESHOLD" | bc -l) )); then
386
- echo "Coverage ${COVERAGE_PCT}% is below threshold ${THRESHOLD}%"
387
- exit 1
388
- fi
389
- echo "Coverage check passed!"
390
- {{/IF_COVERAGE_ENABLED}}
391
-
392
- - name: Upload coverage to Codecov
393
- uses: codecov/codecov-action@v3
394
- with:
395
- file: ./cobertura.xml
396
- flags: rust
397
- name: rust-{{RUST_VERSION}}
398
-
399
- {{/IF_RUST}}