@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.
Files changed (44) hide show
  1. package/README.md +65 -11
  2. package/dist/cli.js +309 -8
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/config.d.ts.map +1 -1
  5. package/dist/core/config.js +8 -6
  6. package/dist/core/config.js.map +1 -1
  7. package/dist/core/doctor.d.ts +12 -0
  8. package/dist/core/doctor.d.ts.map +1 -0
  9. package/dist/core/doctor.js +72 -0
  10. package/dist/core/doctor.js.map +1 -0
  11. package/dist/core/license.d.ts.map +1 -1
  12. package/dist/core/license.js +11 -0
  13. package/dist/core/license.js.map +1 -1
  14. package/dist/core/runner.d.ts.map +1 -1
  15. package/dist/core/runner.js +13 -3
  16. package/dist/core/runner.js.map +1 -1
  17. package/dist/core/telemetry.d.ts +44 -0
  18. package/dist/core/telemetry.d.ts.map +1 -0
  19. package/dist/core/telemetry.js +131 -0
  20. package/dist/core/telemetry.js.map +1 -0
  21. package/dist/integrations/cursor-rule.d.ts +1 -1
  22. package/dist/integrations/cursor-rule.d.ts.map +1 -1
  23. package/dist/integrations/cursor-rule.js +6 -6
  24. package/dist/integrations/cursor-rule.js.map +1 -1
  25. package/dist/integrations/editor-prompts.d.ts +3 -0
  26. package/dist/integrations/editor-prompts.d.ts.map +1 -0
  27. package/dist/integrations/editor-prompts.js +21 -0
  28. package/dist/integrations/editor-prompts.js.map +1 -0
  29. package/dist/integrations/editor-setup.d.ts +8 -0
  30. package/dist/integrations/editor-setup.d.ts.map +1 -0
  31. package/dist/integrations/editor-setup.js +62 -0
  32. package/dist/integrations/editor-setup.js.map +1 -0
  33. package/dist/integrations/mcp-server.d.ts +1 -1
  34. package/dist/integrations/mcp-server.d.ts.map +1 -1
  35. package/dist/integrations/mcp-server.js +4 -4
  36. package/dist/integrations/mcp-server.js.map +1 -1
  37. package/dist/runners/e2e/playwright-runner.d.ts.map +1 -1
  38. package/dist/runners/e2e/playwright-runner.js +96 -3
  39. package/dist/runners/e2e/playwright-runner.js.map +1 -1
  40. package/dist/server/dashboard-server.d.ts +7 -0
  41. package/dist/server/dashboard-server.d.ts.map +1 -0
  42. package/dist/server/dashboard-server.js +212 -0
  43. package/dist/server/dashboard-server.js.map +1 -0
  44. 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
- # Run tests based on your latest git changes
29
- qass test --project . --diff HEAD
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 a Cursor rule file that tells your AI editor to run tests after every code change:
57
+ `qass init` automatically generates AI editor integration files for the detected editor context:
53
58
 
54
59
  ```bash
55
- # Initialize QASS + auto-generate Cursor rule
60
+ # Initialize QASS + auto-generate detected editor integration
56
61
  npx @qasshq/qass init --project .
62
+ ```
57
63
 
58
- # Creates .cursor/rules/qass.mdc
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 any AI editor that can run terminal commands — Cursor, Windsurf, Copilot, Bolt, Lovable.
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 rule file |
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.1.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
- console.log(chalk.green("✓") + ` Config created at ${configPath}`);
18
- console.log(chalk.dim(" Edit .qass/config.yaml to configure your project."));
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 { generateCursorRule } = await import("./integrations/cursor-rule.js");
85
- const rulePath = await generateCursorRule(opts.project);
86
- console.log(chalk.green("✓") + ` Cursor rule created at ${rulePath}`);
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":"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"}
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,CAmCrE"}
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"}
@@ -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
- throw new Error(`Config already exists at ${targetFile}`);
38
+ await ensureProjectArtifacts(targetDir);
39
+ return targetFile;
39
40
  }
40
- catch (e) {
41
- if (e instanceof Error && e.message.startsWith("Config already exists")) {
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";
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
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