@vscode/component-explorer-cli 0.1.1-5 → 0.1.1-6

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 (45) hide show
  1. package/README.md +178 -0
  2. package/dist/commands/acceptCommand.d.ts +2 -1
  3. package/dist/commands/acceptCommand.d.ts.map +1 -1
  4. package/dist/commands/acceptCommand.js +12 -6
  5. package/dist/commands/acceptCommand.js.map +1 -1
  6. package/dist/commands/compareCommand.d.ts +8 -1
  7. package/dist/commands/compareCommand.d.ts.map +1 -1
  8. package/dist/commands/compareCommand.js +197 -33
  9. package/dist/commands/compareCommand.js.map +1 -1
  10. package/dist/commands/mcpCommand.d.ts +1 -1
  11. package/dist/commands/mcpCommand.d.ts.map +1 -1
  12. package/dist/commands/mcpCommand.js +9 -3
  13. package/dist/commands/mcpCommand.js.map +1 -1
  14. package/dist/commands/screenshotCommand.d.ts +7 -2
  15. package/dist/commands/screenshotCommand.d.ts.map +1 -1
  16. package/dist/commands/screenshotCommand.js +111 -10
  17. package/dist/commands/screenshotCommand.js.map +1 -1
  18. package/dist/commands/serveCommand.d.ts +1 -1
  19. package/dist/commands/serveCommand.d.ts.map +1 -1
  20. package/dist/commands/serveCommand.js +18 -11
  21. package/dist/commands/serveCommand.js.map +1 -1
  22. package/dist/commands/watchCommand.d.ts +1 -2
  23. package/dist/commands/watchCommand.d.ts.map +1 -1
  24. package/dist/commands/watchCommand.js +18 -17
  25. package/dist/commands/watchCommand.js.map +1 -1
  26. package/dist/componentExplorer.d.ts +30 -2
  27. package/dist/componentExplorer.d.ts.map +1 -1
  28. package/dist/componentExplorer.js +4 -2
  29. package/dist/componentExplorer.js.map +1 -1
  30. package/dist/daemon/DaemonService.d.ts +4 -0
  31. package/dist/daemon/DaemonService.d.ts.map +1 -1
  32. package/dist/daemon/DaemonService.js +16 -12
  33. package/dist/daemon/DaemonService.js.map +1 -1
  34. package/dist/daemon/lifecycle.js +1 -1
  35. package/dist/daemon/lifecycle.js.map +1 -1
  36. package/dist/httpServer.js +14 -8
  37. package/dist/httpServer.js.map +1 -1
  38. package/dist/mcp/McpServer.d.ts.map +1 -1
  39. package/dist/mcp/McpServer.js +14 -1
  40. package/dist/mcp/McpServer.js.map +1 -1
  41. package/dist/resolveProject.d.ts +21 -0
  42. package/dist/resolveProject.d.ts.map +1 -0
  43. package/dist/resolveProject.js +39 -0
  44. package/dist/resolveProject.js.map +1 -0
  45. package/package.json +1 -1
