@qasshq/qass 0.1.2 → 0.1.3
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 +48 -6
- package/dist/cli.js +264 -5
- 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/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.js +4 -4
- package/dist/integrations/mcp-server.js +2 -2
- 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,7 +48,7 @@ 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
|
|
|
@@ -58,6 +63,12 @@ npx @qasshq/qass init --project .
|
|
|
58
63
|
# Creates .cursor/rules/qass.mdc
|
|
59
64
|
```
|
|
60
65
|
|
|
66
|
+
For a complete editor integration (config + rule + MCP), run:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx @qasshq/qass setup --project .
|
|
70
|
+
```
|
|
71
|
+
|
|
61
72
|
The rule instructs your AI to:
|
|
62
73
|
|
|
63
74
|
1. Run `npx @qasshq/qass test --project . --diff HEAD` after making changes
|
|
@@ -110,10 +121,15 @@ Run `npx @qasshq/qass init --project .` to generate a default config and auto-cr
|
|
|
110
121
|
| Command | Description |
|
|
111
122
|
|---------|-------------|
|
|
112
123
|
| `qass init` | Initialize `.qass/config.yaml` in your project |
|
|
124
|
+
| `qass setup` | One-command setup: config + AI rule + MCP config |
|
|
113
125
|
| `qass scan` | Run security scan only |
|
|
114
126
|
| `qass test` | Run full test suite (security + API + E2E + unit) |
|
|
127
|
+
| `qass doctor` | Validate setup and print copy-paste fixes |
|
|
115
128
|
| `qass discover` | List discovered endpoints, pages, and accounts |
|
|
116
129
|
| `qass cursor-rule` | Generate AI editor rule file |
|
|
130
|
+
| `qass mcp-config` | Generate MCP config |
|
|
131
|
+
| `qass serve` | Start local dashboard server |
|
|
132
|
+
| `qass ui` | Start local dashboard and open browser |
|
|
117
133
|
| `qass usage` | Show local usage stats for this project |
|
|
118
134
|
| `qass telemetry status` | Show telemetry status |
|
|
119
135
|
| `qass telemetry enable` | Enable anonymous telemetry events |
|
|
@@ -141,6 +157,7 @@ Each finding includes:
|
|
|
141
157
|
QASS supports two monitoring modes:
|
|
142
158
|
|
|
143
159
|
- **Local project dashboard**: run `qass usage` to see runs, success/fail counts, and latest findings for the current project.
|
|
160
|
+
- **Live local dashboard**: run `qass ui` to view runs, findings, screenshots, usage, and license status in a browser.
|
|
144
161
|
- **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
162
|
|
|
146
163
|
Telemetry can be controlled with:
|
|
@@ -156,6 +173,31 @@ Telemetry can be controlled with:
|
|
|
156
173
|
- Playwright (optional, for E2E testing): `npm i -D playwright`
|
|
157
174
|
- Vitest (optional, for unit test generation): `npm i -D vitest`
|
|
158
175
|
|
|
176
|
+
## Founder Access (Use Full Features Without Paying Yourself)
|
|
177
|
+
|
|
178
|
+
Use founder keys via Lemon Squeezy (recommended production-safe path):
|
|
179
|
+
|
|
180
|
+
1. Create an internal Team key in Lemon Squeezy for your own account.
|
|
181
|
+
2. Activate it locally:
|
|
182
|
+
```bash
|
|
183
|
+
qass activate YOUR_FOUNDER_KEY
|
|
184
|
+
qass status
|
|
185
|
+
```
|
|
186
|
+
3. Use all features as normal, with real licensing behavior preserved for customers.
|
|
187
|
+
|
|
188
|
+
Avoid hardcoded bypass flags in production builds.
|
|
189
|
+
|
|
190
|
+
## Release Checklist
|
|
191
|
+
|
|
192
|
+
Before publishing:
|
|
193
|
+
|
|
194
|
+
1. `npm run build`
|
|
195
|
+
2. `npm test`
|
|
196
|
+
3. `npx tsx src/cli.ts setup --project .`
|
|
197
|
+
4. `npx tsx src/cli.ts doctor --project .`
|
|
198
|
+
5. `npm pack`
|
|
199
|
+
6. Publish patch version
|
|
200
|
+
|
|
159
201
|
## License
|
|
160
202
|
|
|
161
203
|
Proprietary. See [LICENSE](./LICENSE) for details.
|
package/dist/cli.js
CHANGED
|
@@ -1,27 +1,121 @@
|
|
|
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
|
+
try {
|
|
30
|
+
const { generateCursorRule } = await import("./integrations/cursor-rule.js");
|
|
31
|
+
const rulePath = await generateCursorRule(opts.project);
|
|
32
|
+
console.log(chalk.green("✓") + ` Cursor rule created at ${rulePath}`);
|
|
33
|
+
await recordLocalUsage(opts.project, "init", "success");
|
|
34
|
+
await trackEvent("command_success", { command: "init" });
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
await recordLocalUsage(opts.project, "init", "failed");
|
|
38
|
+
await trackEvent("command_failed", {
|
|
39
|
+
command: "init",
|
|
40
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
41
|
+
});
|
|
42
|
+
console.log(chalk.yellow("!"), e instanceof Error
|
|
43
|
+
? `Could not create Cursor rule automatically: ${e.message}`
|
|
44
|
+
: "Could not create Cursor rule automatically");
|
|
45
|
+
}
|
|
19
46
|
}
|
|
20
47
|
catch (e) {
|
|
21
48
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Failed to initialize");
|
|
22
49
|
process.exit(1);
|
|
23
50
|
}
|
|
24
51
|
});
|
|
52
|
+
program
|
|
53
|
+
.command("setup")
|
|
54
|
+
.description("One-command setup: config + AI rule + MCP config")
|
|
55
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
56
|
+
.action(async (opts) => {
|
|
57
|
+
try {
|
|
58
|
+
const configAlreadyExists = await fileExists(resolve(opts.project, ".qass", "config.yaml"));
|
|
59
|
+
const configPath = await initConfig(opts.project);
|
|
60
|
+
if (configAlreadyExists) {
|
|
61
|
+
console.log(chalk.dim(` Config already exists at ${configPath}`));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(chalk.green("✓") + ` Config created at ${configPath}`);
|
|
65
|
+
}
|
|
66
|
+
const { generateCursorRule } = await import("./integrations/cursor-rule.js");
|
|
67
|
+
const { generateMcpConfig } = await import("./integrations/mcp-server.js");
|
|
68
|
+
const rulePath = await generateCursorRule(opts.project);
|
|
69
|
+
const mcpPath = await generateMcpConfig(opts.project);
|
|
70
|
+
console.log(chalk.green("✓") + ` Cursor rule created at ${rulePath}`);
|
|
71
|
+
console.log(chalk.green("✓") + ` MCP config created at ${mcpPath}`);
|
|
72
|
+
const { runDoctor } = await import("./core/doctor.js");
|
|
73
|
+
const doctor = await runDoctor(opts.project);
|
|
74
|
+
if (doctor.ok) {
|
|
75
|
+
console.log(chalk.green("\n✓ AI IDE integration active"));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.log(chalk.yellow("\n! Setup completed with warnings. Run: qass doctor"));
|
|
79
|
+
}
|
|
80
|
+
await recordLocalUsage(opts.project, "setup", "success");
|
|
81
|
+
await trackEvent("command_success", { command: "setup" });
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
await recordLocalUsage(opts.project, "setup", "failed");
|
|
85
|
+
await trackEvent("command_failed", {
|
|
86
|
+
command: "setup",
|
|
87
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
88
|
+
});
|
|
89
|
+
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Setup failed");
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
program
|
|
94
|
+
.command("doctor")
|
|
95
|
+
.description("Verify setup and print copy-paste fixes")
|
|
96
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
97
|
+
.action(async (opts) => {
|
|
98
|
+
const { runDoctor } = await import("./core/doctor.js");
|
|
99
|
+
const result = await runDoctor(opts.project);
|
|
100
|
+
console.log("");
|
|
101
|
+
console.log(chalk.bold(" QASS Doctor"));
|
|
102
|
+
console.log(chalk.dim(" ───────────"));
|
|
103
|
+
for (const check of result.checks) {
|
|
104
|
+
console.log(chalk.green(` ✓ ${check}`));
|
|
105
|
+
}
|
|
106
|
+
if (result.issues.length === 0) {
|
|
107
|
+
console.log(chalk.green("\n All checks passed."));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.log("");
|
|
111
|
+
for (const issue of result.issues) {
|
|
112
|
+
const marker = issue.level === "error" ? chalk.red("✗") : chalk.yellow("!");
|
|
113
|
+
console.log(` ${marker} ${issue.title}`);
|
|
114
|
+
console.log(chalk.dim(` ${issue.fix}`));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
console.log("");
|
|
118
|
+
});
|
|
25
119
|
program
|
|
26
120
|
.command("test")
|
|
27
121
|
.description("Run tests based on git diff")
|
|
@@ -34,9 +128,24 @@ program
|
|
|
34
128
|
console.log(chalk.blue("QASS") +
|
|
35
129
|
chalk.dim(` testing ${config.project.name}...`));
|
|
36
130
|
const { runTests } = await import("./core/runner.js");
|
|
37
|
-
await runTests(config, opts.project, opts.diff, opts.type);
|
|
131
|
+
const report = await runTests(config, opts.project, opts.diff, opts.type);
|
|
132
|
+
const high = report.securityFindings.filter((f) => f.severity === "HIGH").length;
|
|
133
|
+
const medium = report.securityFindings.filter((f) => f.severity === "MEDIUM").length;
|
|
134
|
+
const low = report.securityFindings.filter((f) => f.severity === "LOW").length;
|
|
135
|
+
await recordLocalUsage(opts.project, "test", "success", { high, medium, low });
|
|
136
|
+
await trackEvent("command_success", {
|
|
137
|
+
command: "test",
|
|
138
|
+
findings_high: high,
|
|
139
|
+
findings_medium: medium,
|
|
140
|
+
findings_low: low,
|
|
141
|
+
});
|
|
38
142
|
}
|
|
39
143
|
catch (e) {
|
|
144
|
+
await recordLocalUsage(opts.project, "test", "failed");
|
|
145
|
+
await trackEvent("command_failed", {
|
|
146
|
+
command: "test",
|
|
147
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
148
|
+
});
|
|
40
149
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Test run failed");
|
|
41
150
|
process.exit(1);
|
|
42
151
|
}
|
|
@@ -53,9 +162,24 @@ program
|
|
|
53
162
|
console.log(chalk.blue("QASS") +
|
|
54
163
|
chalk.dim(` scanning ${config.project.name}...`));
|
|
55
164
|
const { runTests } = await import("./core/runner.js");
|
|
56
|
-
await runTests(config, opts.project, opts.diff, "security", opts.full);
|
|
165
|
+
const report = await runTests(config, opts.project, opts.diff, "security", opts.full);
|
|
166
|
+
const high = report.securityFindings.filter((f) => f.severity === "HIGH").length;
|
|
167
|
+
const medium = report.securityFindings.filter((f) => f.severity === "MEDIUM").length;
|
|
168
|
+
const low = report.securityFindings.filter((f) => f.severity === "LOW").length;
|
|
169
|
+
await recordLocalUsage(opts.project, "scan", "success", { high, medium, low });
|
|
170
|
+
await trackEvent("command_success", {
|
|
171
|
+
command: "scan",
|
|
172
|
+
findings_high: high,
|
|
173
|
+
findings_medium: medium,
|
|
174
|
+
findings_low: low,
|
|
175
|
+
});
|
|
57
176
|
}
|
|
58
177
|
catch (e) {
|
|
178
|
+
await recordLocalUsage(opts.project, "scan", "failed");
|
|
179
|
+
await trackEvent("command_failed", {
|
|
180
|
+
command: "scan",
|
|
181
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
182
|
+
});
|
|
59
183
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Scan failed");
|
|
60
184
|
process.exit(1);
|
|
61
185
|
}
|
|
@@ -69,8 +193,15 @@ program
|
|
|
69
193
|
const config = await loadConfig(opts.project);
|
|
70
194
|
const { discover } = await import("./core/discover.js");
|
|
71
195
|
await discover(config, opts.project);
|
|
196
|
+
await recordLocalUsage(opts.project, "discover", "success");
|
|
197
|
+
await trackEvent("command_success", { command: "discover" });
|
|
72
198
|
}
|
|
73
199
|
catch (e) {
|
|
200
|
+
await recordLocalUsage(opts.project, "discover", "failed");
|
|
201
|
+
await trackEvent("command_failed", {
|
|
202
|
+
command: "discover",
|
|
203
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
204
|
+
});
|
|
74
205
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Discovery failed");
|
|
75
206
|
process.exit(1);
|
|
76
207
|
}
|
|
@@ -84,12 +215,119 @@ program
|
|
|
84
215
|
const { generateCursorRule } = await import("./integrations/cursor-rule.js");
|
|
85
216
|
const rulePath = await generateCursorRule(opts.project);
|
|
86
217
|
console.log(chalk.green("✓") + ` Cursor rule created at ${rulePath}`);
|
|
218
|
+
await recordLocalUsage(opts.project, "cursor-rule", "success");
|
|
219
|
+
await trackEvent("command_success", { command: "cursor-rule" });
|
|
87
220
|
}
|
|
88
221
|
catch (e) {
|
|
222
|
+
await recordLocalUsage(opts.project, "cursor-rule", "failed");
|
|
223
|
+
await trackEvent("command_failed", {
|
|
224
|
+
command: "cursor-rule",
|
|
225
|
+
error: e instanceof Error ? e.message : "unknown error",
|
|
226
|
+
});
|
|
89
227
|
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Failed to generate rule");
|
|
90
228
|
process.exit(1);
|
|
91
229
|
}
|
|
92
230
|
});
|
|
231
|
+
program
|
|
232
|
+
.command("mcp-config")
|
|
233
|
+
.description("Generate MCP config for AI editors")
|
|
234
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
235
|
+
.action(async (opts) => {
|
|
236
|
+
try {
|
|
237
|
+
const { generateMcpConfig } = await import("./integrations/mcp-server.js");
|
|
238
|
+
const mcpPath = await generateMcpConfig(opts.project);
|
|
239
|
+
console.log(chalk.green("✓") + ` MCP config created at ${mcpPath}`);
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
console.error(chalk.red("✗"), e instanceof Error ? e.message : "Failed to generate MCP config");
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
program
|
|
247
|
+
.command("serve")
|
|
248
|
+
.description("Start local QASS dashboard API server")
|
|
249
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
250
|
+
.option("--port <port>", "Dashboard port", "3799")
|
|
251
|
+
.action(async (opts) => {
|
|
252
|
+
const { startDashboardServer } = await import("./server/dashboard-server.js");
|
|
253
|
+
const server = await startDashboardServer({
|
|
254
|
+
projectPath: opts.project,
|
|
255
|
+
port: Number(opts.port),
|
|
256
|
+
});
|
|
257
|
+
console.log(chalk.green(`QASS dashboard server running on http://127.0.0.1:${opts.port}`));
|
|
258
|
+
process.on("SIGINT", () => server.close());
|
|
259
|
+
await new Promise(() => { });
|
|
260
|
+
});
|
|
261
|
+
program
|
|
262
|
+
.command("ui")
|
|
263
|
+
.description("Launch local QASS dashboard in browser")
|
|
264
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
265
|
+
.option("--port <port>", "Dashboard port", "3799")
|
|
266
|
+
.option("--no-open", "Do not open browser automatically")
|
|
267
|
+
.action(async (opts) => {
|
|
268
|
+
const port = Number(opts.port);
|
|
269
|
+
const url = `http://127.0.0.1:${port}`;
|
|
270
|
+
const { startDashboardServer } = await import("./server/dashboard-server.js");
|
|
271
|
+
const server = await startDashboardServer({ projectPath: opts.project, port });
|
|
272
|
+
console.log(chalk.green(`QASS dashboard running at ${url}`));
|
|
273
|
+
if (opts.open !== false)
|
|
274
|
+
openBrowser(url);
|
|
275
|
+
process.on("SIGINT", () => server.close());
|
|
276
|
+
await new Promise(() => { });
|
|
277
|
+
});
|
|
278
|
+
program
|
|
279
|
+
.command("mcp-serve")
|
|
280
|
+
.description("Start QASS MCP stdio server (experimental)")
|
|
281
|
+
.action(async () => {
|
|
282
|
+
const { MCP_SERVER_DEFINITION } = await import("./integrations/mcp-server.js");
|
|
283
|
+
process.stdout.write(JSON.stringify({ status: "ready", server: MCP_SERVER_DEFINITION }) + "\n");
|
|
284
|
+
process.stdin.resume();
|
|
285
|
+
});
|
|
286
|
+
program
|
|
287
|
+
.command("telemetry")
|
|
288
|
+
.description("Manage telemetry settings")
|
|
289
|
+
.addCommand(new Command("enable").description("Enable anonymous telemetry").action(async () => {
|
|
290
|
+
await setTelemetryEnabled(true);
|
|
291
|
+
console.log(chalk.green("✓ Telemetry enabled"));
|
|
292
|
+
}))
|
|
293
|
+
.addCommand(new Command("disable").description("Disable anonymous telemetry").action(async () => {
|
|
294
|
+
await setTelemetryEnabled(false);
|
|
295
|
+
console.log(chalk.yellow("✓ Telemetry disabled"));
|
|
296
|
+
}))
|
|
297
|
+
.addCommand(new Command("status").description("Show telemetry status").action(async () => {
|
|
298
|
+
const status = await getTelemetryStatus();
|
|
299
|
+
const maskedId = status.anonymousId.slice(0, 8) + "••••••••" + status.anonymousId.slice(-4);
|
|
300
|
+
console.log("");
|
|
301
|
+
console.log(chalk.bold(" QASS Telemetry"));
|
|
302
|
+
console.log(chalk.dim(" ──────────────"));
|
|
303
|
+
console.log(` Enabled: ${status.enabled ? chalk.green("yes") : chalk.red("no")}`);
|
|
304
|
+
console.log(` Anonymous: ${chalk.dim(maskedId)}`);
|
|
305
|
+
console.log(` Endpoint: ${status.endpointConfigured ? chalk.green("configured") : chalk.dim("not set")}`);
|
|
306
|
+
if (!status.endpointConfigured) {
|
|
307
|
+
console.log(chalk.dim(" Set QASS_TELEMETRY_ENDPOINT to send dashboard events."));
|
|
308
|
+
}
|
|
309
|
+
console.log("");
|
|
310
|
+
}));
|
|
311
|
+
program
|
|
312
|
+
.command("usage")
|
|
313
|
+
.description("Show local usage stats for this project")
|
|
314
|
+
.option("-p, --project <path>", "Project root path", ".")
|
|
315
|
+
.action(async (opts) => {
|
|
316
|
+
const usage = await readLocalUsage(opts.project);
|
|
317
|
+
if (!usage) {
|
|
318
|
+
console.log(chalk.dim(" No usage data yet. Run qass scan/test first."));
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
console.log("");
|
|
322
|
+
console.log(chalk.bold(" QASS Usage (local project)"));
|
|
323
|
+
console.log(chalk.dim(" ──────────────────────────"));
|
|
324
|
+
console.log(` Runs: ${usage.totals.runs}`);
|
|
325
|
+
console.log(` Success: ${chalk.green(String(usage.totals.success))}`);
|
|
326
|
+
console.log(` Failed: ${usage.totals.failed > 0 ? chalk.red(String(usage.totals.failed)) : 0}`);
|
|
327
|
+
console.log(` Findings: ${chalk.red(`${usage.findings.high} HIGH`)}, ${chalk.yellow(`${usage.findings.medium} MEDIUM`)}, ${usage.findings.low} LOW`);
|
|
328
|
+
console.log(` Last run: ${usage.lastSeenAt}`);
|
|
329
|
+
console.log("");
|
|
330
|
+
});
|
|
93
331
|
program
|
|
94
332
|
.command("activate <key>")
|
|
95
333
|
.description("Activate a Pro or Team license key")
|
|
@@ -114,4 +352,25 @@ program
|
|
|
114
352
|
await showStatus();
|
|
115
353
|
});
|
|
116
354
|
program.parse();
|
|
355
|
+
async function fileExists(path) {
|
|
356
|
+
try {
|
|
357
|
+
await access(path);
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
function openBrowser(url) {
|
|
365
|
+
const platform = process.platform;
|
|
366
|
+
if (platform === "win32") {
|
|
367
|
+
spawn("cmd", ["/c", "start", "", url], { detached: true, stdio: "ignore" }).unref();
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (platform === "darwin") {
|
|
371
|
+
spawn("open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
spawn("xdg-open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
375
|
+
}
|
|
117
376
|
//# 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":"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"}
|
|
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,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,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,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,CAAC;AAEvD,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,mBAAmB,GAAG,MAAM,UAAU,CAC1C,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAC9C,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,sBAAsB,UAAU,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CACzC,+BAA+B,CAChC,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACtE,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,UAAU,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,UAAU,CAAC,gBAAgB,EAAE;gBACjC,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aACxD,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EACjB,CAAC,YAAY,KAAK;gBAChB,CAAC,CAAC,+CAA+C,CAAC,CAAC,OAAO,EAAE;gBAC5D,CAAC,CAAC,4CAA4C,CACjD,CAAC;QACJ,CAAC;IACH,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,OAAO,CAAC;KAChB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,mBAAmB,GAAG,MAAM,UAAU,CAC1C,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAC9C,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,sBAAsB,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;QAC7E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,0BAA0B,OAAO,EAAE,CAAC,CAAC;QAEpE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,UAAU,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,UAAU,CAAC,gBAAgB,EAAE;YACjC,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACxD,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,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,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QACrF,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;QAC/E,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/E,MAAM,UAAU,CAAC,iBAAiB,EAAE;YAClC,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE,MAAM;YACvB,YAAY,EAAE,GAAG;SAClB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,UAAU,CAAC,gBAAgB,EAAE;YACjC,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACxD,CAAC,CAAC;QACH,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,MAAM,GAAG,MAAM,QAAQ,CAC3B,MAAM,EACN,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,IAAI,EACT,UAAU,EACV,IAAI,CAAC,IAAI,CACV,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QACrF,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;QAC/E,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/E,MAAM,UAAU,CAAC,iBAAiB,EAAE;YAClC,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE,MAAM;YACvB,YAAY,EAAE,GAAG;SAClB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,UAAU,CAAC,gBAAgB,EAAE;YACjC,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACxD,CAAC,CAAC;QACH,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;QACrC,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,UAAU,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,UAAU,CAAC,gBAAgB,EAAE;YACjC,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACxD,CAAC,CAAC;QACH,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;QACtE,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAC/D,MAAM,UAAU,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,UAAU,CAAC,gBAAgB,EAAE;YACjC,OAAO,EAAE,aAAa;YACtB,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SACxD,CAAC,CAAC;QACH,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,YAAY,CAAC;KACrB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,0BAA0B,OAAO,EAAE,CAAC,CAAC;IACtE,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,+BAA+B,CACjE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,MAAM,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,WAAW,EAAE,IAAI,CAAC,OAAO;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;KACxB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qDAAqD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,MAAM,CAAC;KACjD,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IACvC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAChG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,2BAA2B,CAAC;KACxC,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;IAChF,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CACH;KACA,UAAU,CACT,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;IAClF,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CACH;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;IAC3E,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GACZ,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CACT,gBAAgB,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAC/F,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC,CACH,CAAC;AAEJ,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CACT,gBAAgB,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAC1I,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,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;AAEhB,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACpF,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAClE,OAAO;IACT,CAAC;IACD,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AACxE,CAAC"}
|
|
@@ -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":"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,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;IAED,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,YAAY,GAAG,OAAO,CAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,IAAI,EACJ,WAAW,EACX,qBAAqB,CACtB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,MAAM,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACzD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAExC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,SAAiB;IACrD,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAmB;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,YAAY,CAAC;IAC9D,OAAO;UACC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Db,CAAC;AACF,CAAC"}
|
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA6D1E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
export async function runDoctor(projectPath) {
|
|
4
|
+
const checks = [];
|
|
5
|
+
const issues = [];
|
|
6
|
+
const configPath = resolve(projectPath, ".qass", "config.yaml");
|
|
7
|
+
const rulePath = resolve(projectPath, ".cursor", "rules", "qass.mdc");
|
|
8
|
+
const mcpPath = resolve(projectPath, ".cursor", "mcp.json");
|
|
9
|
+
const reportPath = resolve(projectPath, ".qass", "results", "latest.md");
|
|
10
|
+
if (await exists(configPath)) {
|
|
11
|
+
checks.push(`Config: ${configPath}`);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
issues.push({
|
|
15
|
+
level: "error",
|
|
16
|
+
title: "Missing QASS config",
|
|
17
|
+
fix: "Run: npx @qasshq/qass init --project .",
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (await exists(rulePath)) {
|
|
21
|
+
checks.push(`AI rule: ${rulePath}`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
issues.push({
|
|
25
|
+
level: "warn",
|
|
26
|
+
title: "Missing AI editor rule",
|
|
27
|
+
fix: "Run: npx @qasshq/qass cursor-rule --project .",
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (await exists(mcpPath)) {
|
|
31
|
+
checks.push(`MCP config: ${mcpPath}`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
issues.push({
|
|
35
|
+
level: "warn",
|
|
36
|
+
title: "Missing MCP config",
|
|
37
|
+
fix: "Run: npx @qasshq/qass setup --project .",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (await exists(reportPath)) {
|
|
41
|
+
checks.push("Latest report: .qass/results/latest.md");
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
issues.push({
|
|
45
|
+
level: "warn",
|
|
46
|
+
title: "No report generated yet",
|
|
47
|
+
fix: "Run: npx @qasshq/qass scan --project . --full",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (!process.env.QASS_TELEMETRY_ENDPOINT) {
|
|
51
|
+
issues.push({
|
|
52
|
+
level: "warn",
|
|
53
|
+
title: "Remote telemetry endpoint not configured",
|
|
54
|
+
fix: "Optional: set QASS_TELEMETRY_ENDPOINT to send usage data to your dashboard backend.",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
ok: issues.filter((i) => i.level === "error").length === 0,
|
|
59
|
+
checks,
|
|
60
|
+
issues,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
async function exists(path) {
|
|
64
|
+
try {
|
|
65
|
+
await access(path);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAc1C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAmB;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAEzE,IAAI,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,qBAAqB;YAC5B,GAAG,EAAE,wCAAwC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,wBAAwB;YAC/B,GAAG,EAAE,+CAA+C;SACrD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,oBAAoB;YAC3B,GAAG,EAAE,yCAAyC;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,yBAAyB;YAChC,GAAG,EAAE,+CAA+C;SACrD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,0CAA0C;YACjD,GAAG,EAAE,qFAAqF;SAC3F,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAC1D,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAA+B,MAAM,aAAa,CAAC;AAMvF,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,UAAQ,GACf,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAA+B,MAAM,aAAa,CAAC;AAMvF,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,UAAQ,GACf,OAAO,CAAC,UAAU,CAAC,CAoLrB"}
|