@wasao/kagemusha 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +497 -58
  2. package/dist/commands/add.d.ts +6 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +26 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/capture.d.ts +4 -2
  7. package/dist/commands/capture.d.ts.map +1 -1
  8. package/dist/commands/capture.js +236 -11
  9. package/dist/commands/capture.js.map +1 -1
  10. package/dist/commands/discover.d.ts +2 -0
  11. package/dist/commands/discover.d.ts.map +1 -0
  12. package/dist/commands/discover.js +62 -0
  13. package/dist/commands/discover.js.map +1 -0
  14. package/dist/commands/edit.d.ts +6 -0
  15. package/dist/commands/edit.d.ts.map +1 -0
  16. package/dist/commands/edit.js +120 -0
  17. package/dist/commands/edit.js.map +1 -0
  18. package/dist/commands/init.d.ts +1 -1
  19. package/dist/commands/init.d.ts.map +1 -1
  20. package/dist/commands/init.js +220 -118
  21. package/dist/commands/init.js.map +1 -1
  22. package/dist/commands/list.d.ts +2 -0
  23. package/dist/commands/list.d.ts.map +1 -0
  24. package/dist/commands/list.js +33 -0
  25. package/dist/commands/list.js.map +1 -0
  26. package/dist/commands/login.d.ts +6 -0
  27. package/dist/commands/login.d.ts.map +1 -0
  28. package/dist/commands/login.js +142 -0
  29. package/dist/commands/login.js.map +1 -0
  30. package/dist/commands/validate.js +1 -1
  31. package/dist/commands/validate.js.map +1 -1
  32. package/dist/editor/inject-script.d.ts +2 -0
  33. package/dist/editor/inject-script.d.ts.map +1 -0
  34. package/dist/editor/inject-script.js +768 -0
  35. package/dist/editor/inject-script.js.map +1 -0
  36. package/dist/index.js +32 -20
  37. package/dist/index.js.map +1 -1
  38. package/dist/lib/annotate.d.ts +2 -2
  39. package/dist/lib/annotate.d.ts.map +1 -1
  40. package/dist/lib/annotate.js +36 -44
  41. package/dist/lib/annotate.js.map +1 -1
  42. package/dist/lib/auth.d.ts +18 -0
  43. package/dist/lib/auth.d.ts.map +1 -0
  44. package/dist/lib/auth.js +45 -0
  45. package/dist/lib/auth.js.map +1 -0
  46. package/dist/lib/aws-error.d.ts +7 -0
  47. package/dist/lib/aws-error.d.ts.map +1 -0
  48. package/dist/lib/aws-error.js +74 -0
  49. package/dist/lib/aws-error.js.map +1 -0
  50. package/dist/lib/canonical.d.ts +22 -0
  51. package/dist/lib/canonical.d.ts.map +1 -0
  52. package/dist/lib/canonical.js +92 -0
  53. package/dist/lib/canonical.js.map +1 -0
  54. package/dist/lib/config.d.ts +2 -0
  55. package/dist/lib/config.d.ts.map +1 -1
  56. package/dist/lib/config.js +23 -13
  57. package/dist/lib/config.js.map +1 -1
  58. package/dist/lib/crawl.d.ts +1 -1
  59. package/dist/lib/crawl.d.ts.map +1 -1
  60. package/dist/lib/crawl.js +213 -20
  61. package/dist/lib/crawl.js.map +1 -1
  62. package/dist/lib/definition.d.ts +2 -0
  63. package/dist/lib/definition.d.ts.map +1 -0
  64. package/dist/lib/definition.js +6 -0
  65. package/dist/lib/definition.js.map +1 -0
  66. package/dist/lib/diff.d.ts +52 -0
  67. package/dist/lib/diff.d.ts.map +1 -0
  68. package/dist/lib/diff.js +41 -0
  69. package/dist/lib/diff.js.map +1 -0
  70. package/dist/lib/login-error.d.ts +10 -0
  71. package/dist/lib/login-error.d.ts.map +1 -0
  72. package/dist/lib/login-error.js +13 -0
  73. package/dist/lib/login-error.js.map +1 -0
  74. package/dist/lib/screenshot.d.ts +8 -2
  75. package/dist/lib/screenshot.d.ts.map +1 -1
  76. package/dist/lib/screenshot.js +44 -61
  77. package/dist/lib/screenshot.js.map +1 -1
  78. package/dist/lib/staging.d.ts +8 -0
  79. package/dist/lib/staging.d.ts.map +1 -0
  80. package/dist/lib/staging.js +24 -0
  81. package/dist/lib/staging.js.map +1 -0
  82. package/dist/types.d.ts +5 -23
  83. package/dist/types.d.ts.map +1 -1
  84. package/package.json +18 -11
  85. package/dist/commands/preview.d.ts +0 -6
  86. package/dist/commands/preview.d.ts.map +0 -1
  87. package/dist/commands/preview.js +0 -33
  88. package/dist/commands/preview.js.map +0 -1
  89. package/dist/commands/run.d.ts +0 -6
  90. package/dist/commands/run.d.ts.map +0 -1
  91. package/dist/commands/run.js +0 -39
  92. package/dist/commands/run.js.map +0 -1
  93. package/dist/lib/upload.d.ts +0 -9
  94. package/dist/lib/upload.d.ts.map +0 -1
  95. package/dist/lib/upload.js +0 -43
  96. package/dist/lib/upload.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACd;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC3E"}
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAsBA,UAAU,cAAc;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA+CD,eAAO,MAAM,cAAc,GAC1B,SAAS,cAAc,KACrB,OAAO,CAAC,IAAI,CAUd,CAAC"}
@@ -1,9 +1,56 @@
1
+ import { spawn } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
1
4
  import chalk from "chalk";
