@qasshq/qass 0.1.2 → 0.1.4
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/README.md +65 -11
- package/dist/cli.js +309 -8
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +8 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/doctor.d.ts +12 -0
- package/dist/core/doctor.d.ts.map +1 -0
- package/dist/core/doctor.js +72 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/license.d.ts.map +1 -1
- package/dist/core/license.js +11 -0
- package/dist/core/license.js.map +1 -1
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +13 -3
- package/dist/core/runner.js.map +1 -1
- package/dist/core/telemetry.d.ts +44 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +131 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/integrations/cursor-rule.d.ts +1 -1
- package/dist/integrations/cursor-rule.d.ts.map +1 -1
- package/dist/integrations/cursor-rule.js +6 -6
- package/dist/integrations/cursor-rule.js.map +1 -1
- package/dist/integrations/editor-prompts.d.ts +3 -0
- package/dist/integrations/editor-prompts.d.ts.map +1 -0
- package/dist/integrations/editor-prompts.js +21 -0
- package/dist/integrations/editor-prompts.js.map +1 -0
- package/dist/integrations/editor-setup.d.ts +8 -0
- package/dist/integrations/editor-setup.d.ts.map +1 -0
- package/dist/integrations/editor-setup.js +62 -0
- package/dist/integrations/editor-setup.js.map +1 -0
- package/dist/integrations/mcp-server.d.ts +1 -1
- package/dist/integrations/mcp-server.d.ts.map +1 -1
- package/dist/integrations/mcp-server.js +4 -4
- package/dist/integrations/mcp-server.js.map +1 -1
- package/dist/runners/e2e/playwright-runner.d.ts.map +1 -1
- package/dist/runners/e2e/playwright-runner.js +96 -3
- package/dist/runners/e2e/playwright-runner.js.map +1 -1
- package/dist/server/dashboard-server.d.ts +7 -0
- package/dist/server/dashboard-server.d.ts.map +1 -0
- package/dist/server/dashboard-server.js +212 -0
- package/dist/server/dashboard-server.js.map +1 -0
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Your AI writes code. QASS catches the security holes, broken flows, and silent f
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install -g qass
|
|
10
|
+
npm install -g @qasshq/qass
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
Or run without installing:
|
|
@@ -20,13 +20,17 @@ npx @qasshq/qass scan --project .
|
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
# Initialize config in your project
|
|
23
|
-
qass init --project .
|
|
23
|
+
npx @qasshq/qass init --project .
|
|
24
|
+
npx @qasshq/qass setup --project .
|
|
24
25
|
|
|
25
26
|
# Run a full security scan
|
|
26
|
-
qass scan --project . --full
|
|
27
|
+
npx @qasshq/qass scan --project . --full
|
|
28
|
+
|
|
29
|
+
# Run full QA (security + UI smoke + auto guest flow + API/unit where configured)
|
|
30
|
+
npx @qasshq/qass test --project . --diff HEAD
|
|
27
31
|
|
|
28
|
-
#
|
|
29
|
-
qass
|
|
32
|
+
# Open local visualization dashboard (optional)
|
|
33
|
+
npx @qasshq/qass ui --project .
|
|
30
34
|
```
|
|
31
35
|
|
|
32
36
|
## What It Catches
|
|
@@ -35,6 +39,7 @@ qass test --project . --diff HEAD
|
|
|
35
39
|
|
|
36
40
|
- **7 static security rules** — missing auth middleware, SQL/NoSQL injection, hardcoded secrets, XSS vectors, CORS misconfiguration, rate limiting gaps, dependency CVEs
|
|
37
41
|
- **Basic smoke crawl** — page load verification, console error detection
|
|
42
|
+
- **Auto guest journey** — follows internal links without any test account setup
|
|
38
43
|
- **Endpoint discovery** — auto-detects Express routes
|
|
39
44
|
- **Git diff analysis** — only scans what changed
|
|
40
45
|
- **AI-readable reports** — structured for your AI editor to read and fix
|
|
@@ -43,19 +48,26 @@ qass test --project . --diff HEAD
|
|
|
43
48
|
|
|
44
49
|
- **Full smoke crawl** — clicks every button, fills every form, catches silent failures
|
|
45
50
|
- **Visual regression** — pixel-diff screenshots against baselines
|
|
46
|
-
- **Flow testing** — multi-step user journeys defined in YAML
|
|
51
|
+
- **Flow testing** — multi-step user journeys defined in YAML (optional for deeper auth flows)
|
|
47
52
|
- **API testing** — auth, plan gating, response validation with Supabase support
|
|
48
53
|
- **Dynamic security probing** — tests live endpoints for error disclosure, missing headers
|
|
49
54
|
|
|
50
55
|
## How It Works With AI Editors
|
|
51
56
|
|
|
52
|
-
`qass init` automatically generates
|
|
57
|
+
`qass init` automatically generates AI editor integration files for the detected editor context:
|
|
53
58
|
|
|
54
59
|
```bash
|
|
55
|
-
# Initialize QASS + auto-generate
|
|
60
|
+
# Initialize QASS + auto-generate detected editor integration
|
|
56
61
|
npx @qasshq/qass init --project .
|
|
62
|
+
```
|
|
57
63
|
|
|
58
|
-
|
|
64
|
+
For a complete editor integration (config + rule + MCP), run:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npx @qasshq/qass setup --project .
|
|
68
|
+
|
|
69
|
+
# Optional: force a specific editor target
|
|
70
|
+
npx @qasshq/qass setup --project . --editor cursor
|
|
59
71
|
```
|
|
60
72
|
|
|
61
73
|
The rule instructs your AI to:
|
|
@@ -66,7 +78,7 @@ The rule instructs your AI to:
|
|
|
66
78
|
4. Re-run until clean
|
|
67
79
|
5. Only then tell you it's done
|
|
68
80
|
|
|
69
|
-
This works with
|
|
81
|
+
This works with AI editors such as Cursor, Windsurf, and Copilot-compatible environments.
|
|
70
82
|
|
|
71
83
|
## Configuration
|
|
72
84
|
|
|
@@ -110,10 +122,16 @@ Run `npx @qasshq/qass init --project .` to generate a default config and auto-cr
|
|
|
110
122
|
| Command | Description |
|
|
111
123
|
|---------|-------------|
|
|
112
124
|
| `qass init` | Initialize `.qass/config.yaml` in your project |
|
|
125
|
+
| `qass setup` | One-command setup: config + auto-detected AI rule + MCP config |
|
|
126
|
+
| `qass prompt` | Print copy-paste AI editor setup prompt (`--editor`) |
|
|
113
127
|
| `qass scan` | Run security scan only |
|
|
114
128
|
| `qass test` | Run full test suite (security + API + E2E + unit) |
|
|
129
|
+
| `qass doctor` | Validate setup and print copy-paste fixes |
|
|
115
130
|
| `qass discover` | List discovered endpoints, pages, and accounts |
|
|
116
|
-
| `qass cursor-rule` | Generate AI editor
|
|
131
|
+
| `qass cursor-rule` | Generate AI editor integration files (supports `--editor`) |
|
|
132
|
+
| `qass mcp-config` | Generate MCP config (supports `--editor`) |
|
|
133
|
+
| `qass serve` | Start local dashboard server |
|
|
134
|
+
| `qass ui` | Start local dashboard and open browser |
|
|
117
135
|
| `qass usage` | Show local usage stats for this project |
|
|
118
136
|
| `qass telemetry status` | Show telemetry status |
|
|
119
137
|
| `qass telemetry enable` | Enable anonymous telemetry events |
|
|
@@ -141,6 +159,7 @@ Each finding includes:
|
|
|
141
159
|
QASS supports two monitoring modes:
|
|
142
160
|
|
|
143
161
|
- **Local project dashboard**: run `qass usage` to see runs, success/fail counts, and latest findings for the current project.
|
|
162
|
+
- **Live local dashboard**: run `qass ui` to view runs, findings, screenshots, usage, and license status in a browser.
|
|
144
163
|
- **Remote telemetry dashboard**: set `QASS_TELEMETRY_ENDPOINT` (and optional `QASS_TELEMETRY_WRITE_KEY`) to send anonymous usage events to your own analytics backend (PostHog/Mixpanel proxy/etc).
|
|
145
164
|
|
|
146
165
|
Telemetry can be controlled with:
|
|
@@ -149,6 +168,16 @@ Telemetry can be controlled with:
|
|
|
149
168
|
- `qass telemetry enable`
|
|
150
169
|
- `qass telemetry disable`
|
|
151
170
|
|
|
171
|
+
## Copy-Paste AI Setup Prompts
|
|
172
|
+
|
|
173
|
+
Generate an editor-specific prompt you can paste directly into your AI editor:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npx @qasshq/qass prompt --editor cursor --project .
|
|
177
|
+
npx @qasshq/qass prompt --editor windsurf --project .
|
|
178
|
+
npx @qasshq/qass prompt --editor copilot --project .
|
|
179
|
+
```
|
|
180
|
+
|
|
152
181
|
## Requirements
|
|
153
182
|
|
|
154
183
|
- Node.js >= 20.11.0
|
|
@@ -156,6 +185,31 @@ Telemetry can be controlled with:
|
|
|
156
185
|
- Playwright (optional, for E2E testing): `npm i -D playwright`
|
|
157
186
|
- Vitest (optional, for unit test generation): `npm i -D vitest`
|
|
158
187
|
|
|
188
|
+
## Founder Access (Use Full Features Without Paying Yourself)
|
|
189
|
+
|
|
190
|
+
Use founder keys via Lemon Squeezy (recommended production-safe path):
|
|
191
|
+
|
|
192
|
+
1. Create an internal Team key in Lemon Squeezy for your own account.
|
|
193
|
+
2. Activate it locally:
|
|
194
|
+
```bash
|
|
195
|
+
qass activate YOUR_FOUNDER_KEY
|
|
196
|
+
qass status
|
|
197
|
+
```
|
|
198
|
+
3. Use all features as normal, with real licensing behavior preserved for customers.
|
|
199
|
+
|
|
200
|
+
Avoid hardcoded bypass flags in production builds.
|
|
201
|
+
|
|
202
|
+
## Release Checklist
|
|
203
|
+
|
|
204
|
+
Before publishing:
|
|
205
|
+
|
|
206
|
+
1. `npm run build`
|
|
207
|
+
2. `npm test`
|
|
208
|
+
3. `npx tsx src/cli.ts setup --project .`
|
|
209
|
+
4. `npx tsx src/cli.ts doctor --project .`
|
|
210
|
+
5. `npm pack`
|
|
211
|
+
6. Publish patch version
|
|
212
|
+
|
|
159
213
|
## License
|
|
160
214
|
|
|
161
215
|
Proprietary. See [LICENSE](./LICENSE) for details.
|
package/dist/cli.js
CHANGED
|
@@ -1,27 +1,143 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
+
import { access } from "node:fs/promises";
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
import { spawn } from "node:child_process";
|
|
4
7
|
import { loadConfig, initConfig } from "./core/config.js";
|
|
8
|
+
import { getTelemetryStatus, readLocalUsage, recordLocalUsage, setTelemetryEnabled, trackEvent, } from "./core/telemetry.js";
|
|
5
9
|
const program = new Command();
|
|
6
10
|
program
|
|
7
11
|
.name("qass")
|
|
8
12
|
.description("QA + Security Scanner for vibe-coded apps. Ship fast. Ship safe.")
|
|
9
|
-
.version("0.
|
|
13
|
+
.version(process.env.npm_package_version ?? "0.0.0");
|
|
10
14
|
program
|
|
11
15
|
.command("init")
|
|
12
16
|
.description("Initialize QASS config in a project")
|
|
13
17
|
.option("-p, --project <path>", "Project root path", ".")
|
|
14
18
|
.action(async (opts) => {
|
|
15
19
|
try {
|
|
20
|
+
const configAlreadyExists = await fileExists(resolve(opts.project, ".qass", "config.yaml"));
|
|
16
21
|
const configPath = await initConfig(opts.project);
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
if (configAlreadyExists) {
|
|
23
|
+
console.log(chalk.dim(` Config already exists at ${configPath}`));
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(chalk.green("✓") + ` Config created at ${configPath}`);
|
|
27
|
+
console.log(chalk.dim(" Edit .qass/config.yaml to configure your project."));
|
|
28
|
+
}
|
|
29
|
+
const { detectEditors, setupEditorIntegrations } = await import("./integrations/editor-setup.js");
|
|
30
|
+
const editors = await detectEditors(opts.project);
|
|
31
|
+
const setup = await setupEditorIntegrations(opts.project, editors);
|
|
32
|
+
console.log(chalk.green("✓") +
|
|
33
|
+
` AI editor integration created for: ${setup.editors.join(", ")}`);
|
|
34
|
+
await recordLocalUsage(opts.project, "init", "success");
|
|
35
|
+
await trackEvent("command_success", { command: "init", editors: setup.editors });
|
|
19
36
|
}
|
|
20
37
|
catch (e) {
|
|
38
|
+
await recordLocalUsage(opts.project, "init", "failed");
|
|
39
|
+
await trackEvent("command_failed", {
|
|
40
|
+
command: "init",
|
|
41
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
42
|
+
});
|
|
21
43
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Failed to initialize");
|
|
22
44
|
process.exit(1);
|
|
23
45
|
}
|
|
24
46
|
});
|
|
47
|
+
program
|
|
48
|
+
.command("setup")
|
|
49
|
+
.description("One-command setup: config + AI rule + MCP config")
|
|
50
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
51
|
+
.option("--editor <target>", "Editor target: auto|cursor|windsurf|copilot|all", "auto")
|
|
52
|
+
.action(async (opts) => {
|
|
53
|
+
try {
|
|
54
|
+
const configAlreadyExists = await fileExists(resolve(opts.project, ".qass", "config.yaml"));
|
|
55
|
+
const configPath = await initConfig(opts.project);
|
|
56
|
+
if (configAlreadyExists) {
|
|
57
|
+
console.log(chalk.dim(` Config already exists at ${configPath}`));
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log(chalk.green("✓") + ` Config created at ${configPath}`);
|
|
61
|
+
}
|
|
62
|
+
const { detectEditors, setupEditorIntegrations } = await import("./integrations/editor-setup.js");
|
|
63
|
+
const editors = opts.editor === "auto"
|
|
64
|
+
? await detectEditors(opts.project)
|
|
65
|
+
: parseEditorTargets(opts.editor);
|
|
66
|
+
const setup = await setupEditorIntegrations(opts.project, editors);
|
|
67
|
+
console.log(chalk.green("✓") +
|
|
68
|
+
` AI editor integration created for: ${setup.editors.join(", ")}`);
|
|
69
|
+
const { runDoctor } = await import("./core/doctor.js");
|
|
70
|
+
const doctor = await runDoctor(opts.project);
|
|
71
|
+
if (doctor.ok) {
|
|
72
|
+
console.log(chalk.green("\n✓ AI IDE integration active"));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.log(chalk.yellow("\n! Setup completed with warnings. Run: qass doctor"));
|
|
76
|
+
}
|
|
77
|
+
await recordLocalUsage(opts.project, "setup", "success");
|
|
78
|
+
await trackEvent("command_success", { command: "setup", editors: setup.editors });
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
await recordLocalUsage(opts.project, "setup", "failed");
|
|
82
|
+
await trackEvent("command_failed", {
|
|
83
|
+
command: "setup",
|
|
84
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
85
|
+
});
|
|
86
|
+
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Setup failed");
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
program
|
|
91
|
+
.command("prompt")
|
|
92
|
+
.description("Print copy-paste setup prompt for an AI editor")
|
|
93
|
+
.option("--editor <target>", "Editor target: cursor|windsurf|copilot", "cursor")
|
|
94
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
95
|
+
.action(async (opts) => {
|
|
96
|
+
try {
|
|
97
|
+
if (!["cursor", "windsurf", "copilot"].includes(opts.editor)) {
|
|
98
|
+
throw new Error("Invalid --editor value. Use cursor|windsurf|copilot");
|
|
99
|
+
}
|
|
100
|
+
const { getEditorSetupPrompt } = await import("./integrations/editor-prompts.js");
|
|
101
|
+
const prompt = getEditorSetupPrompt(opts.editor, opts.project);
|
|
102
|
+
console.log("");
|
|
103
|
+
console.log(chalk.bold(`QASS Setup Prompt (${opts.editor})`));
|
|
104
|
+
console.log(chalk.dim("Copy and paste this into your AI editor:"));
|
|
105
|
+
console.log(chalk.dim("────────────────────────────────────────"));
|
|
106
|
+
console.log(prompt);
|
|
107
|
+
console.log(chalk.dim("────────────────────────────────────────"));
|
|
108
|
+
console.log("");
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Failed to generate prompt");
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
program
|
|
116
|
+
.command("doctor")
|
|
117
|
+
.description("Verify setup and print copy-paste fixes")
|
|
118
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
119
|
+
.action(async (opts) => {
|
|
120
|
+
const { runDoctor } = await import("./core/doctor.js");
|
|
121
|
+
const result = await runDoctor(opts.project);
|
|
122
|
+
console.log("");
|
|
123
|
+
console.log(chalk.bold(" QASS Doctor"));
|
|
124
|
+
console.log(chalk.dim(" ───────────"));
|
|
125
|
+
for (const check of result.checks) {
|
|
126
|
+
console.log(chalk.green(` ✓ ${check}`));
|
|
127
|
+
}
|
|
128
|
+
if (result.issues.length === 0) {
|
|
129
|
+
console.log(chalk.green("\n All checks passed."));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.log("");
|
|
133
|
+
for (const issue of result.issues) {
|
|
134
|
+
const marker = issue.level === "error" ? chalk.red("✗") : chalk.yellow("!");
|
|
135
|
+
console.log(` ${marker} ${issue.title}`);
|
|
136
|
+
console.log(chalk.dim(` ${issue.fix}`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
console.log("");
|
|
140
|
+
});
|
|
25
141
|
program
|
|
26
142
|
.command("test")
|
|
27
143
|
.description("Run tests based on git diff")
|
|
@@ -34,9 +150,24 @@ program
|
|
|
34
150
|
console.log(chalk.blue("QASS") +
|
|
35
151
|
chalk.dim(` testing ${config.project.name}...`));
|
|
36
152
|
const { runTests } = await import("./core/runner.js");
|
|
37
|
-
await runTests(config, opts.project, opts.diff, opts.type);
|
|
153
|
+
const report = await runTests(config, opts.project, opts.diff, opts.type);
|
|
154
|
+
const high = report.securityFindings.filter((f) => f.severity === "HIGH").length;
|
|
155
|
+
const medium = report.securityFindings.filter((f) => f.severity === "MEDIUM").length;
|
|
156
|
+
const low = report.securityFindings.filter((f) => f.severity === "LOW").length;
|
|
157
|
+
await recordLocalUsage(opts.project, "test", "success", { high, medium, low });
|
|
158
|
+
await trackEvent("command_success", {
|
|
159
|
+
command: "test",
|
|
160
|
+
findings_high: high,
|
|
161
|
+
findings_medium: medium,
|
|
162
|
+
findings_low: low,
|
|
163
|
+
});
|
|
38
164
|
}
|
|
39
165
|
catch (e) {
|
|
166
|
+
await recordLocalUsage(opts.project, "test", "failed");
|
|
167
|
+
await trackEvent("command_failed", {
|
|
168
|
+
command: "test",
|
|
169
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
170
|
+
});
|
|
40
171
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Test run failed");
|
|
41
172
|
process.exit(1);
|
|
42
173
|
}
|
|
@@ -53,9 +184,24 @@ program
|
|
|
53
184
|
console.log(chalk.blue("QASS") +
|
|
54
185
|
chalk.dim(` scanning ${config.project.name}...`));
|
|
55
186
|
const { runTests } = await import("./core/runner.js");
|
|
56
|
-
await runTests(config, opts.project, opts.diff, "security", opts.full);
|
|
187
|
+
const report = await runTests(config, opts.project, opts.diff, "security", opts.full);
|
|
188
|
+
const high = report.securityFindings.filter((f) => f.severity === "HIGH").length;
|
|
189
|
+
const medium = report.securityFindings.filter((f) => f.severity === "MEDIUM").length;
|
|
190
|
+
const low = report.securityFindings.filter((f) => f.severity === "LOW").length;
|
|
191
|
+
await recordLocalUsage(opts.project, "scan", "success", { high, medium, low });
|
|
192
|
+
await trackEvent("command_success", {
|
|
193
|
+
command: "scan",
|
|
194
|
+
findings_high: high,
|
|
195
|
+
findings_medium: medium,
|
|
196
|
+
findings_low: low,
|
|
197
|
+
});
|
|
57
198
|
}
|
|
58
199
|
catch (e) {
|
|
200
|
+
await recordLocalUsage(opts.project, "scan", "failed");
|
|
201
|
+
await trackEvent("command_failed", {
|
|
202
|
+
command: "scan",
|
|
203
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
204
|
+
});
|
|
59
205
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Scan failed");
|
|
60
206
|
process.exit(1);
|
|
61
207
|
}
|
|
@@ -69,8 +215,15 @@ program
|
|
|
69
215
|
const config = await loadConfig(opts.project);
|
|
70
216
|
const { discover } = await import("./core/discover.js");
|
|
71
217
|
await discover(config, opts.project);
|
|
218
|
+
await recordLocalUsage(opts.project, "discover", "success");
|
|
219
|
+
await trackEvent("command_success", { command: "discover" });
|
|
72
220
|
}
|
|
73
221
|
catch (e) {
|
|
222
|
+
await recordLocalUsage(opts.project, "discover", "failed");
|
|
223
|
+
await trackEvent("command_failed", {
|
|
224
|
+
command: "discover",
|
|
225
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
226
|
+
});
|
|
74
227
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Discovery failed");
|
|
75
228
|
process.exit(1);
|
|
76
229
|
}
|
|
@@ -79,17 +232,137 @@ program
|
|
|
79
232
|
.command("cursor-rule")
|
|
80
233
|
.description("Generate Cursor Rule for this project")
|
|
81
234
|
.option("-p, --project <path>", "Project root path", ".")
|
|
235
|
+
.option("--editor <target>", "Editor target: auto|cursor|windsurf|copilot|all", "auto")
|
|
82
236
|
.action(async (opts) => {
|
|
83
237
|
try {
|
|
84
|
-
const {
|
|
85
|
-
const
|
|
86
|
-
|
|
238
|
+
const { detectEditors, setupEditorIntegrations } = await import("./integrations/editor-setup.js");
|
|
239
|
+
const editors = opts.editor === "auto"
|
|
240
|
+
? await detectEditors(opts.project)
|
|
241
|
+
: parseEditorTargets(opts.editor);
|
|
242
|
+
const setup = await setupEditorIntegrations(opts.project, editors);
|
|
243
|
+
console.log(chalk.green("✓") +
|
|
244
|
+
` AI editor integration created for: ${setup.editors.join(", ")}`);
|
|
245
|
+
await recordLocalUsage(opts.project, "cursor-rule", "success");
|
|
246
|
+
await trackEvent("command_success", {
|
|
247
|
+
command: "cursor-rule",
|
|
248
|
+
editors: setup.editors,
|
|
249
|
+
});
|
|
87
250
|
}
|
|
88
251
|
catch (e) {
|
|
252
|
+
await recordLocalUsage(opts.project, "cursor-rule", "failed");
|
|
253
|
+
await trackEvent("command_failed", {
|
|
254
|
+
command: "cursor-rule",
|
|
255
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
256
|
+
});
|
|
89
257
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Failed to generate rule");
|
|
90
258
|
process.exit(1);
|
|
91
259
|
}
|
|
92
260
|
});
|
|
261
|
+
program
|
|
262
|
+
.command("mcp-config")
|
|
263
|
+
.description("Generate MCP config for AI editors")
|
|
264
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
265
|
+
.option("--editor <target>", "Editor target: auto|cursor|windsurf|copilot|all", "auto")
|
|
266
|
+
.action(async (opts) => {
|
|
267
|
+
try {
|
|
268
|
+
const { detectEditors, setupEditorIntegrations } = await import("./integrations/editor-setup.js");
|
|
269
|
+
const editors = opts.editor === "auto"
|
|
270
|
+
? await detectEditors(opts.project)
|
|
271
|
+
: parseEditorTargets(opts.editor);
|
|
272
|
+
const setup = await setupEditorIntegrations(opts.project, editors);
|
|
273
|
+
console.log(chalk.green("✓") +
|
|
274
|
+
` AI editor integration created for: ${setup.editors.join(", ")}`);
|
|
275
|
+
}
|
|
276
|
+
catch (e) {
|
|
277
|
+
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Failed to generate MCP config");
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
program
|
|
282
|
+
.command("serve")
|
|
283
|
+
.description("Start local QASS dashboard API server")
|
|
284
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
285
|
+
.option("--port <port>", "Dashboard port", "3799")
|
|
286
|
+
.action(async (opts) => {
|
|
287
|
+
const { startDashboardServer } = await import("./server/dashboard-server.js");
|
|
288
|
+
const server = await startDashboardServer({
|
|
289
|
+
projectPath: opts.project,
|
|
290
|
+
port: Number(opts.port),
|
|
291
|
+
});
|
|
292
|
+
console.log(chalk.green(`QASS dashboard server running on http://127.0.0.1:${opts.port}`));
|
|
293
|
+
process.on("SIGINT", () => server.close());
|
|
294
|
+
await new Promise(() => { });
|
|
295
|
+
});
|
|
296
|
+
program
|
|
297
|
+
.command("ui")
|
|
298
|
+
.description("Launch local QASS dashboard in browser")
|
|
299
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
300
|
+
.option("--port <port>", "Dashboard port", "3799")
|
|
301
|
+
.option("--no-open", "Do not open browser automatically")
|
|
302
|
+
.action(async (opts) => {
|
|
303
|
+
const port = Number(opts.port);
|
|
304
|
+
const url = `http://127.0.0.1:${port}`;
|
|
305
|
+
const { startDashboardServer } = await import("./server/dashboard-server.js");
|
|
306
|
+
const server = await startDashboardServer({ projectPath: opts.project, port });
|
|
307
|
+
console.log(chalk.green(`QASS dashboard running at ${url}`));
|
|
308
|
+
if (opts.open !== false)
|
|
309
|
+
openBrowser(url);
|
|
310
|
+
process.on("SIGINT", () => server.close());
|
|
311
|
+
await new Promise(() => { });
|
|
312
|
+
});
|
|
313
|
+
program
|
|
314
|
+
.command("mcp-serve")
|
|
315
|
+
.description("Start QASS MCP stdio server (experimental)")
|
|
316
|
+
.action(async () => {
|
|
317
|
+
const { MCP_SERVER_DEFINITION } = await import("./integrations/mcp-server.js");
|
|
318
|
+
process.stdout.write(JSON.stringify({ status: "ready", server: MCP_SERVER_DEFINITION }) + "\n");
|
|
319
|
+
process.stdin.resume();
|
|
320
|
+
});
|
|
321
|
+
program
|
|
322
|
+
.command("telemetry")
|
|
323
|
+
.description("Manage telemetry settings")
|
|
324
|
+
.addCommand(new Command("enable").description("Enable anonymous telemetry").action(async () => {
|
|
325
|
+
await setTelemetryEnabled(true);
|
|
326
|
+
console.log(chalk.green("✓ Telemetry enabled"));
|
|
327
|
+
}))
|
|
328
|
+
.addCommand(new Command("disable").description("Disable anonymous telemetry").action(async () => {
|
|
329
|
+
await setTelemetryEnabled(false);
|
|
330
|
+
console.log(chalk.yellow("✓ Telemetry disabled"));
|
|
331
|
+
}))
|
|
332
|
+
.addCommand(new Command("status").description("Show telemetry status").action(async () => {
|
|
333
|
+
const status = await getTelemetryStatus();
|
|
334
|
+
const maskedId = status.anonymousId.slice(0, 8) + "••••••••" + status.anonymousId.slice(-4);
|
|
335
|
+
console.log("");
|
|
336
|
+
console.log(chalk.bold(" QASS Telemetry"));
|
|
337
|
+
console.log(chalk.dim(" ──────────────"));
|
|
338
|
+
console.log(` Enabled: ${status.enabled ? chalk.green("yes") : chalk.red("no")}`);
|
|
339
|
+
console.log(` Anonymous: ${chalk.dim(maskedId)}`);
|
|
340
|
+
console.log(` Endpoint: ${status.endpointConfigured ? chalk.green("configured") : chalk.dim("not set")}`);
|
|
341
|
+
if (!status.endpointConfigured) {
|
|
342
|
+
console.log(chalk.dim(" Set QASS_TELEMETRY_ENDPOINT to send dashboard events."));
|
|
343
|
+
}
|
|
344
|
+
console.log("");
|
|
345
|
+
}));
|
|
346
|
+
program
|
|
347
|
+
.command("usage")
|
|
348
|
+
.description("Show local usage stats for this project")
|
|
349
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
350
|
+
.action(async (opts) => {
|
|
351
|
+
const usage = await readLocalUsage(opts.project);
|
|
352
|
+
if (!usage) {
|
|
353
|
+
console.log(chalk.dim(" No usage data yet. Run qass scan/test first."));
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
console.log("");
|
|
357
|
+
console.log(chalk.bold(" QASS Usage (local project)"));
|
|
358
|
+
console.log(chalk.dim(" ──────────────────────────"));
|
|
359
|
+
console.log(` Runs: ${usage.totals.runs}`);
|
|
360
|
+
console.log(` Success: ${chalk.green(String(usage.totals.success))}`);
|
|
361
|
+
console.log(` Failed: ${usage.totals.failed > 0 ? chalk.red(String(usage.totals.failed)) : 0}`);
|
|
362
|
+
console.log(` Findings: ${chalk.red(`${usage.findings.high} HIGH`)}, ${chalk.yellow(`${usage.findings.medium} MEDIUM`)}, ${usage.findings.low} LOW`);
|
|
363
|
+
console.log(` Last run: ${usage.lastSeenAt}`);
|
|
364
|
+
console.log("");
|
|
365
|
+
});
|
|
93
366
|
program
|
|
94
367
|
.command("activate <key>")
|
|
95
368
|
.description("Activate a Pro or Team license key")
|
|
@@ -114,4 +387,32 @@ program
|
|
|
114
387
|
await showStatus();
|
|
115
388
|
});
|
|
116
389
|
program.parse();
|
|
390
|
+
async function fileExists(path) {
|
|
391
|
+
try {
|
|
392
|
+
await access(path);
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
function openBrowser(url) {
|
|
400
|
+
const platform = process.platform;
|
|
401
|
+
if (platform === "win32") {
|
|
402
|
+
spawn("cmd", ["/c", "start", "", url], { detached: true, stdio: "ignore" }).unref();
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (platform === "darwin") {
|
|
406
|
+
spawn("open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
spawn("xdg-open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
410
|
+
}
|
|
411
|
+
function parseEditorTargets(raw) {
|
|
412
|
+
if (raw === "all")
|
|
413
|
+
return ["cursor", "windsurf", "copilot"];
|
|
414
|
+
if (raw === "cursor" || raw === "windsurf" || raw === "copilot")
|
|
415
|
+
return [raw];
|
|
416
|
+
throw new Error("Invalid --editor value. Use auto|cursor|windsurf|copilot|all");
|
|
417
|
+
}
|
|
117
418
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,kEAAkE,CAAC;KAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,sBAAsB,UAAU,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CACjE,CAAC;IACJ,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EACd,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CACxD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,CAAC;KACxD,MAAM,CACL,mBAAmB,EACnB,iDAAiD,EACjD,KAAK,CACN;KACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;YAChB,KAAK,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAClD,CAAC;QAEF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EACd,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CACnD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,CAAC;KACxD,MAAM,CAAC,QAAQ,EAAE,uCAAuC,EAAE,KAAK,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;YAChB,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CACnD,CAAC;QAEF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EACd,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAC/C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EACd,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CACpD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CACzC,+BAA+B,CAChC,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2BAA2B,QAAQ,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EACd,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAC3D,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;IAC5B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC9D,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAChE,MAAM,iBAAiB,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzD,MAAM,UAAU,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBzE;AAiBD,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBzE;AAiBD,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCrE"}
|
package/dist/core/config.js
CHANGED
|
@@ -35,12 +35,11 @@ export async function initConfig(projectPath) {
|
|
|
35
35
|
const targetFile = join(targetDir, CONFIG_FILE);
|
|
36
36
|
try {
|
|
37
37
|
await access(targetFile);
|
|
38
|
-
|
|
38
|
+
await ensureProjectArtifacts(targetDir);
|
|
39
|
+
return targetFile;
|
|
39
40
|
}
|
|
40
|
-
catch
|
|
41
|
-
|
|
42
|
-
throw e;
|
|
43
|
-
}
|
|
41
|
+
catch {
|
|
42
|
+
// Continue with initialization when config does not exist.
|
|
44
43
|
}
|
|
45
44
|
await mkdir(targetDir, { recursive: true });
|
|
46
45
|
const templatePath = resolve(import.meta.dirname, "..", "templates", "config.example.yaml");
|
|
@@ -53,9 +52,12 @@ export async function initConfig(projectPath) {
|
|
|
53
52
|
const { writeFile } = await import("node:fs/promises");
|
|
54
53
|
await writeFile(targetFile, defaultConfig, "utf-8");
|
|
55
54
|
}
|
|
55
|
+
await ensureProjectArtifacts(targetDir);
|
|
56
|
+
return targetFile;
|
|
57
|
+
}
|
|
58
|
+
async function ensureProjectArtifacts(targetDir) {
|
|
56
59
|
await mkdir(join(targetDir, "results"), { recursive: true });
|
|
57
60
|
await mkdir(join(targetDir, "baselines"), { recursive: true });
|
|
58
|
-
return targetFile;
|
|
59
61
|
}
|
|
60
62
|
function generateDefaultConfig(projectPath) {
|
|
61
63
|
const name = projectPath.split(/[\\/]/).pop() ?? "my-project";
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,UAAU,GAAG,OAAO,CAAC;AAC3B,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,2BAA2B,UAAU,8BAA8B,WAAW,kBAAkB,CACjG,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAe,CAAC;IAEpD,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface DoctorIssue {
|
|
2
|
+
level: "error" | "warn";
|
|
3
|
+
title: string;
|
|
4
|
+
fix: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DoctorResult {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
checks: string[];
|
|
9
|
+
issues: DoctorIssue[];
|
|
10
|
+
}
|
|
11
|
+
export declare function runDoctor(projectPath: string): Promise<DoctorResult>;
|
|
12
|
+
//# sourceMappingURL=doctor.d.ts.map
|