package/README.md ADDED
@@ -0,0 +1,178 @@
1
+ # @vscode/component-explorer-cli
2
+
3
+ Command-line tool for capturing, comparing, and managing component fixture screenshots.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @vscode/component-explorer-cli
9
+ ```
10
+
11
+ The binary is available as `component-explorer`.
12
+
13
+ ## Commands
14
+
15
+ ### `screenshot`
16
+
17
+ Capture screenshots of all fixtures using a headless browser.
18
+
19
+ ```bash
20
+ component-explorer screenshot [options]
21
+ ```
22
+
23
+ | Option | Description |
24
+ |---|---|
25
+ | `-p, --project <path>` | Project: a directory, vite config file, or component-explorer.json (default: cwd) |
26
+ | `--filter <pattern>` | Filter fixtures by glob pattern |
27
+ | `--accept` | Write to baseline instead of current (mutually exclusive with `--target`) |
28
+ | `--target <dir>` | Screenshot output directory (default: `.screenshots/current`, or `.screenshots/baseline` with `--accept`) |
29
+ | `--compare` | Compare screenshots after capturing |
30
+ | `--compare-target <dir>` | Directory to compare against (default: `.screenshots/baseline`, or `.screenshots/current` with `--accept`) |
31
+ | `--report <path>` | Output JSON comparison report path (requires `--compare`) |
32
+ | `-v, --verbose` | Increase log verbosity (`-v` debug, `-vv` trace) |
33
+
34
+ ```bash
35
+ # Capture all fixtures
36
+ component-explorer screenshot
37
+
38
+ # Capture and accept as baseline
39
+ component-explorer screenshot --accept
40
+
41
+ # Capture, then compare against baseline
42
+ component-explorer screenshot --compare
43
+
44
+ # Filter by glob
45
+ component-explorer screenshot --filter "Button/*"
46
+ ```
47
+
48
+ ### `screenshot:compare`
49
+
50
+ Compare two screenshot directories (file-level hash comparison).
51
+
52
+ ```bash
53
+ component-explorer screenshot:compare [options]
54
+ ```
55
+
56
+ | Option | Description |
57
+ |---|---|
58
+ | `-p, --project <path>` | Project directory (default: cwd) |
59
+ | `--baseline <dir>` | Baseline screenshots directory (default: `.screenshots/baseline`) |
60
+ | `--current <dir>` | Current screenshots directory (default: `.screenshots/current`) |
61
+ | `--filter <pattern>` | Filter fixtures by glob pattern |
62
+ | `--report <path>` | Output JSON report path |
63
+ | `--report-markdown <path>` | Output Markdown report path |
64
+ | `-v, --verbose` | Increase log verbosity |
65
+
66
+ Exits with code 1 if differences are found, 0 otherwise.
67
+
68
+ ```bash
69
+ # Compare default directories
70
+ component-explorer screenshot:compare
71
+
72
+ # Compare with custom paths
73
+ component-explorer screenshot:compare --baseline ./golden --current ./actual
74
+
75
+ # Generate reports
76
+ component-explorer screenshot:compare --report report.json --report-markdown report.md
77
+ ```
78
+
79
+ ### `screenshot:accept`
80
+
81
+ Promote current screenshots to baseline by copying them from `.screenshots/current` to `.screenshots/baseline`.
82
+
83
+ ```bash
84
+ component-explorer screenshot:accept [options]
85
+ ```
86
+
87
+ | Option | Description |
88
+ |---|---|
89
+ | `-p, --project <path>` | Project directory (default: cwd) |
90
+ | `--filter <pattern>` | Filter fixtures by glob pattern |
91
+ | `--screenshot-dir <dir>` | Screenshots directory (default: `.screenshots`) |
92
+ | `-v, --verbose` | Increase log verbosity |
93
+
94
+ ```bash
95
+ # Accept all current screenshots as baseline
96
+ component-explorer screenshot:accept
97
+
98
+ # Accept specific fixtures
99
+ component-explorer screenshot:accept --filter "Button/*"
100
+ ```
101
+
102
+ ### `watch`
103
+
104
+ Watch for source changes and automatically re-capture/compare screenshots. Supports both simple mode (single project) and config mode (multiple sessions with git worktrees).
105
+
106
+ ```bash
107
+ component-explorer watch [options]
108
+ ```
109
+
110
+ | Option | Description |
111
+ |---|---|
112
+ | `-p, --project <path>` | Project: a directory, vite config file, or component-explorer.json (default: cwd) |
113
+ | `-v, --verbose` | Increase log verbosity |
114
+
115
+ In simple mode, starts a Vite dev server and re-captures screenshots on every HMR update. In config mode (when given a `component-explorer.json`), manages multiple sessions including git worktree-based baselines.
116
+
117
+ ```bash
118
+ # Watch all fixtures
119
+ component-explorer watch
120
+
121
+ # Watch with config
122
+ component-explorer watch -p component-explorer.json
123
+ ```
124
+
125
+ ### `serve`
126
+
127
+ Start or attach to a Component Explorer daemon process. The daemon manages Vite servers and browser sessions in the background.
128
+
129
+ ```bash
130
+ component-explorer serve -p <config> [options]
131
+ ```
132
+
133
+ | Option | Description |
134
+ |---|---|
135
+ | `-p, --project, -c <path>` | **(required)** Path to a component-explorer.json config file |
136
+ | `--background` | Spawn as a detached background process |
137
+ | `--attach` | Attach to a running daemon and stream events |
138
+ | `--kill` | Shut down a running daemon |
139
+ | `-v, --verbose` | Increase log verbosity |
140
+
141
+ Without flags, starts a foreground daemon. Combine `--background` and `--attach` to ensure a daemon is running and then stream its events.
142
+
143
+ ```bash
144
+ # Start in foreground
145
+ component-explorer serve -p config.json
146
+
147
+ # Start in background
148
+ component-explorer serve -p config.json --background
149
+
150
+ # Attach to running daemon
151
+ component-explorer serve -p config.json --attach
152
+
153
+ # Ensure daemon + attach
154
+ component-explorer serve -p config.json --background --attach
155
+
156
+ # Kill running daemon
157
+ component-explorer serve -p config.json --kill
158
+ ```
159
+
160
+ ### `mcp`
161
+
162
+ Start a [Model Context Protocol](https://modelcontextprotocol.io/) server over stdio. Auto-starts a daemon if one is not already running.
163
+
164
+ ```bash
165
+ component-explorer mcp -p <config>
166
+ ```
167
+
168
+ | Option | Description |
169
+ |---|---|
170
+ | `-p, --project, -c <path>` | **(required)** Path to a component-explorer.json config file |
171
+
172
+ ```bash
173
+ component-explorer mcp --project config.json
174
+ ```
175
+
176
+ ## Global Options
177
+
178
+ All commands support `-v` / `--verbose` for increased log output. Use `-vv` for trace-level logging.
@@ -4,7 +4,8 @@ export declare class AcceptCommand extends Command {
4
4
  static usage: import("clipanion").Usage;
5
5
  readonly verbose: number;
6
6
  readonly filter: string | undefined;
7
- readonly root: string;
7
+ readonly project: string;
8
+ readonly screenshotDir: string;
8
9
  execute(): Promise<void>;
9
10
  }
10
11
  //# sourceMappingURL=acceptCommand.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"acceptCommand.d.ts","sourceRoot":"","sources":["../../src/commands/acceptCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,qBAAa,aAAc,SAAQ,OAAO;IACzC,OAAgB,KAAK,aAAgB;IAErC,OAAgB,KAAK,4BAMlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,MAAM,qBAAkG;IACjH,QAAQ,CAAC,IAAI,SAAqF;IAE5F,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA2B9B"}
1
+ {"version":3,"file":"acceptCommand.d.ts","sourceRoot":"","sources":["../../src/commands/acceptCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAM5C,qBAAa,aAAc,SAAQ,OAAO;IACzC,OAAgB,KAAK,aAA2B;IAEhD,OAAgB,KAAK,4BAMlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,MAAM,qBAAkG;IACjH,QAAQ,CAAC,OAAO,SAAuI;IACvJ,QAAQ,CAAC,aAAa,SAA+F;IAE/G,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B9B"}
@@ -1,22 +1,28 @@
1
1
  import { Command, Option } from 'clipanion';
2
+ import * as path from 'node:path';
2
3
  import { ConsoleLogger, verbosityToLogLevel } from '../logger.js';
3
4
  import { FileSystemStorage } from '../storage.js';
5
+ import { resolveProject } from '../resolveProject.js';
4
6
 
5
7
  class AcceptCommand extends Command {
6
- static paths = [['accept']];
8
+ static paths = [['screenshot:accept']];
7
9
  static usage = Command.Usage({
8
- description: 'Promote current screenshots as baseline',
10
+ description: 'Promote current screenshots to baseline (file-level only)',
9
11
  examples: [
10
- ['Accept all', '$0 accept'],
11
- ['Accept specific fixtures', '$0 accept --filter "Button/*"'],
12
+ ['Accept all', '$0 screenshot:accept'],
13
+ ['Accept specific fixtures', '$0 screenshot:accept --filter "Button/*"'],
12
14
  ],
13
15
  });
14
16
  verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
15
17
  filter = Option.String('--filter', { required: false, description: 'Filter fixtures by glob pattern' });
16
- root = Option.String('--root', process.cwd(), { description: 'Project root directory' });
18
+ project = Option.String('-p,--project', process.cwd(), { description: 'Project: a directory, vite config file, or component-explorer.json' });
19
+ screenshotDir = Option.String('--screenshot-dir', '.screenshots', { description: 'Screenshots directory' });
17
20
  async execute() {
21
+ const resolved = await resolveProject(this.project);
22
+ const projectDir = resolved.projectDir;
18
23
  new ConsoleLogger('accept', this.context.stdout, verbosityToLogLevel(this.verbose));
19
- const storage = new FileSystemStorage(`${this.root}/.screenshots`);
24
+ const screenshotPath = path.isAbsolute(this.screenshotDir) ? this.screenshotDir : path.join(projectDir, this.screenshotDir);
25
+ const storage = new FileSystemStorage(screenshotPath);
20
26
  let currentFiles = await storage.list('current');
21
27
  if (this.filter) {
22
28
  const regex = new RegExp('^current/' + this.filter.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
@@ -1 +1 @@
1
- {"version":3,"file":"acceptCommand.js","sources":["../../src/commands/acceptCommand.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIM,MAAO,aAAc,SAAQ,OAAO,CAAA;IACzC,OAAgB,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEpC,IAAA,OAAgB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AACrC,QAAA,WAAW,EAAE,yCAAyC;AACtD,QAAA,QAAQ,EAAE;YACT,CAAC,YAAY,EAAE,WAAW,CAAC;YAC3B,CAAC,0BAA0B,EAAE,+BAA+B,CAAC;AAC7D,SAAA;AACD,KAAA,CAAC;AAEO,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;AAC5G,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;AACvG,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;AAEjG,IAAA,MAAM,OAAO,GAAA;QACI,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;QAClG,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,aAAA,CAAe,CAAC;QAElE,IAAI,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;AAEhD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,MAAM,CACvB,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CACxE;AACD,YAAA,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvD;AAEA,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC;YAChE;QACD;AAEA,QAAA,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE;YAChC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA,SAAA,EAAY,YAAY,CAAA,CAAE,EAAE,IAAI,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,IAAA,EAAO,YAAY,CAAA,EAAA,CAAI,CAAC;QACnD;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,WAAA,EAAc,YAAY,CAAC,MAAM,CAAA,6BAAA,CAA+B,CAAC;IAC5F;;;;;"}
1
+ {"version":3,"file":"acceptCommand.js","sources":["../../src/commands/acceptCommand.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAMM,MAAO,aAAc,SAAQ,OAAO,CAAA;IACzC,OAAgB,KAAK,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC;AAE/C,IAAA,OAAgB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AACrC,QAAA,WAAW,EAAE,2DAA2D;AACxE,QAAA,QAAQ,EAAE;YACT,CAAC,YAAY,EAAE,sBAAsB,CAAC;YACtC,CAAC,0BAA0B,EAAE,0CAA0C,CAAC;AACxE,SAAA;AACD,KAAA,CAAC;AAEO,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;AAC5G,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;AACvG,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,oEAAoE,EAAE,CAAC;AAC7I,IAAA,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;AAEpH,IAAA,MAAM,OAAO,GAAA;QACZ,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AACnD,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU;QACtB,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;AAClG,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;AAC3H,QAAA,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,cAAc,CAAC;QAErD,IAAI,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;AAEhD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,MAAM,CACvB,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CACxE;AACD,YAAA,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvD;AAEA,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC;YAChE;QACD;AAEA,QAAA,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE;YAChC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA,SAAA,EAAY,YAAY,CAAA,CAAE,EAAE,IAAI,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,IAAA,EAAO,YAAY,CAAA,EAAA,CAAI,CAAC;QACnD;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,WAAA,EAAc,YAAY,CAAC,MAAM,CAAA,6BAAA,CAA+B,CAAC;IAC5F;;;;;"}
@@ -3,7 +3,14 @@ export declare class CompareCommand extends Command {
3
3
  static paths: string[][];
4
4
  static usage: import("clipanion").Usage;
5
5
  readonly verbose: number;
6
- readonly root: string;
6
+ readonly filter: string | undefined;
7
+ readonly project: string;
8
+ readonly baseline: string;
9
+ readonly current: string;
10
+ readonly report: string | undefined;
11
+ readonly reportMarkdown: string | undefined;
7
12
  execute(): Promise<number>;
13
+ private _printConsoleOutput;
14
+ private _generateMarkdownReport;
8
15
  }
9
16
  //# sourceMappingURL=compareCommand.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compareCommand.d.ts","sourceRoot":"","sources":["../../src/commands/compareCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,qBAAa,cAAe,SAAQ,OAAO;IAC1C,OAAgB,KAAK,aAAiB;IAEtC,OAAgB,KAAK,4BAKlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,IAAI,SAAqF;IAE5F,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAiEhC"}
1
+ {"version":3,"file":"compareCommand.d.ts","sourceRoot":"","sources":["../../src/commands/compareCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AA6B5C,qBAAa,cAAe,SAAQ,OAAO;IAC1C,OAAgB,KAAK,aAA4B;IAEjD,OAAgB,KAAK,4BAOlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,MAAM,qBAAkG;IACjH,QAAQ,CAAC,OAAO,SAAuI;IACvJ,QAAQ,CAAC,QAAQ,SAA2G;IAC5H,QAAQ,CAAC,OAAO,SAAwG;IACxH,QAAQ,CAAC,MAAM,qBAA0F;IACzG,QAAQ,CAAC,cAAc,qBAAuG;IAExH,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAgHhC,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,uBAAuB;CA0E/B"}
@@ -1,48 +1,128 @@
1
1
  import { Command, Option } from 'clipanion';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
2
4
  import { ConsoleLogger, verbosityToLogLevel } from '../logger.js';
3
5
  import { FileSystemStorage } from '../storage.js';
6
+ import { resolveProject } from '../resolveProject.js';
7
+ import { contentHash } from '../screenshotCache.js';
4
8
 
5
9
  class CompareCommand extends Command {
6
- static paths = [['compare']];
10
+ static paths = [['screenshot:compare']];
7
11
  static usage = Command.Usage({
8
- description: 'Compare current screenshots against baseline',
12
+ description: 'Compare screenshot directories (file-level only)',
9
13
  examples: [
10
- ['Compare default directories', '$0 compare'],
14
+ ['Compare default directories', '$0 screenshot:compare'],
15
+ ['Compare with custom paths', '$0 screenshot:compare --baseline ./golden --current ./actual'],
16
+ ['Generate reports', '$0 screenshot:compare --report report.json'],
11
17
  ],
12
18
  });
13
19
  verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
14
- root = Option.String('--root', process.cwd(), { description: 'Project root directory' });
20
+ filter = Option.String('--filter', { required: false, description: 'Filter fixtures by glob pattern' });
21
+ project = Option.String('-p,--project', process.cwd(), { description: 'Project: a directory, vite config file, or component-explorer.json' });
22
+ baseline = Option.String('--baseline', '.screenshots/baseline', { description: 'Baseline screenshots directory' });
23
+ current = Option.String('--current', '.screenshots/current', { description: 'Current screenshots directory' });
24
+ report = Option.String('--report', { required: false, description: 'Output JSON report path' });
25
+ reportMarkdown = Option.String('--report-markdown', { required: false, description: 'Output Markdown report path' });
15
26
  async execute() {
27
+ const resolved = await resolveProject(this.project);
28
+ const projectDir = resolved.projectDir;
16
29
  new ConsoleLogger('compare', this.context.stdout, verbosityToLogLevel(this.verbose));
17
- const storage = new FileSystemStorage(`${this.root}/.screenshots`);
18
- const baselineFiles = await storage.list('baseline');
19
- const currentFiles = await storage.list('current');
20
- const baselineSet = new Set(baselineFiles.map(f => f.replace('baseline/', '')));
21
- const currentSet = new Set(currentFiles.map(f => f.replace('current/', '')));
30
+ const baselineDir = path.isAbsolute(this.baseline) ? this.baseline : path.join(projectDir, this.baseline);
31
+ const currentDir = path.isAbsolute(this.current) ? this.current : path.join(projectDir, this.current);
32
+ const baselineStorage = new FileSystemStorage(baselineDir);
33
+ const currentStorage = new FileSystemStorage(currentDir);
34
+ // List all PNG files
35
+ let baselineFiles = await listPngFiles(baselineDir);
36
+ let currentFiles = await listPngFiles(currentDir);
37
+ // Apply filter if specified
38
+ if (this.filter) {
39
+ const filterFn = (file) => matchGlob(file.replace(/\.png$/, ''), this.filter);
40
+ baselineFiles = baselineFiles.filter(filterFn);
41
+ currentFiles = currentFiles.filter(filterFn);
42
+ }
43
+ const baselineSet = new Set(baselineFiles);
44
+ const currentSet = new Set(currentFiles);
22
45
  const added = [];
23
46
  const removed = [];
24
47
  const changed = [];
25
48
  const unchanged = [];
49
+ const details = {};
50
+ // Compare files
26
51
  for (const file of currentSet) {
52
+ const fixtureId = file.replace(/\.png$/, '');
27
53
  if (!baselineSet.has(file)) {
28
- added.push(file);
54
+ added.push(fixtureId);
55
+ const currentData = await currentStorage.read(file);
56
+ details[fixtureId] = { currentHash: contentHash(currentData) };
29
57
  }
30
58
  else {
31
- const baselineData = await storage.read(`baseline/${file}`);
32
- const currentData = await storage.read(`current/${file}`);
33
- if (buffersEqual(baselineData, currentData)) {
34
- unchanged.push(file);
59
+ const baselineData = await baselineStorage.read(file);
60
+ const currentData = await currentStorage.read(file);
61
+ const baselineHashVal = contentHash(baselineData);
62
+ const currentHashVal = contentHash(currentData);
63
+ if (baselineHashVal === currentHashVal) {
64
+ unchanged.push(fixtureId);
65
+ details[fixtureId] = { baselineHash: baselineHashVal, currentHash: currentHashVal };
35
66
  }
36
67
  else {
37
- changed.push(file);
68
+ changed.push(fixtureId);
69
+ details[fixtureId] = { baselineHash: baselineHashVal, currentHash: currentHashVal };
38
70
  }
39
71
  }
40
72
  }
41
73
  for (const file of baselineSet) {
74
+ const fixtureId = file.replace(/\.png$/, '');
42
75
  if (!currentSet.has(file)) {
43
- removed.push(file);
76
+ removed.push(fixtureId);
77
+ const baselineData = await baselineStorage.read(file);
78
+ details[fixtureId] = { baselineHash: contentHash(baselineData) };
44
79
  }
45
80
  }
81
+ // Sort for consistent output
82
+ added.sort();
83
+ removed.sort();
84
+ changed.sort();
85
+ unchanged.sort();
86
+ // Build report
87
+ const report = {
88
+ timestamp: new Date().toISOString(),
89
+ baseline: this.baseline,
90
+ current: this.current,
91
+ summary: {
92
+ total: added.length + removed.length + changed.length + unchanged.length,
93
+ added: added.length,
94
+ removed: removed.length,
95
+ changed: changed.length,
96
+ unchanged: unchanged.length,
97
+ },
98
+ added,
99
+ removed,
100
+ changed,
101
+ unchanged,
102
+ details,
103
+ };
104
+ // Console output
105
+ this._printConsoleOutput(report);
106
+ // Write JSON report
107
+ if (this.report) {
108
+ const reportPath = path.isAbsolute(this.report) ? this.report : path.join(projectDir, this.report);
109
+ await fs.mkdir(path.dirname(reportPath), { recursive: true });
110
+ await fs.writeFile(reportPath, JSON.stringify(report, null, 2));
111
+ this.context.stdout.write(`\nJSON report written to: ${this.report}\n`);
112
+ }
113
+ // Write Markdown report
114
+ if (this.reportMarkdown) {
115
+ const mdPath = path.isAbsolute(this.reportMarkdown) ? this.reportMarkdown : path.join(projectDir, this.reportMarkdown);
116
+ await fs.mkdir(path.dirname(mdPath), { recursive: true });
117
+ const markdown = this._generateMarkdownReport(report);
118
+ await fs.writeFile(mdPath, markdown);
119
+ this.context.stdout.write(`Markdown report written to: ${this.reportMarkdown}\n`);
120
+ }
121
+ const hasDiffs = added.length > 0 || removed.length > 0 || changed.length > 0;
122
+ return hasDiffs ? 1 : 0;
123
+ }
124
+ _printConsoleOutput(report) {
125
+ const { added, removed, changed, unchanged } = report;
46
126
  if (added.length > 0) {
47
127
  this.context.stdout.write(`Added (${added.length}):\n`);
48
128
  for (const f of added) {
@@ -61,29 +141,113 @@ class CompareCommand extends Command {
61
141
  this.context.stdout.write(` ~ ${f}\n`);
62
142
  }
63
143
  }
64
- if (unchanged.length > 0) {
65
- this.context.stdout.write(`Unchanged (${unchanged.length}):\n`);
66
- for (const f of unchanged) {
67
- this.context.stdout.write(` = ${f}\n`);
144
+ this.context.stdout.write(`\nSummary: ${report.summary.total} fixtures`);
145
+ if (added.length > 0 || removed.length > 0 || changed.length > 0) {
146
+ const parts = [];
147
+ if (added.length > 0)
148
+ parts.push(`${added.length} added`);
149
+ if (removed.length > 0)
150
+ parts.push(`${removed.length} removed`);
151
+ if (changed.length > 0)
152
+ parts.push(`${changed.length} changed`);
153
+ if (unchanged.length > 0)
154
+ parts.push(`${unchanged.length} unchanged`);
155
+ this.context.stdout.write(` (${parts.join(', ')})\n`);
156
+ }
157
+ else {
158
+ this.context.stdout.write(' — no differences\n');
159
+ }
160
+ }
161
+ _generateMarkdownReport(report) {
162
+ const lines = [];
163
+ const hasDiffs = report.added.length > 0 || report.removed.length > 0 || report.changed.length > 0;
164
+ lines.push('# Screenshot Comparison Report');
165
+ lines.push('');
166
+ lines.push(`**Generated:** ${report.timestamp}`);
167
+ lines.push(`**Baseline:** \`${report.baseline}\``);
168
+ lines.push(`**Current:** \`${report.current}\``);
169
+ lines.push('');
170
+ // Summary
171
+ lines.push('## Summary');
172
+ lines.push('');
173
+ if (!hasDiffs) {
174
+ lines.push('✅ **No visual differences detected.**');
175
+ }
176
+ else {
177
+ lines.push('| Status | Count |');
178
+ lines.push('|--------|-------|');
179
+ if (report.added.length > 0)
180
+ lines.push(`| ➕ Added | ${report.added.length} |`);
181
+ if (report.removed.length > 0)
182
+ lines.push(`| ➖ Removed | ${report.removed.length} |`);
183
+ if (report.changed.length > 0)
184
+ lines.push(`| ⚠️ Changed | ${report.changed.length} |`);
185
+ lines.push(`| ✅ Unchanged | ${report.unchanged.length} |`);
186
+ lines.push(`| **Total** | **${report.summary.total}** |`);
187
+ }
188
+ lines.push('');
189
+ // Changed fixtures (most important)
190
+ if (report.changed.length > 0) {
191
+ lines.push('## Changed Fixtures');
192
+ lines.push('');
193
+ lines.push('| Fixture | Baseline Hash | Current Hash |');
194
+ lines.push('|---------|---------------|--------------|');
195
+ for (const id of report.changed) {
196
+ const detail = report.details[id];
197
+ lines.push(`| \`${id}\` | \`${detail?.baselineHash ?? '-'}\` | \`${detail?.currentHash ?? '-'}\` |`);
198
+ }
199
+ lines.push('');
200
+ }
201
+ // Added fixtures
202
+ if (report.added.length > 0) {
203
+ lines.push('## Added Fixtures');
204
+ lines.push('');
205
+ for (const id of report.added) {
206
+ lines.push(`- \`${id}\``);
68
207
  }
208
+ lines.push('');
69
209
  }