2
- import { annotateScreenshots } from "../lib/annotate.js";
5
+ import { hasAuthState, resolveLoginScriptPath } from "../lib/auth.js";
6
+ import { handleAwsError } from "../lib/aws-error.js";
7
+ import { createS3Canonical, getCanonicalPath, getOutputDir, } from "../lib/canonical.js";
3
8
  import { findProjectRoot, loadConfig, loadDefinitions } from "../lib/config.js";
9
+ import { diffImages } from "../lib/diff.js";
4
10
  import { captureScreenshots } from "../lib/screenshot.js";
5
- export async function captureCommand(options) {
6
- console.log(chalk.bold("\n🄷 Kagemusha — Capture screenshots\n"));
11
+ import { cleanupStaging, ensureStagingDirs, getReportDiffPath, getStagingDir, getStagingPath, } from "../lib/staging.js";
12
+ // Schema version of `reports/summary.json`. Bump on any breaking change.
13
+ const SUMMARY_SCHEMA_VERSION = "1";
14
+ const writeSummaryReport = (projectRoot, report) => {
15
+ const reportPath = path.join(projectRoot, "reports", "summary.json");
16
+ fs.mkdirSync(path.dirname(reportPath), { recursive: true });
17
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));
18
+ };
19
+ // Open a file with the OS's default viewer (Preview on macOS, etc.).
20
+ // `detached + unref` lets the kagemusha process exit while the viewer keeps
21
+ // running. We deliberately avoid `shell: true` so paths with spaces don't get
22
+ // re-split — argv is passed straight through to the program.
23
+ const openInDefaultApp = (filePath) => {
24
+ if (process.platform === "darwin") {
25
+ spawn("open", [filePath], { detached: true, stdio: "ignore" }).unref();
26
+ }
27
+ else if (process.platform === "win32") {
28
+ // `start` is a cmd.exe builtin; we invoke cmd directly. The empty
29
+ // string after `start` is the (required) window title placeholder.
30
+ spawn("cmd", ["/c", "start", "", filePath], {
31
+ detached: true,
32
+ stdio: "ignore",
33
+ }).unref();
34
+ }
35
+ else {
36
+ spawn("xdg-open", [filePath], { detached: true, stdio: "ignore" }).unref();
37
+ }
38
+ };
39
+ export const captureCommand = async (options) => {
40
+ try {
41
+ await runCapture(options);
42
+ }
43
+ catch (e) {
44
+ if (handleAwsError(e)) {
45
+ process.exitCode = 1;
46
+ return;
47
+ }
48
+ throw e;
49
+ }
50
+ };
51
+ const runCapture = async (options) => {
52
+ const dryRun = options.dryRun === true;
53
+ console.log(chalk.bold(`\n🄷 Kagemusha — Capture${dryRun ? " (dry-run)" : ""}\n`));
7
54
  const projectRoot = findProjectRoot();
8
55
  const config = loadConfig(projectRoot);
9
56
  let definitions = loadDefinitions(projectRoot);
@@ -12,16 +59,194 @@ export async function captureCommand(options) {
12
59
  definitions = definitions.filter((d) => ids.includes(d.id));
13
60
  }
14
61
  if (definitions.length === 0) {
15
- console.log(chalk.yellow("No screenshot definitions found."));
62
+ console.log(chalk.yellow("No screenshot definitions to capture.\n"));
16
63
  return;
17
64
  }
18
- console.log(chalk.blue(`šŸ“ø Capturing ${definitions.length} screenshot(s)...`));
19
- const results = await captureScreenshots(config, definitions, projectRoot);
20
- console.log(chalk.blue("šŸŽØ Drawing annotations..."));
21
- await annotateScreenshots(definitions, results, projectRoot);
22
- console.log(chalk.bold.green(`\nāœ… Done! Screenshots saved to screenshots/\n`));
65
+ // Auto-login: if a login script exists (auth.scriptPath, or default
66
+ // .kagemusha/login.mjs) but no saved session is on disk, run it before
67
+ // capturing. This is what makes CI work with no pre-baked storage state.
68
+ if (!hasAuthState(projectRoot) &&
69
+ resolveLoginScriptPath(config, projectRoot)) {
70
+ console.log(chalk.blue("šŸ” No saved session found, running login script...\n"));
71
+ const { loginCommand } = await import("./login.js");
72
+ await loginCommand();
73
+ // loginCommand absorbs LoginError and sets exitCode internally.
74
+ // If no auth-state was produced, abort capture so we don't screenshot
75
+ // the login screen.
76
+ if (!hasAuthState(projectRoot)) {
77
+ process.exitCode = 1;
78
+ return;
79
+ }
80
+ }
81
+ ensureStagingDirs(projectRoot);
82
+ const threshold = options.threshold
83
+ ? Number.parseFloat(options.threshold)
84
+ : (config.screenshot.defaultDiffThreshold ?? 0.005);
85
+ const remote = createS3Canonical(config);
86
+ const outputDir = getOutputDir(config, projectRoot);
87
+ const stagingDir = getStagingDir(projectRoot);
88
+ if (remote) {
89
+ console.log(chalk.gray(` canonical: ${remote.label()}`));
90
+ }
91
+ else {
92
+ console.log(chalk.gray(` canonical: ${outputDir} (local)`));
93
+ }
94
+ // 1. Capture into staging (annotated)
95
+ console.log(chalk.blue(`\nšŸ“ø Capturing ${definitions.length} screenshot(s) to staging...\n`));
96
+ const failures = await captureScreenshots(config, definitions, projectRoot, {
97
+ outputDir: stagingDir,
98
+ });
99
+ const failureReasons = new Map(failures.map((f) => [f.id, f.reason]));
100
+ // 2. Diff each staging vs canonical
101
+ const results = [];
102
+ // Track final paths (where the user can find each capture after the run)
103
+ const finalPathFor = new Map();
104
+ const promote = async (id, stagingPath, canonicalPath) => {
105
+ fs.mkdirSync(outputDir, { recursive: true });
106
+ // Push to remote first so a failure doesn't leave local ahead of S3
107
+ if (remote) {
108
+ await remote.push(id, stagingPath);
109
+ }
110
+ fs.copyFileSync(stagingPath, canonicalPath);
111
+ fs.rmSync(stagingPath, { force: true });
112
+ finalPathFor.set(id, canonicalPath);
113
+ };
114
+ // Either copy staging → canonical (default), or just remember the staging
115
+ // path so the user can inspect it (dry-run).
116
+ const applyOrStage = async (id, stagingPath, canonicalPath) => {
117
+ if (dryRun) {
118
+ finalPathFor.set(id, stagingPath);
119
+ }
120
+ else {
121
+ await promote(id, stagingPath, canonicalPath);
122
+ }
123
+ };
124
+ for (const def of definitions) {
125
+ const canonicalPath = getCanonicalPath(config, projectRoot, def.id);
126
+ const stagingPath = getStagingPath(projectRoot, def.id);
127
+ const diffPath = getReportDiffPath(projectRoot, def.id);
128
+ if (!fs.existsSync(stagingPath)) {
129
+ results.push({
130
+ id: def.id,
131
+ status: "missing",
132
+ reason: failureReasons.get(def.id),
133
+ });
134
+ continue;
135
+ }
136
+ // Pull canonical from remote (S3) into outputDir; for local mode just check existence
137
+ const fetchResult = remote
138
+ ? await remote.fetch(def.id, canonicalPath)
139
+ : fs.existsSync(canonicalPath)
140
+ ? "ok"
141
+ : "not-found";
142
+ // New: no canonical yet — adopt staging as canonical (unless dry-run)
143
+ if (fetchResult === "not-found") {
144
+ await applyOrStage(def.id, stagingPath, canonicalPath);
145
+ results.push({ id: def.id, status: "new" });
146
+ continue;
147
+ }
148
+ const result = await diffImages(canonicalPath, stagingPath, diffPath);
149
+ if (result.match) {
150
+ results.push({ id: def.id, status: "unchanged" });
151
+ fs.rmSync(diffPath, { force: true });
152
+ fs.rmSync(stagingPath, { force: true });
153
+ finalPathFor.set(def.id, canonicalPath);
154
+ }
155
+ else if (result.reason === "layout-diff") {
156
+ await applyOrStage(def.id, stagingPath, canonicalPath);
157
+ results.push({
158
+ id: def.id,
159
+ status: "changed",
160
+ reason: "layout-diff",
161
+ canonical: result.canonical,
162
+ staging: result.staging,
163
+ });
164
+ }
165
+ else {
166
+ await applyOrStage(def.id, stagingPath, canonicalPath);
167
+ results.push({
168
+ id: def.id,
169
+ status: "changed",
170
+ reason: "pixel-diff",
171
+ diffPercentage: result.diffPercentage,
172
+ diffPath,
173
+ });
174
+ }
175
+ }
176
+ // 3. Print summary
177
+ const changed = results.filter((r) => r.status === "changed");
178
+ const unchanged = results.filter((r) => r.status === "unchanged");
179
+ const newly = results.filter((r) => r.status === "new");
180
+ const missing = results.filter((r) => r.status === "missing");
23
181
  for (const r of results) {
24
- console.log(chalk.gray(` ${r.id} → ${r.rawPath}`));
182
+ if (r.status === "unchanged") {
183
+ console.log(chalk.gray(` āœ“ ${r.id}`));
184
+ }
185
+ else if (r.status === "new") {
186
+ const action = dryRun ? "would be added" : "added to canonical";
187
+ console.log(chalk.cyan(` + ${r.id} (${action})`));
188
+ }
189
+ else if (r.status === "missing") {
190
+ const detail = r.reason ? `: ${r.reason}` : "";
191
+ console.log(chalk.red(` āœ— ${r.id} (capture failed${detail})`));
192
+ }
193
+ else if (r.status === "changed") {
194
+ const detail = r.reason === "pixel-diff"
195
+ ? `${r.diffPercentage.toFixed(2)}%`
196
+ : `layout-diff: ${r.canonical.width}Ɨ${r.canonical.height} → ${r.staging.width}Ɨ${r.staging.height}`;
197
+ const action = dryRun ? "→ would update" : "→ updated";
198
+ console.log(chalk.yellow(` ~ ${r.id} (${detail}) ${chalk.gray(action)}`));
199
+ if (r.reason === "pixel-diff") {
200
+ console.log(chalk.gray(` ↳ ${r.diffPath}`));
201
+ }
202
+ }
203
+ }
204
+ // 4. Cleanup staging — applied entries are already removed individually,
205
+ // so this only matters when nothing changed (everything was unchanged).
206
+ if (changed.length === 0 && newly.length === 0) {
207
+ cleanupStaging(projectRoot);
208
+ }
209
+ console.log("");
210
+ console.log(chalk.bold(`changed: ${changed.length} / unchanged: ${unchanged.length} / new: ${newly.length}` +
211
+ (missing.length > 0 ? ` / missing: ${missing.length}` : "")));
212
+ if (dryRun && (changed.length > 0 || newly.length > 0)) {
213
+ console.log(chalk.gray(`\nDrop --dry-run to update canonical${remote ? ` (${remote.label()})` : ""}.`));
214
+ }
215
+ // 5. Write the structured report.
216
+ // `reports/summary.json` is part of kagemusha's PUBLIC API — see README
217
+ // "Notifications" section. Bump `schemaVersion` (or kagemusha major) on
218
+ // breaking changes to the shape.
219
+ writeSummaryReport(projectRoot, {
220
+ schemaVersion: SUMMARY_SCHEMA_VERSION,
221
+ timestamp: new Date().toISOString(),
222
+ dryRun,
223
+ canonical: remote ? remote.label() : `${outputDir} (local)`,
224
+ counts: {
225
+ changed: changed.length,
226
+ unchanged: unchanged.length,
227
+ new: newly.length,
228
+ missing: missing.length,
229
+ },
230
+ results,
231
+ });
232
+ // 6. Open changed/new results in default viewer
233
+ if (options.open) {
234
+ for (const r of [...changed, ...newly]) {
235
+ const p = finalPathFor.get(r.id);
236
+ if (p && fs.existsSync(p)) {
237
+ openInDefaultApp(p);
238
+ }
239
+ }
240
+ }
241
+ // Exit code: 1 if dry-run found pixel diffs over threshold (CI gate use case)
242
+ if (dryRun) {
243
+ const overThreshold = changed.filter((r) => r.status === "changed" &&
244
+ r.reason === "pixel-diff" &&
245
+ r.diffPercentage / 100 > threshold);
246
+ if (overThreshold.length > 0) {
247
+ process.exitCode = 1;
248
+ }
25
249
  }
26
- }
250
+ console.log("");
251
+ };
27
252
  //# sourceMappingURL=capture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAO1D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAElE,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC9D,OAAO;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CAAC,gBAAgB,WAAW,CAAC,MAAM,mBAAmB,CAAC,CACjE,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAE3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrD,MAAM,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAE7D,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,+CAA+C,CAAC,CACjE,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const discoverCommand: () => Promise<void>;
