@vyuhlabs/dxkit 1.3.0 → 1.4.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.
- package/CHANGELOG.md +14 -0
- package/README.md +70 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +55 -38
- package/dist/cli.js.map +1 -1
- package/dist/lib.d.ts +2 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +4 -1
- package/dist/lib.js.map +1 -1
- package/dist/project-yaml.d.ts +13 -0
- package/dist/project-yaml.d.ts.map +1 -0
- package/dist/project-yaml.js +183 -0
- package/dist/project-yaml.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.4.0] - 2026-04-09
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **`.project.yaml` config source.** When `.project.yaml` exists in the
|
|
14
|
+
target directory (typically written by `@vyuhlabs/create-devstack`),
|
|
15
|
+
`dxkit init` reads it and uses it as the config source — skipping
|
|
16
|
+
both `detect()` and interactive prompts. This enables greenfield
|
|
17
|
+
projects where no language files exist yet. If the file is malformed
|
|
18
|
+
or missing `project.name`, dxkit falls back to detection + prompts.
|
|
19
|
+
- **Library exports**: `hasProjectYaml()` and `readProjectYaml()` from
|
|
20
|
+
the `@vyuhlabs/dxkit` package entry point.
|
|
21
|
+
- **README**: `.project.yaml` documentation, library API section, and
|
|
22
|
+
config source priority.
|
|
23
|
+
|
|
10
24
|
## [1.3.0] - 2026-04-09
|
|
11
25
|
|
|
12
26
|
### Added
|
package/README.md
CHANGED
|
@@ -269,6 +269,70 @@ Reports include a **Findings by CWE Category** table for direct comparison with
|
|
|
269
269
|
- **Multi-language** — Detects all languages including Python from `.py` files (no config file required)
|
|
270
270
|
- **Language breakdown** — Shows file count per language in codebase skill for accurate analysis
|
|
271
271
|
|
|
272
|
+
## Using with create-devstack
|
|
273
|
+
|
|
274
|
+
[`@vyuhlabs/create-devstack`](https://github.com/vyuh-labs/create-devstack) scaffolds dev environments (devcontainers, `.project.yaml`) and delegates to dxkit for everything else.
|
|
275
|
+
|
|
276
|
+
When `create-devstack` writes a `.project.yaml` before calling `dxkit init`, dxkit reads it as the config source — skipping detection and prompts. This enables greenfield projects where no language files exist yet:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# create-devstack writes .project.yaml + .devcontainer/, then calls dxkit
|
|
280
|
+
npm create @vyuhlabs/devstack my-project
|
|
281
|
+
|
|
282
|
+
# Or manually: write .project.yaml first, then run dxkit
|
|
283
|
+
npx @vyuhlabs/dxkit init --full
|
|
284
|
+
# → dxkit reads .project.yaml, generates Makefile, configs, CI, .claude/
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### .project.yaml schema
|
|
288
|
+
|
|
289
|
+
```yaml
|
|
290
|
+
project:
|
|
291
|
+
name: my-project
|
|
292
|
+
description: A web API
|
|
293
|
+
languages:
|
|
294
|
+
python:
|
|
295
|
+
enabled: true
|
|
296
|
+
version: '3.12'
|
|
297
|
+
quality:
|
|
298
|
+
coverage: 80
|
|
299
|
+
lint: true
|
|
300
|
+
go:
|
|
301
|
+
enabled: true
|
|
302
|
+
version: '1.24.0'
|
|
303
|
+
infrastructure:
|
|
304
|
+
postgres:
|
|
305
|
+
enabled: true
|
|
306
|
+
version: '16'
|
|
307
|
+
tools:
|
|
308
|
+
claude_code: true
|
|
309
|
+
precommit: true
|
|
310
|
+
docker: true
|
|
311
|
+
gcloud: false
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
When `.project.yaml` is present, dxkit uses it to determine which languages, tools, and quality settings to generate. When absent, dxkit falls back to filesystem detection + interactive prompts as before.
|
|
315
|
+
|
|
316
|
+
## Library API
|
|
317
|
+
|
|
318
|
+
dxkit exports functions for programmatic use by other packages:
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
import { detect, processTemplate, TemplateEngine } from '@vyuhlabs/dxkit';
|
|
322
|
+
import { hasProjectYaml, readProjectYaml } from '@vyuhlabs/dxkit';
|
|
323
|
+
|
|
324
|
+
// Detect stack from filesystem
|
|
325
|
+
const stack = detect('/path/to/project');
|
|
326
|
+
|
|
327
|
+
// Read .project.yaml as ResolvedConfig
|
|
328
|
+
if (hasProjectYaml('/path/to/project')) {
|
|
329
|
+
const config = readProjectYaml('/path/to/project');
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Process templates
|
|
333
|
+
const output = processTemplate('Hello {{PROJECT_NAME}}', vars, conditions);
|
|
334
|
+
```
|
|
335
|
+
|
|
272
336
|
## CLI Reference
|
|
273
337
|
|
|
274
338
|
```bash
|
|
@@ -292,6 +356,12 @@ npx @vyuhlabs/dxkit doctor # Verify setup
|
|
|
292
356
|
| `--name <n>` | Override project name |
|
|
293
357
|
| `--no-scan` | Skip codebase analysis |
|
|
294
358
|
|
|
359
|
+
### Config Source Priority
|
|
360
|
+
|
|
361
|
+
1. `.project.yaml` (if present) — used as-is, no prompts
|
|
362
|
+
2. `--detect` — auto-detect from filesystem, minimal prompts
|
|
363
|
+
3. Interactive — prompt for all settings
|
|
364
|
+
|
|
295
365
|
## Example: Node.js/TypeScript Project
|
|
296
366
|
|
|
297
367
|
```bash
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAyCA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsIvD"}
|
package/dist/cli.js
CHANGED
|
@@ -38,6 +38,7 @@ const node_util_1 = require("node:util");
|
|
|
38
38
|
const detect_1 = require("./detect");
|
|
39
39
|
const generator_1 = require("./generator");
|
|
40
40
|
const prompts_1 = require("./prompts");
|
|
41
|
+
const project_yaml_1 = require("./project-yaml");
|
|
41
42
|
const update_1 = require("./update");
|
|
42
43
|
const doctor_1 = require("./doctor");
|
|
43
44
|
const constants_1 = require("./constants");
|
|
@@ -102,49 +103,65 @@ async function run(argv) {
|
|
|
102
103
|
switch (command) {
|
|
103
104
|
case 'init': {
|
|
104
105
|
logger.header('vyuh-dxkit init');
|
|
105
|
-
// Detect stack
|
|
106
|
-
logger.info('Detecting stack...');
|
|
107
|
-
const detected = (0, detect_1.detect)(cwd);
|
|
108
|
-
const langs = Object.entries(detected.languages)
|
|
109
|
-
.filter(([, v]) => v)
|
|
110
|
-
.map(([k]) => k);
|
|
111
|
-
const tools = Object.entries(detected.tools)
|
|
112
|
-
.filter(([, v]) => v)
|
|
113
|
-
.map(([k]) => k);
|
|
114
|
-
if (langs.length === 0) {
|
|
115
|
-
logger.warn('No languages detected. Generating with minimal config.');
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
logger.success(`Languages: ${langs.join(', ')}`);
|
|
119
|
-
}
|
|
120
|
-
if (tools.length)
|
|
121
|
-
logger.success(`Tools: ${tools.join(', ')}`);
|
|
122
|
-
if (detected.framework)
|
|
123
|
-
logger.success(`Framework: ${detected.framework}`);
|
|
124
|
-
if (detected.testRunner)
|
|
125
|
-
logger.success(`Tests: ${detected.testRunner.framework} (${detected.testRunner.command})`);
|
|
126
|
-
console.log('');
|
|
127
|
-
// Resolve config
|
|
128
|
-
const mode = values.full ? 'full' : 'dx-only';
|
|
129
106
|
let config;
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
107
|
+
let finalMode = values.full ? 'full' : 'dx-only';
|
|
108
|
+
// If .project.yaml exists (written by create-devstack), try using it as config source
|
|
109
|
+
if ((0, project_yaml_1.hasProjectYaml)(cwd)) {
|
|
110
|
+
const yamlConfig = (0, project_yaml_1.readProjectYaml)(cwd);
|
|
111
|
+
if (yamlConfig) {
|
|
112
|
+
logger.info('Found .project.yaml — using as config source.');
|
|
113
|
+
config = yamlConfig;
|
|
114
|
+
const langs = Object.entries(config.languages)
|
|
115
|
+
.filter(([, v]) => v)
|
|
116
|
+
.map(([k]) => k);
|
|
117
|
+
const tools = Object.entries(config.tools)
|
|
118
|
+
.filter(([, v]) => v)
|
|
119
|
+
.map(([k]) => k);
|
|
120
|
+
if (langs.length)
|
|
121
|
+
logger.success(`Languages: ${langs.join(', ')}`);
|
|
122
|
+
if (tools.length)
|
|
123
|
+
logger.success(`Tools: ${tools.join(', ')}`);
|
|
124
|
+
console.log('');
|
|
125
|
+
// .project.yaml implies full mode (create-devstack handles the wizard)
|
|
126
|
+
finalMode = values['dx-only'] ? 'dx-only' : 'full';
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger.warn('Found .project.yaml but it is malformed — falling back to detection.');
|
|
130
|
+
}
|
|
137
131
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
132
|
+
if (!config) {
|
|
133
|
+
// No .project.yaml — detect stack and prompt as before
|
|
134
|
+
logger.info('Detecting stack...');
|
|
135
|
+
const detected = (0, detect_1.detect)(cwd);
|
|
136
|
+
const langs = Object.entries(detected.languages)
|
|
137
|
+
.filter(([, v]) => v)
|
|
138
|
+
.map(([k]) => k);
|
|
139
|
+
const tools = Object.entries(detected.tools)
|
|
140
|
+
.filter(([, v]) => v)
|
|
141
|
+
.map(([k]) => k);
|
|
142
|
+
if (langs.length === 0) {
|
|
143
|
+
logger.warn('No languages detected. Generating with minimal config.');
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
logger.success(`Languages: ${langs.join(', ')}`);
|
|
147
|
+
}
|
|
148
|
+
if (tools.length)
|
|
149
|
+
logger.success(`Tools: ${tools.join(', ')}`);
|
|
150
|
+
if (detected.framework)
|
|
151
|
+
logger.success(`Framework: ${detected.framework}`);
|
|
152
|
+
if (detected.testRunner)
|
|
153
|
+
logger.success(`Tests: ${detected.testRunner.framework} (${detected.testRunner.command})`);
|
|
154
|
+
console.log('');
|
|
155
|
+
// Resolve config via prompts
|
|
156
|
+
const promptOpts = {
|
|
157
|
+
yes: !!(values.yes || values.detect),
|
|
158
|
+
detect: !!values.detect,
|
|
142
159
|
name: values.name,
|
|
143
|
-
}
|
|
160
|
+
};
|
|
161
|
+
const result = await (0, prompts_1.promptForConfig)(detected, promptOpts);
|
|
144
162
|
config = result.config;
|
|
163
|
+
finalMode = values.full ? 'full' : values['dx-only'] ? 'dx-only' : result.mode;
|
|
145
164
|
}
|
|
146
|
-
// Generate
|
|
147
|
-
const finalMode = values.full ? 'full' : values['dx-only'] ? 'dx-only' : mode;
|
|
148
165
|
const result = await (0, generator_1.generate)(cwd, config, finalMode, !!values.force, !!values['no-scan']);
|
|
149
166
|
// Summary
|
|
150
167
|
console.log('');
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.d.ts
CHANGED
|
@@ -6,5 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { detect } from './detect';
|
|
8
8
|
export { processTemplate, TemplateEngine } from './template-engine';
|
|
9
|
-
export
|
|
9
|
+
export { hasProjectYaml, readProjectYaml } from './project-yaml';
|
|
10
|
+
export type { DetectedStack, ResolvedConfig } from './types';
|
|
10
11
|
//# sourceMappingURL=lib.d.ts.map
|
package/dist/lib.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/lib.js
CHANGED
|
@@ -6,10 +6,13 @@
|
|
|
6
6
|
* (e.g. @vyuhlabs/create-devstack). The CLI entry point is src/index.ts.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.TemplateEngine = exports.processTemplate = exports.detect = void 0;
|
|
9
|
+
exports.readProjectYaml = exports.hasProjectYaml = exports.TemplateEngine = exports.processTemplate = exports.detect = void 0;
|
|
10
10
|
var detect_1 = require("./detect");
|
|
11
11
|
Object.defineProperty(exports, "detect", { enumerable: true, get: function () { return detect_1.detect; } });
|
|
12
12
|
var template_engine_1 = require("./template-engine");
|
|
13
13
|
Object.defineProperty(exports, "processTemplate", { enumerable: true, get: function () { return template_engine_1.processTemplate; } });
|
|
14
14
|
Object.defineProperty(exports, "TemplateEngine", { enumerable: true, get: function () { return template_engine_1.TemplateEngine; } });
|
|
15
|
+
var project_yaml_1 = require("./project-yaml");
|
|
16
|
+
Object.defineProperty(exports, "hasProjectYaml", { enumerable: true, get: function () { return project_yaml_1.hasProjectYaml; } });
|
|
17
|
+
Object.defineProperty(exports, "readProjectYaml", { enumerable: true, get: function () { return project_yaml_1.readProjectYaml; } });
|
|
15
18
|
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,qDAAoE;AAA3D,kHAAA,eAAe,OAAA;AAAE,iHAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,qDAAoE;AAA3D,kHAAA,eAAe,OAAA;AAAE,iHAAA,cAAc,OAAA;AACxC,+CAAiE;AAAxD,8GAAA,cAAc,OAAA;AAAE,+GAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ResolvedConfig } from './types';
|
|
2
|
+
/** Check if .project.yaml exists in the given directory. */
|
|
3
|
+
export declare function hasProjectYaml(cwd: string): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Read .project.yaml and build a ResolvedConfig from it.
|
|
6
|
+
* This is the primary config source when create-devstack has already
|
|
7
|
+
* written the file — dxkit skips detect() and prompts in this case.
|
|
8
|
+
*
|
|
9
|
+
* Returns null if the file is malformed or missing required fields
|
|
10
|
+
* (project.name). The caller should fall back to detect() + prompts.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readProjectYaml(cwd: string): ResolvedConfig | null;
|
|
13
|
+
//# sourceMappingURL=project-yaml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-yaml.d.ts","sourceRoot":"","sources":["../src/project-yaml.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAiB,MAAM,SAAS,CAAC;AA2CxD,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA6ElE"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.hasProjectYaml = hasProjectYaml;
|
|
37
|
+
exports.readProjectYaml = readProjectYaml;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const constants_1 = require("./constants");
|
|
41
|
+
/** Check if .project.yaml exists in the given directory. */
|
|
42
|
+
function hasProjectYaml(cwd) {
|
|
43
|
+
return fs.existsSync(path.join(cwd, '.project.yaml'));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Read .project.yaml and build a ResolvedConfig from it.
|
|
47
|
+
* This is the primary config source when create-devstack has already
|
|
48
|
+
* written the file — dxkit skips detect() and prompts in this case.
|
|
49
|
+
*
|
|
50
|
+
* Returns null if the file is malformed or missing required fields
|
|
51
|
+
* (project.name). The caller should fall back to detect() + prompts.
|
|
52
|
+
*/
|
|
53
|
+
function readProjectYaml(cwd) {
|
|
54
|
+
const filePath = path.join(cwd, '.project.yaml');
|
|
55
|
+
let raw;
|
|
56
|
+
try {
|
|
57
|
+
raw = fs.readFileSync(filePath, 'utf-8');
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
let yaml;
|
|
63
|
+
try {
|
|
64
|
+
yaml = parseSimpleYaml(raw);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
// project.name is required
|
|
70
|
+
if (!yaml.project?.name) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const langs = yaml.languages ?? {};
|
|
74
|
+
const infra = yaml.infrastructure ?? {};
|
|
75
|
+
const tools = yaml.tools ?? {};
|
|
76
|
+
const langEnabled = (name) => langs[name]?.enabled ?? false;
|
|
77
|
+
const infraEnabled = (name) => infra[name]?.enabled ?? false;
|
|
78
|
+
// Find coverage from first enabled language with quality settings
|
|
79
|
+
let coverage = constants_1.DEFAULT_COVERAGE;
|
|
80
|
+
for (const lang of Object.values(langs)) {
|
|
81
|
+
if (lang?.enabled && lang.quality?.coverage) {
|
|
82
|
+
coverage = String(lang.quality.coverage);
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const detected = {
|
|
87
|
+
languages: {
|
|
88
|
+
python: langEnabled('python'),
|
|
89
|
+
go: langEnabled('go'),
|
|
90
|
+
node: langEnabled('node'),
|
|
91
|
+
nextjs: langEnabled('nextjs'),
|
|
92
|
+
rust: langEnabled('rust'),
|
|
93
|
+
csharp: langEnabled('csharp'),
|
|
94
|
+
},
|
|
95
|
+
infrastructure: {
|
|
96
|
+
docker: tools.docker ?? true,
|
|
97
|
+
postgres: infraEnabled('postgres'),
|
|
98
|
+
redis: infraEnabled('redis'),
|
|
99
|
+
},
|
|
100
|
+
tools: {
|
|
101
|
+
gcloud: tools.gcloud ?? false,
|
|
102
|
+
pulumi: tools.pulumi ?? false,
|
|
103
|
+
infisical: tools.infisical ?? false,
|
|
104
|
+
ghCli: tools.github_cli ?? true,
|
|
105
|
+
},
|
|
106
|
+
projectName: yaml.project.name,
|
|
107
|
+
projectDescription: yaml.project.description ?? '',
|
|
108
|
+
versions: {
|
|
109
|
+
python: langs.python?.version ?? constants_1.DEFAULT_VERSIONS.python,
|
|
110
|
+
go: langs.go?.version ?? constants_1.DEFAULT_VERSIONS.go,
|
|
111
|
+
node: langs.node?.version ?? constants_1.DEFAULT_VERSIONS.node,
|
|
112
|
+
rust: langs.rust?.version ?? constants_1.DEFAULT_VERSIONS.rust,
|
|
113
|
+
csharp: langs.csharp?.version ?? constants_1.DEFAULT_VERSIONS.csharp,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
...detected,
|
|
118
|
+
coverageThreshold: coverage,
|
|
119
|
+
precommit: tools.precommit ?? true,
|
|
120
|
+
qualityChecks: true,
|
|
121
|
+
aiSessions: true,
|
|
122
|
+
aiPrompts: true,
|
|
123
|
+
claudeCode: tools.claude_code ?? true,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Minimal YAML parser for .project.yaml.
|
|
128
|
+
* Handles the specific structure we expect — nested objects with scalar values.
|
|
129
|
+
* Avoids adding a `yaml` npm dependency to dxkit (which has zero runtime deps).
|
|
130
|
+
*/
|
|
131
|
+
function parseSimpleYaml(raw) {
|
|
132
|
+
const lines = raw.split('\n');
|
|
133
|
+
const result = {};
|
|
134
|
+
const stack = [
|
|
135
|
+
{ indent: -1, obj: result },
|
|
136
|
+
];
|
|
137
|
+
for (const line of lines) {
|
|
138
|
+
// Skip empty lines and comments
|
|
139
|
+
if (!line.trim() || line.trim().startsWith('#'))
|
|
140
|
+
continue;
|
|
141
|
+
const indent = line.search(/\S/);
|
|
142
|
+
const trimmed = line.trim();
|
|
143
|
+
// Pop stack to find parent
|
|
144
|
+
while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {
|
|
145
|
+
stack.pop();
|
|
146
|
+
}
|
|
147
|
+
const parent = stack[stack.length - 1].obj;
|
|
148
|
+
const colonIdx = trimmed.indexOf(':');
|
|
149
|
+
if (colonIdx === -1)
|
|
150
|
+
continue;
|
|
151
|
+
const key = trimmed.slice(0, colonIdx).trim();
|
|
152
|
+
const valueStr = trimmed.slice(colonIdx + 1).trim();
|
|
153
|
+
if (valueStr === '' || valueStr === '{}') {
|
|
154
|
+
// Nested object (or empty object)
|
|
155
|
+
const child = {};
|
|
156
|
+
parent[key] = child;
|
|
157
|
+
if (valueStr !== '{}') {
|
|
158
|
+
stack.push({ indent, obj: child });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// Scalar value
|
|
163
|
+
parent[key] = parseScalar(valueStr);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
function parseScalar(value) {
|
|
169
|
+
// Remove surrounding quotes
|
|
170
|
+
if ((value.startsWith("'") && value.endsWith("'")) ||
|
|
171
|
+
(value.startsWith('"') && value.endsWith('"'))) {
|
|
172
|
+
return value.slice(1, -1);
|
|
173
|
+
}
|
|
174
|
+
if (value === 'true')
|
|
175
|
+
return true;
|
|
176
|
+
if (value === 'false')
|
|
177
|
+
return false;
|
|
178
|
+
const num = Number(value);
|
|
179
|
+
if (!isNaN(num) && value !== '')
|
|
180
|
+
return num;
|
|
181
|
+
return value;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=project-yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-yaml.js","sourceRoot":"","sources":["../src/project-yaml.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,wCAEC;AAUD,0CA6EC;AAvID,uCAAyB;AACzB,2CAA6B;AAE7B,2CAAiE;AA0CjE,4DAA4D;AAC5D,SAAgB,cAAc,CAAC,GAAW;IACxC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,eAAe,CAAC,GAAW;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACjD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAiB,CAAC;IACtB,IAAI,CAAC;QACH,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAE/B,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,KAAK,CAAC;IAC7E,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,KAAK,CAAC;IAE9E,kEAAkE;IAClE,IAAI,QAAQ,GAAG,4BAAgB,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YAC5C,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAkB;QAC9B,SAAS,EAAE;YACT,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;YAC7B,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC;YACrB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC;YACzB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;YAC7B,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC;YACzB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;SAC9B;QACD,cAAc,EAAE;YACd,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC5B,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC;YAClC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;SAC7B;QACD,KAAK,EAAE;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;YAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;YAC7B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK;YACnC,KAAK,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;SAChC;QACD,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;QAC9B,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE;QAClD,QAAQ,EAAE;YACR,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,4BAAgB,CAAC,MAAM;YACxD,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,IAAI,4BAAgB,CAAC,EAAE;YAC5C,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,4BAAgB,CAAC,IAAI;YAClD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,4BAAgB,CAAC,IAAI;YAClD,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,4BAAgB,CAAC,MAAM;SACzD;KACF,CAAC;IAEF,OAAO;QACL,GAAG,QAAQ;QACX,iBAAiB,EAAE,QAAQ;QAC3B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAClC,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;KACtC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9B,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAA4D;QACrE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE;KAC5B,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,gCAAgC;QAChC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE1D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,2BAA2B;QAC3B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;YACpE,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAE3C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,SAAS;QAE9B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpD,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACzC,kCAAkC;YAClC,MAAM,KAAK,GAA4B,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,eAAe;YACf,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,MAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,4BAA4B;IAC5B,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC"}
|