70
- const hasDiffs = added.length > 0 || removed.length > 0 || changed.length > 0;
71
- if (hasDiffs) {
72
- this.context.stdout.write('\nDifferences found.\n');
73
- return 1;
210
+ // Removed fixtures
211
+ if (report.removed.length > 0) {
212
+ lines.push('## Removed Fixtures');
213
+ lines.push('');
214
+ for (const id of report.removed) {
215
+ lines.push(`- \`${id}\``);
216
+ }
217
+ lines.push('');
218
+ }
219
+ // Unchanged (collapsed/summary only)
220
+ if (report.unchanged.length > 0) {
221
+ lines.push('<details>');
222
+ lines.push(`<summary>Unchanged Fixtures (${report.unchanged.length})</summary>`);
223
+ lines.push('');
224
+ for (const id of report.unchanged) {
225
+ lines.push(`- \`${id}\``);
226
+ }
227
+ lines.push('');
228
+ lines.push('</details>');
74
229
  }
75
- this.context.stdout.write('\nNo differences.\n');
76
- return 0;
230
+ return lines.join('\n');
77
231
  }
78
232
  }
79
- function buffersEqual(a, b) {
80
- if (a.length !== b.length)
81
- return false;
82
- for (let i = 0; i < a.length; i++) {
83
- if (a[i] !== b[i])
84
- return false;
233
+ async function listPngFiles(dir) {
234
+ try {
235
+ const entries = await fs.readdir(dir, { recursive: true });
236
+ const results = [];
237
+ for (const entry of entries) {
238
+ if (entry.endsWith('.png')) {
239
+ results.push(entry.split(path.sep).join('/'));
240
+ }
241
+ }
242
+ return results;
85
243
  }
86
- return true;
244
+ catch {
245
+ return [];
246
+ }
247
+ }
248
+ function matchGlob(fixtureId, pattern) {
249
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
250
+ return regex.test(fixtureId);
87
251
  }
88
252
 
89
253
  export { CompareCommand };
@@ -1 +1 @@
1
- {"version":3,"file":"compareCommand.js","sources":["../../src/commands/compareCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compareCommand.js","sources":["../../src/commands/compareCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { Command } from 'clipanion';
2
2
  export declare class McpCommand extends Command {
3
3
  static paths: string[][];
4
4
  static usage: import("clipanion").Usage;
5
- readonly config: string;
5
+ readonly project: string;
6
6
  execute(): Promise<void>;
7
7
  }
8
8
  //# sourceMappingURL=mcpCommand.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcpCommand.d.ts","sourceRoot":"","sources":["../../src/commands/mcpCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,qBAAa,UAAW,SAAQ,OAAO;IACtC,OAAgB,KAAK,aAAa;IAElC,OAAgB,KAAK,4BAKlB;IAEH,QAAQ,CAAC,MAAM,SAA8F;IAEvG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ9B"}
1
+ {"version":3,"file":"mcpCommand.d.ts","sourceRoot":"","sources":["../../src/commands/mcpCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAK5C,qBAAa,UAAW,SAAQ,OAAO;IACtC,OAAgB,KAAK,aAAa;IAElC,OAAgB,KAAK,4BAKlB;IAEH,QAAQ,CAAC,OAAO,SAA2I;IAErJ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAc9B"}
@@ -1,19 +1,25 @@
1
1
  import { Command, Option } from 'clipanion';
2
2
  import { ensureDaemon } from '../daemon/lifecycle.js';
3
3
  import { ComponentExplorerMcpServer } from '../mcp/McpServer.js';
4
+ import { resolveProject } from '../resolveProject.js';
4
5
 
5
6
  class McpCommand extends Command {
6
7
  static paths = [['mcp']];
7
8
  static usage = Command.Usage({
8
9
  description: 'Start an MCP server over stdio. Auto-starts a daemon if not already running.',
9
10
  examples: [
10
- ['Start MCP server', '$0 mcp -c config.json'],
11
+ ['Start MCP server', '$0 mcp --project config.json'],
11
12
  ],
12
13
  });
13
- config = Option.String('-c,--config', { required: true, description: 'Path to watch config JSON' });
14
+ project = Option.String('-p,--project,-c', { required: true, description: 'Project: a directory, vite config file, or component-explorer.json' });
14
15
  async execute() {
16
+ const resolved = await resolveProject(this.project);
17
+ if (resolved.kind !== 'explorerConfig') {
18
+ this.context.stderr.write('Error: mcp requires a component-explorer.json config file.\n');
19
+ return;
20
+ }
15
21
  // Ensure daemon is running (auto-starts in background if needed)
16
- const daemon = await ensureDaemon(this.config);
22
+ const daemon = await ensureDaemon(resolved.configPath);
17
23
  // Create and connect the MCP server over stdio
18
24
  const mcpServer = new ComponentExplorerMcpServer(daemon);
19
25
  await mcpServer.connect();
@@ -1 +1 @@
1
- {"version":3,"file":"mcpCommand.js","sources":["../../src/commands/mcpCommand.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIM,MAAO,UAAW,SAAQ,OAAO,CAAA;IACtC,OAAgB,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjC,IAAA,OAAgB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AACrC,QAAA,WAAW,EAAE,8EAA8E;AAC3F,QAAA,QAAQ,EAAE;YACT,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;AAC7C,SAAA;AACD,KAAA,CAAC;AAEO,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;AAE5G,IAAA,MAAM,OAAO,GAAA;;QAEZ,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG9C,QAAA,MAAM,SAAS,GAAG,IAAI,0BAA0B,CAAC,MAAM,CAAC;AACxD,QAAA,MAAM,SAAS,CAAC,OAAO,EAAE;IAC1B;;;;;"}
1
+ {"version":3,"file":"mcpCommand.js","sources":["../../src/commands/mcpCommand.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAKM,MAAO,UAAW,SAAQ,OAAO,CAAA;IACtC,OAAgB,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjC,IAAA,OAAgB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AACrC,QAAA,WAAW,EAAE,8EAA8E;AAC3F,QAAA,QAAQ,EAAE;YACT,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;AACpD,SAAA;AACD,KAAA,CAAC;AAEO,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oEAAoE,EAAE,CAAC;AAE1J,IAAA,MAAM,OAAO,GAAA;QACZ,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AACnD,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,gBAAgB,EAAE;YACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC;YACzF;QACD;;QAGA,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;;AAGtD,QAAA,MAAM,SAAS,GAAG,IAAI,0BAA0B,CAAC,MAAM,CAAC;AACxD,QAAA,MAAM,SAAS,CAAC,OAAO,EAAE;IAC1B;;;;;"}
@@ -5,7 +5,12 @@ export declare class ScreenshotCommand extends Command {
5
5
  readonly verbose: number;
6
6
  readonly filter: string | undefined;
7
7
  readonly accept: boolean;
8
- readonly root: string;
9
- execute(): Promise<void>;
8
+ readonly project: string;
9
+ readonly target: string | undefined;
10
+ readonly compare: boolean;
11
+ readonly compareTarget: string | undefined;
12
+ readonly report: string | undefined;
13
+ execute(): Promise<number>;
14
+ private _runComparison;
10
15
  }
11
16
  //# sourceMappingURL=screenshotCommand.d.ts.map