@vyuhlabs/dxkit 1.2.1 → 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 +61 -0
- package/README.md +153 -69
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +55 -34
- package/dist/cli.js.map +1 -1
- package/dist/codebase-scanner.d.ts.map +1 -1
- package/dist/codebase-scanner.js +226 -89
- package/dist/codebase-scanner.js.map +1 -1
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +65 -19
- package/dist/detect.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +3 -1
- package/dist/files.js.map +1 -1
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +25 -10
- package/dist/generator.js.map +1 -1
- package/dist/lib.d.ts +11 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +18 -0
- package/dist/lib.js.map +1 -0
- 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/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +1 -1
- package/dist/prompts.js.map +1 -1
- package/dist/template-engine.d.ts.map +1 -1
- package/dist/template-engine.js.map +1 -1
- package/package.json +37 -5
- package/templates/.claude/skills/gcloud/SKILL.md +5 -0
- package/templates/.claude/skills/pulumi/SKILL.md +6 -0
- package/templates/.claude/skills/secrets/SKILL.md +7 -0
- package/templates/.claude/skills/test/SKILL.md.template +13 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,67 @@ 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
|
+
|
|
24
|
+
## [1.3.0] - 2026-04-09
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
- **Library entry point** (`src/lib.ts`). Exports `detect()`,
|
|
28
|
+
`processTemplate()`, `TemplateEngine`, and `DetectedStack` for
|
|
29
|
+
programmatic consumption by downstream packages like
|
|
30
|
+
`@vyuhlabs/create-devstack`. The npm `exports` and `main` fields now
|
|
31
|
+
point to `dist/lib.js` so `import { detect } from '@vyuhlabs/dxkit'`
|
|
32
|
+
works. The CLI binary (`vyuh-dxkit`) is unaffected.
|
|
33
|
+
- **Path-scoped auto-activation** (`paths:` frontmatter) on four shipped
|
|
34
|
+
skills, so they auto-load whenever Claude Code is touching a matching
|
|
35
|
+
file — even if the user's prompt doesn't name the tool:
|
|
36
|
+
- `gcloud` — `**/cloudbuild.{yaml,yml}`, `**/.gcloudignore`, `**/app.yaml`
|
|
37
|
+
- `pulumi` — `Pulumi.{yaml,yml}` and stack variants
|
|
38
|
+
- `secrets` — `**/.env*`, `**/.infisical.json`
|
|
39
|
+
- `test` — common test file patterns across TypeScript, JavaScript,
|
|
40
|
+
Go, Python (`**/*.test.*`, `**/*_test.go`, `**/test_*.py`,
|
|
41
|
+
`**/__tests__/**`, `**/tests/**`)
|
|
42
|
+
|
|
43
|
+
This is additive — descriptions still drive activation for everything
|
|
44
|
+
else, and the eight intent-driven skills (`build`, `deploy`, `doctor`,
|
|
45
|
+
`learned`, `quality`, `review`, `scaffold`, `session`) remain
|
|
46
|
+
description-only, since path-scoping would over- or under-trigger them.
|
|
47
|
+
- **Test suite** (Vitest). Unit tests for `detect()` against fixture project
|
|
48
|
+
trees, plus an integration test that runs the built CLI against a tmp dir
|
|
49
|
+
and asserts on the generated `.claude/` tree.
|
|
50
|
+
- **Lint + format toolchain.** ESLint flat config with `typescript-eslint`,
|
|
51
|
+
Prettier, and `eslint-config-prettier`. CI enforces both with
|
|
52
|
+
`--max-warnings 0`.
|
|
53
|
+
- **Git hooks** via husky + lint-staged. Pre-commit auto-fixes staged files
|
|
54
|
+
and runs `tsc --noEmit`. Pre-push runs affected tests
|
|
55
|
+
(`vitest run --changed @{u}`) with a graceful fallback to the full suite.
|
|
56
|
+
- **`.git-blame-ignore-revs`** so formatting commits don't pollute blame.
|
|
57
|
+
|
|
58
|
+
### Changed
|
|
59
|
+
- **GitHub Actions Node version bumped from 20 → 22** in both `ci.yml` and
|
|
60
|
+
`publish.yml`. Removes the Node 20 deprecation warning ahead of the
|
|
61
|
+
2026-06-02 runner cutoff. `.nvmrc` updated to match. The package's
|
|
62
|
+
`engines.node: ">=18"` constraint is unchanged — consumers on Node 18+
|
|
63
|
+
are unaffected.
|
|
64
|
+
- **One-time Prettier baseline** applied across the existing source. The
|
|
65
|
+
baseline commit is registered in `.git-blame-ignore-revs`.
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
- Removed three unused-variable / unused-import dead-code spots in
|
|
69
|
+
`src/generator.ts` and `src/codebase-scanner.ts` that ESLint flagged.
|
|
70
|
+
|
|
10
71
|
## [1.2.1] - 2026-04-06
|
|
11
72
|
|
|
12
73
|
### Fixed
|
package/README.md
CHANGED
|
@@ -55,13 +55,13 @@ CLAUDE.md # Main context file for Claude Code
|
|
|
55
55
|
|
|
56
56
|
## Supported Languages
|
|
57
57
|
|
|
58
|
-
| Language
|
|
59
|
-
|
|
60
|
-
| Node.js / TypeScript | `package.json`
|
|
61
|
-
| Python
|
|
62
|
-
| Go
|
|
63
|
-
| C#
|
|
64
|
-
| Rust
|
|
58
|
+
| Language | Detection | Linters | Test Runner |
|
|
59
|
+
| -------------------- | ------------------------------------ | --------------------- | --------------------------------------------- |
|
|
60
|
+
| Node.js / TypeScript | `package.json` | ESLint, Prettier, tsc | Auto-detected (Jest, Mocha, Vitest, Ava, Tap) |
|
|
61
|
+
| Python | `pyproject.toml`, `setup.py`, `*.py` | ruff, mypy | pytest |
|
|
62
|
+
| Go | `go.mod` | golangci-lint, go vet | go test |
|
|
63
|
+
| C# | `*.csproj`, `*.sln` | dotnet format, Roslyn | dotnet test |
|
|
64
|
+
| Rust | `Cargo.toml` | clippy, rustfmt | cargo test |
|
|
65
65
|
|
|
66
66
|
Multi-language repos fully supported — detects and generates rules/commands for all languages present.
|
|
67
67
|
|
|
@@ -87,66 +87,74 @@ Auto-detected and integrated when present:
|
|
|
87
87
|
## Commands (30)
|
|
88
88
|
|
|
89
89
|
### Development Workflow
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
|
93
|
-
| `/session-
|
|
90
|
+
|
|
91
|
+
| Command | Description |
|
|
92
|
+
| ----------------- | --------------------------------------------------- |
|
|
93
|
+
| `/session-start` | Start an AI-assisted dev session |
|
|
94
|
+
| `/session-end` | End session, create checkpoint, evolve skills |
|
|
94
95
|
| `/ask <question>` | Ask about the codebase (delegates to knowledge-bot) |
|
|
95
|
-
| `/learn`
|
|
96
|
+
| `/learn` | Capture a gotcha, convention, or thing to avoid |
|
|
96
97
|
|
|
97
98
|
### Quality & Testing
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
|
101
|
-
| `/
|
|
102
|
-
| `/
|
|
103
|
-
| `/
|
|
104
|
-
| `/
|
|
105
|
-
| `/
|
|
99
|
+
|
|
100
|
+
| Command | Description |
|
|
101
|
+
| ------------ | -------------------------------------------------------- |
|
|
102
|
+
| `/quality` | Run language-specific linters + AI review |
|
|
103
|
+
| `/test` | Run tests (auto-detected runner) |
|
|
104
|
+
| `/check` | Full pre-commit validation (quality + tests + AI review) |
|
|
105
|
+
| `/fix` | Auto-fix formatting and lint issues |
|
|
106
|
+
| `/build` | Build the project |
|
|
107
|
+
| `/test-gaps` | Find critical untested code paths |
|
|
106
108
|
|
|
107
109
|
### Analysis & Reports
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
|
110
|
+
|
|
111
|
+
| Command | Description | Output |
|
|
112
|
+
| ------------------ | ---------------------------------------------- | ------------------------------------- |
|
|
113
|
+
| `/health` | 6-dimension codebase health audit | `.ai/reports/health-audit-*.md` |
|
|
111
114
|
| `/vulnerabilities` | CWE-classified security scan (Snyk-comparable) | `.ai/reports/vulnerability-scan-*.md` |
|
|
112
|
-
| `/dev-report`
|
|
113
|
-
| `/docs audit`
|
|
114
|
-
| `/deps`
|
|
115
|
-
| `/dashboard`
|
|
116
|
-
| `/export-pdf`
|
|
115
|
+
| `/dev-report` | Developer activity + security attribution | `.ai/reports/developer-report-*.md` |
|
|
116
|
+
| `/docs audit` | Documentation gap analysis | `.ai/reports/docs-audit-*.md` |
|
|
117
|
+
| `/deps` | Dependency map + blast radius | `.ai/reports/dependency-map-*.md` |
|
|
118
|
+
| `/dashboard` | Generate HTML dashboard from all reports | `.ai/reports/dashboard.html` |
|
|
119
|
+
| `/export-pdf` | Convert markdown reports to PDF | `.ai/reports/*.pdf` |
|
|
117
120
|
|
|
118
121
|
### Planning & Execution — Fix Loop
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
|
122
|
-
| `/
|
|
122
|
+
|
|
123
|
+
| Command | Description | Output |
|
|
124
|
+
| ---------------------- | ----------------------------------------------------------- | -------------------------------------- |
|
|
125
|
+
| `/plan` | Analyze reports → propose KPIs → generate improvement plans | `.ai/plans/` |
|
|
126
|
+
| `/execute-plan <name>` | Execute a fix plan task by task with session checkpoints | `.ai/plans/progress/`, `.ai/sessions/` |
|
|
123
127
|
|
|
124
128
|
### Feature Development Loop
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
|
128
|
-
| `/
|
|
129
|
+
|
|
130
|
+
| Command | Description | Output |
|
|
131
|
+
| ------------------------ | -------------------------------------------------- | ----------------------------------------- |
|
|
132
|
+
| `/feature <description>` | Design new feature → implementation plan | `.ai/features/` |
|
|
133
|
+
| `/build-feature <slug>` | Build feature from plan with tests and conventions | `.ai/features/progress/`, `.ai/sessions/` |
|
|
129
134
|
|
|
130
135
|
### Exploration & Onboarding
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
|
134
|
-
| `/
|
|
135
|
-
| `/
|
|
136
|
+
|
|
137
|
+
| Command | Description |
|
|
138
|
+
| ------------------- | ----------------------------------------------- |
|
|
139
|
+
| `/onboarding` | Interactive onboarding buddy for new developers |
|
|
140
|
+
| `/explore-codebase` | Deep architecture exploration |
|
|
141
|
+
| `/help` | List all commands and agents |
|
|
136
142
|
|
|
137
143
|
### Setup & Hooks
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
|
141
|
-
| `/
|
|
142
|
-
| `/
|
|
143
|
-
| `/
|
|
144
|
-
| `/
|
|
145
|
-
| `/
|
|
144
|
+
|
|
145
|
+
| Command | Description |
|
|
146
|
+
| ---------------------- | ---------------------------------------------------------------------------------- |
|
|
147
|
+
| `/setup-hooks` | Configure git hooks (quality, test, vulnerability) — consistent with DXKit reports |
|
|
148
|
+
| `/stealth-mode` | Gitignore DXKit files + install hooks (DXKit local-only, hooks for all devs) |
|
|
149
|
+
| `/setup-pr-review` | Set up automated PR review GitHub Action |
|
|
150
|
+
| `/fix-issue <number>` | Investigate and fix a GitHub issue |
|
|
151
|
+
| `/doctor` | Diagnose environment issues |
|
|
152
|
+
| `/enable-agent <name>` | Activate a dormant agent |
|
|
146
153
|
|
|
147
154
|
## Agents
|
|
148
155
|
|
|
149
156
|
### Active by Default (4)
|
|
157
|
+
|
|
150
158
|
These agents auto-trigger when Claude detects a matching question:
|
|
151
159
|
|
|
152
160
|
- **knowledge-bot** — "How does auth work?" "Where are payments handled?"
|
|
@@ -155,6 +163,7 @@ These agents auto-trigger when Claude detects a matching question:
|
|
|
155
163
|
- **doc-writer** — "What needs documentation?" "Help me write docs"
|
|
156
164
|
|
|
157
165
|
### Dormant (16) — activate with `/enable-agent`
|
|
166
|
+
|
|
158
167
|
- **codebase-explorer** — Deep architecture analysis, generates documentation
|
|
159
168
|
- **code-reviewer** — PR review and security audit (read-only)
|
|
160
169
|
- **test-writer** — Writes tests for existing code
|
|
@@ -186,6 +195,7 @@ All analysis commands save timestamped reports to `.ai/reports/`:
|
|
|
186
195
|
```
|
|
187
196
|
|
|
188
197
|
Export options:
|
|
198
|
+
|
|
189
199
|
- **HTML dashboard**: `/dashboard` — beautiful dark-themed dashboard with sidebar navigation
|
|
190
200
|
- **PDF**: `/export-pdf all` — converts all reports to PDF
|
|
191
201
|
|
|
@@ -228,6 +238,7 @@ PR → CI workflow → full quality + tests + security (thorough, ~3m)
|
|
|
228
238
|
### Stealth Mode
|
|
229
239
|
|
|
230
240
|
`/stealth-mode` keeps DXKit local-only:
|
|
241
|
+
|
|
231
242
|
- `.claude/`, `.ai/`, `CLAUDE.md` gitignored — not committed
|
|
232
243
|
- `.githooks/` committed — all devs get the hooks
|
|
233
244
|
- One-time setup: `git config core.hooksPath .githooks`
|
|
@@ -236,17 +247,17 @@ PR → CI workflow → full quality + tests + security (thorough, ~3m)
|
|
|
236
247
|
|
|
237
248
|
The `/vulnerabilities` command runs a comprehensive security scan with CWE classification:
|
|
238
249
|
|
|
239
|
-
| Category
|
|
240
|
-
|
|
241
|
-
| Command Injection
|
|
242
|
-
| Decompression Bomb
|
|
243
|
-
| Uncontrolled Recursion
|
|
244
|
-
| Arbitrary File Upload
|
|
245
|
-
| Buffer Overflow
|
|
246
|
-
| Resource Exhaustion
|
|
247
|
-
| Hardcoded Secrets
|
|
248
|
-
| Prototype Pollution
|
|
249
|
-
| + 15 more CWE categories |
|
|
250
|
+
| Category | CWE | What It Checks |
|
|
251
|
+
| ------------------------ | -------- | -------------------------------------------------------- |
|
|
252
|
+
| Command Injection | CWE-78 | `exec()`, `child_process`, unsanitized input |
|
|
253
|
+
| Decompression Bomb | CWE-409 | zlib/tar/decompress without size limits |
|
|
254
|
+
| Uncontrolled Recursion | CWE-674 | JSON/XML/YAML parsers without depth limits |
|
|
255
|
+
| Arbitrary File Upload | CWE-434 | multer/formidable/busboy without validation |
|
|
256
|
+
| Buffer Overflow | CWE-120 | Native modules (binding.gyp, .node files) |
|
|
257
|
+
| Resource Exhaustion | CWE-770 | Missing rate limits, body size limits, WebSocket payload |
|
|
258
|
+
| Hardcoded Secrets | CWE-798 | Passwords, API keys, tokens in source |
|
|
259
|
+
| Prototype Pollution | CWE-1321 | Via dependency audit CWE extraction |
|
|
260
|
+
| + 15 more CWE categories | | Parsed from `npm audit --json` CWE fields |
|
|
250
261
|
|
|
251
262
|
Reports include a **Findings by CWE Category** table for direct comparison with Snyk/Sonar output.
|
|
252
263
|
|
|
@@ -258,6 +269,70 @@ Reports include a **Findings by CWE Category** table for direct comparison with
|
|
|
258
269
|
- **Multi-language** — Detects all languages including Python from `.py` files (no config file required)
|
|
259
270
|
- **Language breakdown** — Shows file count per language in codebase skill for accurate analysis
|
|
260
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
|
+
|
|
261
336
|
## CLI Reference
|
|
262
337
|
|
|
263
338
|
```bash
|
|
@@ -271,15 +346,21 @@ npx @vyuhlabs/dxkit doctor # Verify setup
|
|
|
271
346
|
|
|
272
347
|
### Init Options
|
|
273
348
|
|
|
274
|
-
| Flag
|
|
275
|
-
|
|
276
|
-
| `--detect`
|
|
277
|
-
| `--yes`
|
|
278
|
-
| `--dx-only`
|
|
279
|
-
| `--full`
|
|
280
|
-
| `--force`
|
|
281
|
-
| `--name <n>` | Override project name
|
|
282
|
-
| `--no-scan`
|
|
349
|
+
| Flag | Description |
|
|
350
|
+
| ------------ | ----------------------------------------- |
|
|
351
|
+
| `--detect` | Auto-detect stack, minimal prompts |
|
|
352
|
+
| `--yes` | Accept all defaults |
|
|
353
|
+
| `--dx-only` | Just `.claude/` + `CLAUDE.md` (default) |
|
|
354
|
+
| `--full` | Everything: DX + quality + hooks + CI |
|
|
355
|
+
| `--force` | Overwrite existing files (except evolved) |
|
|
356
|
+
| `--name <n>` | Override project name |
|
|
357
|
+
| `--no-scan` | Skip codebase analysis |
|
|
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
|
|
283
364
|
|
|
284
365
|
## Example: Node.js/TypeScript Project
|
|
285
366
|
|
|
@@ -289,6 +370,7 @@ npx @vyuhlabs/dxkit init --detect --yes
|
|
|
289
370
|
```
|
|
290
371
|
|
|
291
372
|
Output:
|
|
373
|
+
|
|
292
374
|
```
|
|
293
375
|
✓ Languages: node
|
|
294
376
|
✓ Framework: loopback
|
|
@@ -297,6 +379,7 @@ Output:
|
|
|
297
379
|
```
|
|
298
380
|
|
|
299
381
|
Then in Claude Code:
|
|
382
|
+
|
|
300
383
|
```
|
|
301
384
|
/help # See everything
|
|
302
385
|
/ask How does the auth middleware work? # Codebase Q&A
|
|
@@ -315,6 +398,7 @@ npx @vyuhlabs/dxkit init --detect --yes
|
|
|
315
398
|
```
|
|
316
399
|
|
|
317
400
|
Generates:
|
|
401
|
+
|
|
318
402
|
- Quality commands with `npx eslint .` + `ruff check .` + `golangci-lint run`
|
|
319
403
|
- Test commands with `npm test` + `pytest` + `go test`
|
|
320
404
|
- Path-scoped rules for `.ts`, `.py`, and `.go` files
|
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,45 +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).filter(([, v]) => v).map(([k]) => k);
|
|
109
|
-
const tools = Object.entries(detected.tools).filter(([, v]) => v).map(([k]) => k);
|
|
110
|
-
if (langs.length === 0) {
|
|
111
|
-
logger.warn('No languages detected. Generating with minimal config.');
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
logger.success(`Languages: ${langs.join(', ')}`);
|
|
115
|
-
}
|
|
116
|
-
if (tools.length)
|
|
117
|
-
logger.success(`Tools: ${tools.join(', ')}`);
|
|
118
|
-
if (detected.framework)
|
|
119
|
-
logger.success(`Framework: ${detected.framework}`);
|
|
120
|
-
if (detected.testRunner)
|
|
121
|
-
logger.success(`Tests: ${detected.testRunner.framework} (${detected.testRunner.command})`);
|
|
122
|
-
console.log('');
|
|
123
|
-
// Resolve config
|
|
124
|
-
const mode = values.full ? 'full' : 'dx-only';
|
|
125
106
|
let config;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
+
}
|
|
133
131
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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,
|
|
138
159
|
name: values.name,
|
|
139
|
-
}
|
|
160
|
+
};
|
|
161
|
+
const result = await (0, prompts_1.promptForConfig)(detected, promptOpts);
|
|
140
162
|
config = result.config;
|
|
163
|
+
finalMode = values.full ? 'full' : values['dx-only'] ? 'dx-only' : result.mode;
|
|
141
164
|
}
|
|
142
|
-
// Generate
|
|
143
|
-
const finalMode = values.full ? 'full' : (values['dx-only'] ? 'dx-only' : mode);
|
|
144
165
|
const result = await (0, generator_1.generate)(cwd, config, finalMode, !!values.force, !!values['no-scan']);
|
|
145
166
|
// Summary
|
|
146
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codebase-scanner.d.ts","sourceRoot":"","sources":["../src/codebase-scanner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codebase-scanner.d.ts","sourceRoot":"","sources":["../src/codebase-scanner.ts"],"names":[],"mappings":"AAoDA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,YAAY,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzE,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,WAAW,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AA6eD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAmD1D;AAID,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAgGtE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAmDxE"}
|