@wasao/kagemusha 0.2.0 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -453
- package/dist/commands/capture.js +57 -35
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/edit.d.ts +1 -1
- package/dist/commands/edit.d.ts.map +1 -1
- package/dist/commands/edit.js +46 -8
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +82 -83
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +14 -18
- package/dist/commands/login.js.map +1 -1
- package/dist/editor/inject-script/annotations.d.ts +11 -0
- package/dist/editor/inject-script/annotations.d.ts.map +1 -0
- package/dist/editor/inject-script/annotations.js +409 -0
- package/dist/editor/inject-script/annotations.js.map +1 -0
- package/dist/editor/inject-script/bridge.d.ts +13 -0
- package/dist/editor/inject-script/bridge.d.ts.map +1 -0
- package/dist/editor/inject-script/bridge.js +33 -0
- package/dist/editor/inject-script/bridge.js.map +1 -0
- package/dist/editor/inject-script/crop.d.ts +9 -0
- package/dist/editor/inject-script/crop.d.ts.map +1 -0
- package/dist/editor/inject-script/crop.js +236 -0
- package/dist/editor/inject-script/crop.js.map +1 -0
- package/dist/editor/inject-script/dom.d.ts +7 -0
- package/dist/editor/inject-script/dom.d.ts.map +1 -0
- package/dist/editor/inject-script/dom.js +32 -0
- package/dist/editor/inject-script/dom.js.map +1 -0
- package/dist/editor/inject-script/index.d.ts +2 -0
- package/dist/editor/inject-script/index.d.ts.map +1 -0
- package/dist/editor/inject-script/index.js +56 -0
- package/dist/editor/inject-script/index.js.map +1 -0
- package/dist/editor/inject-script/record.d.ts +5 -0
- package/dist/editor/inject-script/record.d.ts.map +1 -0
- package/dist/editor/inject-script/record.js +398 -0
- package/dist/editor/inject-script/record.js.map +1 -0
- package/dist/editor/inject-script/selector.d.ts +6 -0
- package/dist/editor/inject-script/selector.d.ts.map +1 -0
- package/dist/editor/inject-script/selector.js +112 -0
- package/dist/editor/inject-script/selector.js.map +1 -0
- package/dist/editor/inject-script/state.d.ts +27 -0
- package/dist/editor/inject-script/state.d.ts.map +1 -0
- package/dist/editor/inject-script/state.js +26 -0
- package/dist/editor/inject-script/state.js.map +1 -0
- package/dist/editor/inject-script/svg.d.ts +7 -0
- package/dist/editor/inject-script/svg.d.ts.map +1 -0
- package/dist/editor/inject-script/svg.js +39 -0
- package/dist/editor/inject-script/svg.js.map +1 -0
- package/dist/editor/inject-script/toolbar.d.ts +14 -0
- package/dist/editor/inject-script/toolbar.d.ts.map +1 -0
- package/dist/editor/inject-script/toolbar.js +240 -0
- package/dist/editor/inject-script/toolbar.js.map +1 -0
- package/dist/editor/inject-script/types.d.ts +102 -0
- package/dist/editor/inject-script/types.d.ts.map +1 -0
- package/dist/editor/inject-script/types.js +5 -0
- package/dist/editor/inject-script/types.js.map +1 -0
- package/dist/editor/inject-script.js +1248 -699
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/canonical.d.ts +35 -3
- package/dist/lib/canonical.d.ts.map +1 -1
- package/dist/lib/canonical.js +85 -25
- package/dist/lib/canonical.js.map +1 -1
- package/dist/lib/crawl.js +1 -1
- package/dist/lib/crawl.js.map +1 -1
- package/dist/lib/diff.d.ts +23 -4
- package/dist/lib/diff.d.ts.map +1 -1
- package/dist/lib/diff.js +5 -6
- package/dist/lib/diff.js.map +1 -1
- package/dist/lib/page-ready.d.ts +18 -0
- package/dist/lib/page-ready.d.ts.map +1 -0
- package/dist/lib/page-ready.js +19 -0
- package/dist/lib/page-ready.js.map +1 -0
- package/dist/lib/playwright-launch.d.ts +4 -0
- package/dist/lib/playwright-launch.d.ts.map +1 -0
- package/dist/lib/playwright-launch.js +11 -0
- package/dist/lib/playwright-launch.js.map +1 -0
- package/dist/lib/screenshot.d.ts +4 -1
- package/dist/lib/screenshot.d.ts.map +1 -1
- package/dist/lib/screenshot.js +37 -7
- package/dist/lib/screenshot.js.map +1 -1
- package/dist/lib/staging.d.ts +0 -1
- package/dist/lib/staging.d.ts.map +1 -1
- package/dist/lib/staging.js +0 -3
- package/dist/lib/staging.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +22 -12
- package/templates/notify-slack.jq +30 -0
- package/dist/editor/inject-script.d.ts +0 -2
- package/dist/editor/inject-script.d.ts.map +0 -1
- package/dist/editor/inject-script.js.map +0 -1
package/dist/commands/capture.js
CHANGED
|
@@ -8,7 +8,7 @@ import { createS3Canonical, getCanonicalPath, getOutputDir, } from "../lib/canon
|
|
|
8
8
|
import { findProjectRoot, loadConfig, loadDefinitions } from "../lib/config.js";
|
|
9
9
|
import { diffImages } from "../lib/diff.js";
|
|
10
10
|
import { captureScreenshots } from "../lib/screenshot.js";
|
|
11
|
-
import { cleanupStaging, ensureStagingDirs,
|
|
11
|
+
import { cleanupStaging, ensureStagingDirs, getStagingDir, getStagingPath, } from "../lib/staging.js";
|
|
12
12
|
// Schema version of `reports/summary.json`. Bump on any breaking change.
|
|
13
13
|
const SUMMARY_SCHEMA_VERSION = "1";
|
|
14
14
|
const writeSummaryReport = (projectRoot, report) => {
|
|
@@ -97,34 +97,13 @@ const runCapture = async (options) => {
|
|
|
97
97
|
outputDir: stagingDir,
|
|
98
98
|
});
|
|
99
99
|
const failureReasons = new Map(failures.map((f) => [f.id, f.reason]));
|
|
100
|
-
// 2. Diff each staging vs canonical
|
|
101
100
|
const results = [];
|
|
102
101
|
// Track final paths (where the user can find each capture after the run)
|
|
103
102
|
const finalPathFor = new Map();
|
|
104
|
-
const
|
|
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
|
-
};
|
|
103
|
+
const pendingPushes = [];
|
|
124
104
|
for (const def of definitions) {
|
|
125
105
|
const canonicalPath = getCanonicalPath(config, projectRoot, def.id);
|
|
126
106
|
const stagingPath = getStagingPath(projectRoot, def.id);
|
|
127
|
-
const diffPath = getReportDiffPath(projectRoot, def.id);
|
|
128
107
|
if (!fs.existsSync(stagingPath)) {
|
|
129
108
|
results.push({
|
|
130
109
|
id: def.id,
|
|
@@ -139,40 +118,86 @@ const runCapture = async (options) => {
|
|
|
139
118
|
: fs.existsSync(canonicalPath)
|
|
140
119
|
? "ok"
|
|
141
120
|
: "not-found";
|
|
121
|
+
const queuePush = (push) => {
|
|
122
|
+
if (dryRun) {
|
|
123
|
+
finalPathFor.set(def.id, push.stagingPath);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
pendingPushes.push(push);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
142
129
|
// New: no canonical yet — adopt staging as canonical (unless dry-run)
|
|
143
130
|
if (fetchResult === "not-found") {
|
|
144
|
-
|
|
145
|
-
results.push(
|
|
131
|
+
const result = { id: def.id, status: "new" };
|
|
132
|
+
results.push(result);
|
|
133
|
+
queuePush({
|
|
134
|
+
id: def.id,
|
|
135
|
+
stagingPath,
|
|
136
|
+
canonicalPath,
|
|
137
|
+
onUrls: (urls) => {
|
|
138
|
+
if (urls)
|
|
139
|
+
result.urls = urls;
|
|
140
|
+
},
|
|
141
|
+
});
|
|
146
142
|
continue;
|
|
147
143
|
}
|
|
148
|
-
const result = await diffImages(canonicalPath, stagingPath
|
|
144
|
+
const result = await diffImages(canonicalPath, stagingPath);
|
|
149
145
|
if (result.match) {
|
|
150
146
|
results.push({ id: def.id, status: "unchanged" });
|
|
151
|
-
fs.rmSync(diffPath, { force: true });
|
|
152
147
|
fs.rmSync(stagingPath, { force: true });
|
|
153
148
|
finalPathFor.set(def.id, canonicalPath);
|
|
154
149
|
}
|
|
155
150
|
else if (result.reason === "layout-diff") {
|
|
156
|
-
|
|
157
|
-
results.push({
|
|
151
|
+
const item = {
|
|
158
152
|
id: def.id,
|
|
159
153
|
status: "changed",
|
|
160
154
|
reason: "layout-diff",
|
|
161
155
|
canonical: result.canonical,
|
|
162
156
|
staging: result.staging,
|
|
157
|
+
};
|
|
158
|
+
results.push(item);
|
|
159
|
+
queuePush({
|
|
160
|
+
id: def.id,
|
|
161
|
+
stagingPath,
|
|
162
|
+
canonicalPath,
|
|
163
|
+
onUrls: (urls) => {
|
|
164
|
+
if (urls)
|
|
165
|
+
item.urls = urls;
|
|
166
|
+
},
|
|
163
167
|
});
|
|
164
168
|
}
|
|
165
169
|
else {
|
|
166
|
-
|
|
167
|
-
results.push({
|
|
170
|
+
const item = {
|
|
168
171
|
id: def.id,
|
|
169
172
|
status: "changed",
|
|
170
173
|
reason: "pixel-diff",
|
|
171
174
|
diffPercentage: result.diffPercentage,
|
|
172
|
-
|
|
175
|
+
};
|
|
176
|
+
results.push(item);
|
|
177
|
+
queuePush({
|
|
178
|
+
id: def.id,
|
|
179
|
+
stagingPath,
|
|
180
|
+
canonicalPath,
|
|
181
|
+
onUrls: (urls) => {
|
|
182
|
+
if (urls)
|
|
183
|
+
item.urls = urls;
|
|
184
|
+
},
|
|
173
185
|
});
|
|
174
186
|
}
|
|
175
187
|
}
|
|
188
|
+
// Parallel promote — push to remote + copy to local outputDir.
|
|
189
|
+
// Promise.all keeps S3 throughput high while node manages local fs serially.
|
|
190
|
+
if (pendingPushes.length > 0) {
|
|
191
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
192
|
+
await Promise.all(pendingPushes.map(async ({ id, stagingPath, canonicalPath, onUrls }) => {
|
|
193
|
+
// Push to remote first so a failure doesn't leave local ahead of S3
|
|
194
|
+
const urls = remote ? await remote.push(id, stagingPath) : undefined;
|
|
195
|
+
fs.copyFileSync(stagingPath, canonicalPath);
|
|
196
|
+
fs.rmSync(stagingPath, { force: true });
|
|
197
|
+
finalPathFor.set(id, canonicalPath);
|
|
198
|
+
onUrls(urls);
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
176
201
|
// 3. Print summary
|
|
177
202
|
const changed = results.filter((r) => r.status === "changed");
|
|
178
203
|
const unchanged = results.filter((r) => r.status === "unchanged");
|
|
@@ -196,9 +221,6 @@ const runCapture = async (options) => {
|
|
|
196
221
|
: `layout-diff: ${r.canonical.width}×${r.canonical.height} → ${r.staging.width}×${r.staging.height}`;
|
|
197
222
|
const action = dryRun ? "→ would update" : "→ updated";
|
|
198
223
|
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
224
|
}
|
|
203
225
|
}
|
|
204
226
|
// 4. Cleanup staging — applied entries are already removed individually,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/edit.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAgBA,UAAU,WAAW;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AASD,eAAO,MAAM,WAAW,GAAU,SAAS,WAAW,KAAG,OAAO,CAAC,IAAI,CAkMpE,CAAC"}
|
package/dist/commands/edit.js
CHANGED
|
@@ -4,14 +4,16 @@ import { fileURLToPath } from "node:url";
|
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
import { defaultContextOptions } from "../lib/auth.js";
|
|
6
6
|
import { findProjectRoot, loadConfig, loadDefinitions, saveDefinitions, } from "../lib/config.js";
|
|
7
|
+
import { waitForPageReady } from "../lib/page-ready.js";
|
|
8
|
+
import { launchOptionsFor } from "../lib/playwright-launch.js";
|
|
9
|
+
import { executeActions } from "../lib/screenshot.js";
|
|
7
10
|
const loadEditorScript = () => {
|
|
8
11
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
// Bundled by esbuild into a single IIFE — no ESM artifacts to strip.
|
|
9
13
|
const scriptPath = path.join(__dirname, "..", "editor", "inject-script.js");
|
|
10
|
-
return fs
|
|
11
|
-
.readFileSync(scriptPath, "utf-8")
|
|
12
|
-
.replace(/^export\s*\{\s*\};?\s*$/m, "");
|
|
14
|
+
return fs.readFileSync(scriptPath, "utf-8");
|
|
13
15
|
};
|
|
14
|
-
export async
|
|
16
|
+
export const editCommand = async (options) => {
|
|
15
17
|
console.log(chalk.bold("\n🥷 Kagemusha — Annotation Editor\n"));
|
|
16
18
|
const projectRoot = findProjectRoot();
|
|
17
19
|
const config = loadConfig(projectRoot);
|
|
@@ -34,13 +36,21 @@ export async function editCommand(options) {
|
|
|
34
36
|
definitions = definitions.filter((d) => d.id === selected);
|
|
35
37
|
}
|
|
36
38
|
const def = definitions[0];
|
|
37
|
-
const { chromium } = await import("playwright-
|
|
39
|
+
const { chromium } = await import("playwright-core");
|
|
38
40
|
const browser = await chromium.launch({
|
|
39
41
|
headless: false,
|
|
40
42
|
args: ["--start-maximized"],
|
|
43
|
+
...launchOptionsFor(),
|
|
41
44
|
});
|
|
42
45
|
const context = await browser.newContext(defaultContextOptions(config, projectRoot));
|
|
43
46
|
const page = await context.newPage();
|
|
47
|
+
// Without a dialog listener, Playwright dismisses window.alert/confirm/
|
|
48
|
+
// prompt instantly. The editor's record mode uses confirm()/prompt() for
|
|
49
|
+
// "overwrite existing steps?" and "wait how many ms?"; this no-op listener
|
|
50
|
+
// keeps the native dialog open so the user can actually answer.
|
|
51
|
+
page.on("dialog", () => {
|
|
52
|
+
/* leave open for user interaction */
|
|
53
|
+
});
|
|
44
54
|
// Maximize the OS window via CDP — `--start-maximized` is a hint that
|
|
45
55
|
// macOS often ignores. CDP's setWindowBounds is authoritative.
|
|
46
56
|
const cdp = await context.newCDPSession(page);
|
|
@@ -57,7 +67,25 @@ export async function editCommand(options) {
|
|
|
57
67
|
const urlPath = def.url.replace(/\{(\w+)\}/g, (_, key) => def.urlParams?.[key] ?? "");
|
|
58
68
|
const fullUrl = new URL(urlPath, config.app.baseUrl).toString();
|
|
59
69
|
console.log(chalk.blue(`🌐 Opening ${fullUrl}...`));
|
|
60
|
-
|
|
70
|
+
// No timeout — user is interactively editing, hitting a 30s timeout
|
|
71
|
+
// mid-edit would be infuriating.
|
|
72
|
+
await page.goto(fullUrl, { waitUntil: "load", timeout: 0 });
|
|
73
|
+
await waitForPageReady(page);
|
|
74
|
+
// Replay existing beforeCapture so the user authors annotations on the
|
|
75
|
+
// same page state kagemusha will eventually screenshot (= modal closed,
|
|
76
|
+
// hover active, scrolled-into-view, etc). Non-optional failures here
|
|
77
|
+
// would break the edit session, so we soften them to a warning — the
|
|
78
|
+
// user can still operate, just with a less-accurate base state.
|
|
79
|
+
if (def.beforeCapture?.length) {
|
|
80
|
+
try {
|
|
81
|
+
await executeActions(page, def.beforeCapture);
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
85
|
+
console.log(chalk.yellow(`⚠ beforeCapture step failed during edit: ${reason}`));
|
|
86
|
+
console.log(chalk.gray(" Continuing without that step. Mark it `optional: true` in definitions.json if it's intermittent."));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
61
89
|
if (def.hideElements?.length) {
|
|
62
90
|
for (const selector of def.hideElements) {
|
|
63
91
|
await page.evaluate((sel) => {
|
|
@@ -77,7 +105,6 @@ export async function editCommand(options) {
|
|
|
77
105
|
await page.exposeFunction("__kagemusha_save", (payloadJson) => {
|
|
78
106
|
const payload = JSON.parse(payloadJson);
|
|
79
107
|
savedCount = payload.decorations?.length ?? 0;
|
|
80
|
-
// Update this definition in the full list and save
|
|
81
108
|
const allDefs = loadDefinitions(projectRoot);
|
|
82
109
|
const idx = allDefs.findIndex((d) => d.id === def.id);
|
|
83
110
|
if (idx >= 0) {
|
|
@@ -85,6 +112,12 @@ export async function editCommand(options) {
|
|
|
85
112
|
...def,
|
|
86
113
|
decorations: payload.decorations,
|
|
87
114
|
capture: payload.capture,
|
|
115
|
+
// Editor always sends the current step list (= seeded from existing
|
|
116
|
+
// beforeCapture on load). Empty array → drop the field entirely so
|
|
117
|
+
// definitions.json stays clean for defs that don't need pre-steps.
|
|
118
|
+
beforeCapture: payload.beforeCapture && payload.beforeCapture.length > 0
|
|
119
|
+
? payload.beforeCapture
|
|
120
|
+
: undefined,
|
|
88
121
|
};
|
|
89
122
|
}
|
|
90
123
|
saveDefinitions(allDefs, projectRoot);
|
|
@@ -104,6 +137,11 @@ export async function editCommand(options) {
|
|
|
104
137
|
await page.evaluate((cap) => {
|
|
105
138
|
window.__kagemusha_loadCapture(cap);
|
|
106
139
|
}, def.capture);
|
|
140
|
+
// Seed the Steps panel from existing beforeCapture. Always call (even with
|
|
141
|
+
// empty array) so the panel can render its initial state.
|
|
142
|
+
await page.evaluate((steps) => {
|
|
143
|
+
window.__kagemusha_loadSteps(steps);
|
|
144
|
+
}, def.beforeCapture ?? []);
|
|
107
145
|
console.log(chalk.blue("🎨 Editor ready. Draw annotations, then click Save.\n"));
|
|
108
146
|
// Wait for save or browser close
|
|
109
147
|
try {
|
|
@@ -116,5 +154,5 @@ export async function editCommand(options) {
|
|
|
116
154
|
}
|
|
117
155
|
await browser.close();
|
|
118
156
|
console.log(chalk.bold.green(`\n✅ Saved ${savedCount} annotation(s) for ${def.id}\n`));
|
|
119
|
-
}
|
|
157
|
+
};
|
|
120
158
|
//# sourceMappingURL=edit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EACN,eAAe,EACf,UAAU,EACV,eAAe,EACf,eAAe,GACf,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA+BA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA0PhD,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
3
4
|
import chalk from "chalk";
|
|
4
5
|
import inquirer from "inquirer";
|
|
5
6
|
import { stringify as toYaml } from "yaml";
|
|
@@ -7,16 +8,26 @@ import { hasAuthState } from "../lib/auth.js";
|
|
|
7
8
|
import { loadDefinitions, saveDefinitions } from "../lib/config.js";
|
|
8
9
|
import { discoverPages } from "../lib/crawl.js";
|
|
9
10
|
import { deriveIdFromPath } from "../lib/definition.js";
|
|
11
|
+
// inquirer の confirm は default 次第で "(Y/n)" / "(y/N)" と大文字小文字が
|
|
12
|
+
// 混在して読みにくい。list で常に「Yes / No」を表示する形に統一する。
|
|
13
|
+
const askYesNo = async (message, defaultYes) => {
|
|
14
|
+
const { ans } = await inquirer.prompt({
|
|
15
|
+
type: "list",
|
|
16
|
+
name: "ans",
|
|
17
|
+
message,
|
|
18
|
+
choices: [
|
|
19
|
+
{ name: "Yes", value: true },
|
|
20
|
+
{ name: "No", value: false },
|
|
21
|
+
],
|
|
22
|
+
default: defaultYes,
|
|
23
|
+
});
|
|
24
|
+
return ans;
|
|
25
|
+
};
|
|
10
26
|
export const initCommand = async () => {
|
|
11
27
|
console.log(chalk.bold("\n🥷 Kagemusha — Setup\n"));
|
|
12
28
|
const cwd = process.cwd();
|
|
13
29
|
if (fs.existsSync(path.join(cwd, "kagemusha.config.yaml"))) {
|
|
14
|
-
const
|
|
15
|
-
type: "confirm",
|
|
16
|
-
name: "overwrite",
|
|
17
|
-
message: "kagemusha.config.yaml already exists. Overwrite?",
|
|
18
|
-
default: false,
|
|
19
|
-
});
|
|
30
|
+
const overwrite = await askYesNo("kagemusha.config.yaml already exists. Overwrite?", false);
|
|
20
31
|
if (!overwrite) {
|
|
21
32
|
console.log(chalk.yellow("Aborted."));
|
|
22
33
|
return;
|
|
@@ -70,7 +81,7 @@ export const initCommand = async () => {
|
|
|
70
81
|
const config = {
|
|
71
82
|
app: { baseUrl },
|
|
72
83
|
screenshot: {
|
|
73
|
-
defaultViewport: { width:
|
|
84
|
+
defaultViewport: { width: 1440, height: 900, deviceScaleFactor: 2 },
|
|
74
85
|
defaultDiffThreshold: 0.005,
|
|
75
86
|
},
|
|
76
87
|
publish: destination === "local"
|
|
@@ -86,19 +97,9 @@ export const initCommand = async () => {
|
|
|
86
97
|
// Step 2: Discover pages and create screenshot definitions
|
|
87
98
|
// Check if login is needed
|
|
88
99
|
if (!hasAuthState(cwd)) {
|
|
89
|
-
const
|
|
90
|
-
type: "confirm",
|
|
91
|
-
name: "needsLogin",
|
|
92
|
-
message: "Does this app require login?",
|
|
93
|
-
default: true,
|
|
94
|
-
});
|
|
100
|
+
const needsLogin = await askYesNo("Does this app require login?", true);
|
|
95
101
|
if (needsLogin) {
|
|
96
|
-
const
|
|
97
|
-
type: "confirm",
|
|
98
|
-
name: "ciAuto",
|
|
99
|
-
message: "Generate a login.js skeleton for headless / CI auto-login? (recommended)",
|
|
100
|
-
default: true,
|
|
101
|
-
});
|
|
102
|
+
const ciAuto = await askYesNo("Create .kagemusha/login.mjs for automated login? (recommended — required for CI; edit selectors/credentials after generation)", true);
|
|
102
103
|
if (ciAuto) {
|
|
103
104
|
const skeletonPath = path.join(cwd, ".kagemusha", "login.mjs");
|
|
104
105
|
if (!fs.existsSync(skeletonPath)) {
|
|
@@ -148,13 +149,7 @@ export const initCommand = async () => {
|
|
|
148
149
|
message: "Page path (e.g. /index.html):",
|
|
149
150
|
});
|
|
150
151
|
selectedPaths.push(manualPath);
|
|
151
|
-
|
|
152
|
-
type: "confirm",
|
|
153
|
-
name: "more",
|
|
154
|
-
message: "Add another page?",
|
|
155
|
-
default: false,
|
|
156
|
-
});
|
|
157
|
-
addMore = more;
|
|
152
|
+
addMore = await askYesNo("Add another page?", false);
|
|
158
153
|
}
|
|
159
154
|
}
|
|
160
155
|
// Preserve existing definitions; merge new ones (skip ID duplicates)
|
|
@@ -162,12 +157,7 @@ export const initCommand = async () => {
|
|
|
162
157
|
let merged = existing;
|
|
163
158
|
let resetExisting = false;
|
|
164
159
|
if (existing.length > 0) {
|
|
165
|
-
const
|
|
166
|
-
type: "confirm",
|
|
167
|
-
name: "keepExisting",
|
|
168
|
-
message: `${existing.length} existing definition(s) found. Keep them and merge new selections?`,
|
|
169
|
-
default: true,
|
|
170
|
-
});
|
|
160
|
+
const keepExisting = await askYesNo(`${existing.length} existing definition(s) found. Keep them and merge new selections?`, true);
|
|
171
161
|
if (!keepExisting) {
|
|
172
162
|
console.log(chalk.yellow(` ⚠ ${existing.length} existing definition(s) will be replaced.`));
|
|
173
163
|
merged = [];
|
|
@@ -200,17 +190,20 @@ export const initCommand = async () => {
|
|
|
200
190
|
}
|
|
201
191
|
console.log("");
|
|
202
192
|
// Step 3: GitHub Actions workflow
|
|
203
|
-
const
|
|
204
|
-
type: "confirm",
|
|
205
|
-
name: "createWorkflow",
|
|
206
|
-
message: "Generate GitHub Actions workflow?",
|
|
207
|
-
default: true,
|
|
208
|
-
});
|
|
193
|
+
const createWorkflow = await askYesNo("Generate GitHub Actions workflow?", true);
|
|
209
194
|
if (createWorkflow) {
|
|
210
195
|
const workflowDir = path.join(cwd, ".github/workflows");
|
|
211
196
|
fs.mkdirSync(workflowDir, { recursive: true });
|
|
212
197
|
fs.writeFileSync(path.join(workflowDir, "kagemusha.yml"), generateWorkflowTemplate());
|
|
213
198
|
console.log(chalk.green("✓ Created .github/workflows/kagemusha.yml"));
|
|
199
|
+
// Notification formatter is user-editable (= belongs to the project,
|
|
200
|
+
// not to kagemusha). Place a Slack-shaped skeleton next to login.mjs.
|
|
201
|
+
const notifyJqPath = path.join(cwd, ".kagemusha", "notify-slack.jq");
|
|
202
|
+
if (!fs.existsSync(notifyJqPath)) {
|
|
203
|
+
fs.mkdirSync(path.dirname(notifyJqPath), { recursive: true });
|
|
204
|
+
fs.writeFileSync(notifyJqPath, generateNotifySlackJq());
|
|
205
|
+
console.log(chalk.green("✓ Created .kagemusha/notify-slack.jq (edit to customize format)"));
|
|
206
|
+
}
|
|
214
207
|
}
|
|
215
208
|
console.log(chalk.bold.green("\n✅ Setup complete!\n"));
|
|
216
209
|
console.log(chalk.gray("Next steps:"));
|
|
@@ -225,7 +218,6 @@ const GITIGNORE_ENTRIES = [
|
|
|
225
218
|
".kagemusha/.cache/",
|
|
226
219
|
".kagemusha/auth-state.json",
|
|
227
220
|
".kagemusha/auth-meta.json",
|
|
228
|
-
".kagemusha/login-failure.png",
|
|
229
221
|
"reports/",
|
|
230
222
|
];
|
|
231
223
|
// Strip trailing slash so `screenshots` and `screenshots/` are treated as the
|
|
@@ -266,13 +258,20 @@ const generateLoginSkeleton = () => `// Custom login flow — runs headless, cal
|
|
|
266
258
|
//
|
|
267
259
|
// The page already has \`baseURL\` set from kagemusha.config.yaml, so relative
|
|
268
260
|
// paths work in \`page.goto('/login')\`.
|
|
261
|
+
//
|
|
262
|
+
// ⚠️ Env var naming:
|
|
263
|
+
// The example below uses MY_APP_EMAIL / MY_APP_PASSWORD as placeholders.
|
|
264
|
+
// Rename them to whatever fits your project (e.g. STAGING_EMAIL, WEVOX_TEST_EMAIL).
|
|
265
|
+
// Avoid:
|
|
266
|
+
// - Generic names like EMAIL / PASSWORD (collide with shell rc / other tools)
|
|
267
|
+
// - KAGEMUSHA_* prefix (reserved for kagemusha's own future config / GUI auth)
|
|
269
268
|
|
|
270
|
-
/** @param {import('playwright-
|
|
269
|
+
/** @param {import('playwright-core').Page} page */
|
|
271
270
|
export const login = async (page) => {
|
|
272
271
|
await page.goto("/login");
|
|
273
272
|
|
|
274
|
-
await page.fill('input[name="email"]', process.env.
|
|
275
|
-
await page.fill('input[name="password"]', process.env.
|
|
273
|
+
await page.fill('input[name="email"]', process.env.MY_APP_EMAIL ?? "");
|
|
274
|
+
await page.fill('input[name="password"]', process.env.MY_APP_PASSWORD ?? "");
|
|
276
275
|
await page.click('button[type="submit"]');
|
|
277
276
|
|
|
278
277
|
// Wait until we leave the login URL (= login succeeded).
|
|
@@ -281,27 +280,25 @@ export const login = async (page) => {
|
|
|
281
280
|
`;
|
|
282
281
|
const generateWorkflowTemplate = () => `name: Kagemusha - Screenshot Update
|
|
283
282
|
|
|
283
|
+
# Triggered when main is updated (= push or PR merge land on main).
|
|
284
284
|
on:
|
|
285
|
-
|
|
286
|
-
types: [closed]
|
|
285
|
+
push:
|
|
287
286
|
branches: [main]
|
|
288
287
|
workflow_dispatch:
|
|
289
288
|
|
|
290
|
-
#
|
|
289
|
+
# Cancel in-progress runs when a newer merge arrives — kagemusha always
|
|
290
|
+
# captures the full set, so the latest run subsumes any earlier one.
|
|
291
291
|
concurrency:
|
|
292
292
|
group: kagemusha
|
|
293
|
-
cancel-in-progress:
|
|
293
|
+
cancel-in-progress: true
|
|
294
294
|
|
|
295
295
|
# OIDC is recommended over long-lived access keys.
|
|
296
296
|
# To use OIDC instead: replace the AWS env vars below with
|
|
297
297
|
# \`uses: aws-actions/configure-aws-credentials@v4\` + \`role-to-assume\` and
|
|
298
|
-
# add
|
|
299
|
-
permissions:
|
|
300
|
-
contents: read
|
|
298
|
+
# add \`permissions: { id-token: write, contents: read }\`.
|
|
301
299
|
|
|
302
300
|
jobs:
|
|
303
301
|
update-screenshots:
|
|
304
|
-
if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch'
|
|
305
302
|
runs-on: ubuntu-latest
|
|
306
303
|
steps:
|
|
307
304
|
- uses: actions/checkout@v4
|
|
@@ -311,7 +308,7 @@ jobs:
|
|
|
311
308
|
- run: npm ci
|
|
312
309
|
- run: npx playwright install chromium
|
|
313
310
|
|
|
314
|
-
# If your app needs login, kagemusha auto-runs .kagemusha/login.
|
|
311
|
+
# If your app needs login, kagemusha auto-runs .kagemusha/login.mjs
|
|
315
312
|
# (generated by \`kagemusha init\`) to create a fresh session.
|
|
316
313
|
# Set login credentials as secrets and pass them as env below.
|
|
317
314
|
#
|
|
@@ -329,43 +326,45 @@ jobs:
|
|
|
329
326
|
env:
|
|
330
327
|
AWS_ACCESS_KEY_ID: \${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
331
328
|
AWS_SECRET_ACCESS_KEY: \${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
332
|
-
#
|
|
333
|
-
EMAIL
|
|
334
|
-
|
|
329
|
+
# Rename these to match what your .kagemusha/login.mjs reads.
|
|
330
|
+
# Avoid generic names (EMAIL) or KAGEMUSHA_* (reserved).
|
|
331
|
+
MY_APP_EMAIL: \${{ secrets.MY_APP_EMAIL }}
|
|
332
|
+
MY_APP_PASSWORD: \${{ secrets.MY_APP_PASSWORD }}
|
|
335
333
|
|
|
336
|
-
# Keep
|
|
337
|
-
-
|
|
338
|
-
uses: actions/upload-artifact@v4
|
|
334
|
+
# Keep summary.json as artifact for later review
|
|
335
|
+
- uses: actions/upload-artifact@v4
|
|
339
336
|
with:
|
|
340
337
|
name: kagemusha-reports
|
|
341
338
|
path: reports/
|
|
342
339
|
if-no-files-found: ignore
|
|
343
340
|
|
|
344
|
-
# Slack notification
|
|
345
|
-
#
|
|
346
|
-
#
|
|
347
|
-
#
|
|
348
|
-
#
|
|
349
|
-
#
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
# ) | join("\\n"))
|
|
362
|
-
# end
|
|
363
|
-
# ' reports/summary.json)
|
|
364
|
-
# [ -n "$BODY" ] || exit 0
|
|
365
|
-
# curl -X POST "$SLACK_WEBHOOK_URL" \\
|
|
366
|
-
# -H 'Content-Type: application/json' \\
|
|
367
|
-
# -d "$(jq -n --arg t "$BODY" '{text: $t}')"
|
|
368
|
-
# env:
|
|
369
|
-
# SLACK_WEBHOOK_URL: \${{ secrets.SLACK_WEBHOOK_URL }}
|
|
341
|
+
# Slack notification: one message per changed/new screenshot.
|
|
342
|
+
# Slack unfurls image URLs per-message, so the preview comes out
|
|
343
|
+
# clean even with many updates. Format defined in
|
|
344
|
+
# .kagemusha/notify-slack.jq — each line of jq output becomes one
|
|
345
|
+
# POST body. Test locally:
|
|
346
|
+
# jq -c -f .kagemusha/notify-slack.jq reports/summary.json
|
|
347
|
+
- name: Slack notify
|
|
348
|
+
env:
|
|
349
|
+
SLACK_WEBHOOK_URL: \${{ secrets.SLACK_WEBHOOK_URL }}
|
|
350
|
+
run: |
|
|
351
|
+
[ -n "$SLACK_WEBHOOK_URL" ] || exit 0
|
|
352
|
+
jq -c -f .kagemusha/notify-slack.jq reports/summary.json | while IFS= read -r payload; do
|
|
353
|
+
[ -z "$payload" ] && continue
|
|
354
|
+
curl -sS -X POST "$SLACK_WEBHOOK_URL" \\
|
|
355
|
+
-H 'Content-Type: application/json' \\
|
|
356
|
+
--data "$payload"
|
|
357
|
+
done
|
|
370
358
|
`;
|
|
359
|
+
// Read the .jq template from a real file (not a template literal) so the
|
|
360
|
+
// jq source can use its native escapes (`\(...)`) without TS string
|
|
361
|
+
// escaping, gets IDE syntax highlighting, and stays editable as a normal
|
|
362
|
+
// `.jq` file. The template ships in the npm tarball via package.json's
|
|
363
|
+
// `files: ["dist", "templates"]`.
|
|
364
|
+
const generateNotifySlackJq = () => {
|
|
365
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
366
|
+
// dist/commands/init.js → repo root is two levels up
|
|
367
|
+
const templatePath = path.join(here, "..", "..", "templates", "notify-slack.jq");
|
|
368
|
+
return fs.readFileSync(templatePath, "utf8");
|
|
369
|
+
};
|
|
371
370
|
//# sourceMappingURL=init.js.map
|