2
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,IAAI,CAsEpD,CAAC"}
@@ -0,0 +1,62 @@
1
+ import chalk from "chalk";
2
+ import { findProjectRoot, loadConfig, loadDefinitions, saveDefinitions, } from "../lib/config.js";
3
+ import { discoverPages } from "../lib/crawl.js";
4
+ import { deriveIdFromPath } from "../lib/definition.js";
5
+ export const discoverCommand = async () => {
6
+ console.log(chalk.bold("\n🄷 Kagemusha — Discover Pages\n"));
7
+ const projectRoot = findProjectRoot();
8
+ const config = loadConfig(projectRoot);
9
+ console.log(chalk.blue(`šŸ” Crawling ${config.app.baseUrl} for pages...\n`));
10
+ let pages = [];
11
+ try {
12
+ pages = await discoverPages(config.app.baseUrl, projectRoot);
13
+ }
14
+ catch (e) {
15
+ console.log(chalk.red(`\nāŒ Failed to crawl: ${e instanceof Error ? e.message : e}\n`));
16
+ return;
17
+ }
18
+ if (pages.length === 0) {
19
+ console.log(chalk.yellow("\n⚠ No pages discovered.\n"));
20
+ return;
21
+ }
22
+ console.log(chalk.green(`\n Found ${pages.length} page(s)\n`));
23
+ const inquirer = await import("inquirer");
24
+ const { selected } = await inquirer.default.prompt({
25
+ type: "checkbox",
26
+ name: "selected",
27
+ message: `Select pages to add (${pages.length} found):`,
28
+ choices: pages.map((p) => ({
29
+ name: `${p.path} ${chalk.gray(p.title)}`,
30
+ value: p.path,
31
+ checked: true,
32
+ })),
33
+ pageSize: 30,
34
+ loop: false,
35
+ });
36
+ // Clear inquirer's verbose answer output
37
+ process.stdout.write("\x1B[1A\x1B[2K");
38
+ if (selected.length === 0) {
39
+ console.log(chalk.yellow("\n⚠ No pages selected.\n"));
40
+ return;
41
+ }
42
+ const definitions = loadDefinitions(projectRoot);
43
+ const existingIds = new Set(definitions.map((d) => d.id));
44
+ let added = 0;
45
+ for (const pagePath of selected) {
46
+ const id = deriveIdFromPath(pagePath);
47
+ if (existingIds.has(id))
48
+ continue;
49
+ definitions.push({
50
+ id,
51
+ name: id,
52
+ url: pagePath,
53
+ capture: { mode: "fullPage" },
54
+ hideElements: [],
55
+ decorations: [],
56
+ });
57
+ added++;
58
+ }
59
+ saveDefinitions(definitions, projectRoot);
60
+ console.log(chalk.bold.green(`āœ… Added ${added} new definition(s)\n`));
61
+ };
62
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACN,eAAe,EACf,UAAU,EACV,eAAe,EACf,eAAe,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,IAAmB,EAAE;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC;IAE5E,IAAI,KAAK,GAAsC,EAAE,CAAC;IAClD,IAAI,CAAC;QACJ,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CACR,wBAAwB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAC9D,CACD,CAAC;QACF,OAAO;IACR,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACxD,OAAO;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAyB;QAC1E,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,wBAAwB,KAAK,CAAC,MAAM,UAAU;QACvD,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;YACzC,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QACH,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,KAAK;KACX,CAAC,CAAC;IAEH,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACtD,OAAO;IACR,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAElC,WAAW,CAAC,IAAI,CAAC;YAChB,EAAE;YACF,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;YAC7B,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,EAAE;SACf,CAAC,CAAC;QACH,KAAK,EAAE,CAAC;IACT,CAAC;IAED,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,sBAAsB,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface EditOptions {
2
+ id?: string;
3
+ }
4
+ export declare function editCommand(options: EditOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAaA,UAAU,WAAW;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAUD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgJrE"}
@@ -0,0 +1,120 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import chalk from "chalk";
5
+ import { defaultContextOptions } from "../lib/auth.js";
6
+ import { findProjectRoot, loadConfig, loadDefinitions, saveDefinitions, } from "../lib/config.js";
7
+ const loadEditorScript = () => {
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ const scriptPath = path.join(__dirname, "..", "editor", "inject-script.js");
10
+ return fs
11
+ .readFileSync(scriptPath, "utf-8")
12
+ .replace(/^export\s*\{\s*\};?\s*$/m, "");
13
+ };
14
+ export async function editCommand(options) {
15
+ console.log(chalk.bold("\n🄷 Kagemusha — Annotation Editor\n"));
16
+ const projectRoot = findProjectRoot();
17
+ const config = loadConfig(projectRoot);
18
+ let definitions = loadDefinitions(projectRoot);
19
+ if (options.id) {
20
+ definitions = definitions.filter((d) => d.id === options.id);
21
+ }
22
+ if (definitions.length === 0) {
23
+ console.log(chalk.red("No definitions found."));
24
+ return;
25
+ }
26
+ if (definitions.length > 1) {
27
+ const inquirer = await import("inquirer");
28
+ const { selected } = await inquirer.default.prompt({
29
+ type: "list",
30
+ name: "selected",
31
+ message: "Which page to edit?",
32
+ choices: definitions.map((d) => ({ name: d.id, value: d.id })),
33
+ });
34
+ definitions = definitions.filter((d) => d.id === selected);
35
+ }
36
+ const def = definitions[0];
37
+ const { chromium } = await import("playwright-chromium");
38
+ const browser = await chromium.launch({
39
+ headless: false,
40
+ args: ["--start-maximized"],
41
+ });
42
+ const context = await browser.newContext(defaultContextOptions(config, projectRoot));
43
+ const page = await context.newPage();
44
+ // Maximize the OS window via CDP — `--start-maximized` is a hint that
45
+ // macOS often ignores. CDP's setWindowBounds is authoritative.
46
+ const cdp = await context.newCDPSession(page);
47
+ try {
48
+ const { windowId } = (await cdp.send("Browser.getWindowForTarget"));
49
+ await cdp.send("Browser.setWindowBounds", {
50
+ windowId,
51
+ bounds: { windowState: "maximized" },
52
+ });
53
+ }
54
+ catch {
55
+ // CDP unavailable on some channels — fall through with default size
56
+ }
57
+ const urlPath = def.url.replace(/\{(\w+)\}/g, (_, key) => def.urlParams?.[key] ?? "");
58
+ const fullUrl = new URL(urlPath, config.app.baseUrl).toString();
59
+ console.log(chalk.blue(`🌐 Opening ${fullUrl}...`));
60
+ await page.goto(fullUrl, { waitUntil: "networkidle" });
61
+ if (def.hideElements?.length) {
62
+ for (const selector of def.hideElements) {
63
+ await page.evaluate((sel) => {
64
+ document.querySelectorAll(sel).forEach((el) => {
65
+ el.style.display = "none";
66
+ });
67
+ }, selector);
68
+ }
69
+ }
70
+ // Expose save function from Node.js to browser
71
+ let savedCount = 0;
72
+ let saveResolve;
73
+ const savePromise = new Promise((resolve) => {
74
+ saveResolve = resolve;
75
+ });
76
+ // Expose save function BEFORE injecting script
77
+ await page.exposeFunction("__kagemusha_save", (payloadJson) => {
78
+ const payload = JSON.parse(payloadJson);
79
+ savedCount = payload.decorations?.length ?? 0;
80
+ // Update this definition in the full list and save
81
+ const allDefs = loadDefinitions(projectRoot);
82
+ const idx = allDefs.findIndex((d) => d.id === def.id);
83
+ if (idx >= 0) {
84
+ allDefs[idx] = {
85
+ ...def,
86
+ decorations: payload.decorations,
87
+ capture: payload.capture,
88
+ };
89
+ }
90
+ saveDefinitions(allDefs, projectRoot);
91
+ saveResolve();
92
+ });
93
+ // Inject editor script — DPR is read from window.devicePixelRatio inside,
94
+ // which matches the value set on the browser context above.
95
+ const editorScript = loadEditorScript();
96
+ await page.evaluate(editorScript);
97
+ // Load existing annotations (script is now loaded)
98
+ if (def.decorations?.length) {
99
+ await page.evaluate((decs) => {
100
+ window.__kagemusha_loadAnnotations(decs);
101
+ }, def.decorations);
102
+ }
103
+ // Load existing capture config
104
+ await page.evaluate((cap) => {
105
+ window.__kagemusha_loadCapture(cap);
106
+ }, def.capture);
107
+ console.log(chalk.blue("šŸŽØ Editor ready. Draw annotations, then click Save.\n"));
108
+ // Wait for save or browser close
109
+ try {
110
+ await savePromise;
111
+ }
112
+ catch {
113
+ console.log(chalk.yellow("\n⚠ Editor closed without saving.\n"));
114
+ await browser.close().catch(() => { });
115
+ return;
116
+ }
117
+ await browser.close();
118
+ console.log(chalk.bold.green(`\nāœ… Saved ${savedCount} annotation(s) for ${def.id}\n`));
119
+ }
120
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare function initCommand(): Promise<void>;
1
+ export declare const initCommand: () => Promise<void>;
2
2
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAwQjD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAmQhD,CAAC"}