@wasao/kagemusha 0.1.1 ā 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.
- package/README.md +496 -57
- package/dist/commands/add.d.ts +6 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +26 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/capture.d.ts +3 -2
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +234 -20
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/discover.d.ts +2 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +62 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/edit.d.ts.map +1 -1
- package/dist/commands/edit.js +40 -20
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +206 -102
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +33 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +142 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/validate.js +1 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/editor/inject-script.js +407 -33
- package/dist/editor/inject-script.js.map +1 -1
- package/dist/index.js +27 -16
- package/dist/index.js.map +1 -1
- package/dist/lib/annotate.d.ts +2 -2
- package/dist/lib/annotate.d.ts.map +1 -1
- package/dist/lib/annotate.js +35 -43
- package/dist/lib/annotate.js.map +1 -1
- package/dist/lib/auth.d.ts +18 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +45 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/aws-error.d.ts +7 -0
- package/dist/lib/aws-error.d.ts.map +1 -0
- package/dist/lib/aws-error.js +74 -0
- package/dist/lib/aws-error.js.map +1 -0
- package/dist/lib/canonical.d.ts +22 -0
- package/dist/lib/canonical.d.ts.map +1 -0
- package/dist/lib/canonical.js +92 -0
- package/dist/lib/canonical.js.map +1 -0
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +23 -13
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/crawl.d.ts +1 -1
- package/dist/lib/crawl.d.ts.map +1 -1
- package/dist/lib/crawl.js +213 -20
- package/dist/lib/crawl.js.map +1 -1
- package/dist/lib/definition.d.ts +2 -0
- package/dist/lib/definition.d.ts.map +1 -0
- package/dist/lib/definition.js +6 -0
- package/dist/lib/definition.js.map +1 -0
- package/dist/lib/diff.d.ts +52 -0
- package/dist/lib/diff.d.ts.map +1 -0
- package/dist/lib/diff.js +41 -0
- package/dist/lib/diff.js.map +1 -0
- package/dist/lib/login-error.d.ts +10 -0
- package/dist/lib/login-error.d.ts.map +1 -0
- package/dist/lib/login-error.js +13 -0
- package/dist/lib/login-error.js.map +1 -0
- package/dist/lib/screenshot.d.ts +8 -2
- package/dist/lib/screenshot.d.ts.map +1 -1
- package/dist/lib/screenshot.js +44 -61
- package/dist/lib/screenshot.js.map +1 -1
- package/dist/lib/staging.d.ts +8 -0
- package/dist/lib/staging.d.ts.map +1 -0
- package/dist/lib/staging.js +24 -0
- package/dist/lib/staging.js.map +1 -0
- package/dist/types.d.ts +5 -23
- package/dist/types.d.ts.map +1 -1
- package/package.json +18 -11
- package/dist/commands/preview.d.ts +0 -6
- package/dist/commands/preview.d.ts.map +0 -1
- package/dist/commands/preview.js +0 -33
- package/dist/commands/preview.js.map +0 -1
- package/dist/commands/run.d.ts +0 -6
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -39
- package/dist/commands/run.js.map +0 -1
- package/dist/editor/editor/editor.html +0 -313
- package/dist/editor/editor/inject.ts +0 -385
- package/dist/editor/editor.html +0 -338
- package/dist/editor/inject-script.cjs +0 -398
- package/dist/editor/inject-script.cjs.map +0 -1
- package/dist/editor/inject-script.d.cts +0 -2
- package/dist/editor/inject-script.d.cts.map +0 -1
- package/dist/editor/inject.d.ts +0 -2
- package/dist/editor/inject.d.ts.map +0 -1
- package/dist/editor/inject.js +0 -385
- package/dist/editor/inject.js.map +0 -1
- package/dist/lib/upload.d.ts +0 -9
- package/dist/lib/upload.d.ts.map +0 -1
- package/dist/lib/upload.js +0 -43
- package/dist/lib/upload.js.map +0 -1
package/dist/commands/init.js
CHANGED
|
@@ -3,8 +3,11 @@ import path from "node:path";
|
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import inquirer from "inquirer";
|
|
5
5
|
import { stringify as toYaml } from "yaml";
|
|
6
|
+
import { hasAuthState } from "../lib/auth.js";
|
|
7
|
+
import { loadDefinitions, saveDefinitions } from "../lib/config.js";
|
|
6
8
|
import { discoverPages } from "../lib/crawl.js";
|
|
7
|
-
|
|
9
|
+
import { deriveIdFromPath } from "../lib/definition.js";
|
|
10
|
+
export const initCommand = async () => {
|
|
8
11
|
console.log(chalk.bold("\nš„· Kagemusha ā Setup\n"));
|
|
9
12
|
const cwd = process.cwd();
|
|
10
13
|
if (fs.existsSync(path.join(cwd, "kagemusha.config.yaml"))) {
|
|
@@ -26,48 +29,6 @@ export async function initCommand() {
|
|
|
26
29
|
message: "Target URL (the app to take screenshots of):",
|
|
27
30
|
default: "http://localhost:3000",
|
|
28
31
|
});
|
|
29
|
-
const { needsAuth } = await inquirer.prompt({
|
|
30
|
-
type: "confirm",
|
|
31
|
-
name: "needsAuth",
|
|
32
|
-
message: "Does the app require login?",
|
|
33
|
-
default: true,
|
|
34
|
-
});
|
|
35
|
-
let loginUrl = "/login";
|
|
36
|
-
let emailSelector = "#email";
|
|
37
|
-
let passwordSelector = "#password";
|
|
38
|
-
let submitSelector = "button[type='submit']";
|
|
39
|
-
if (needsAuth) {
|
|
40
|
-
const authAnswers = await inquirer.prompt([
|
|
41
|
-
{
|
|
42
|
-
type: "input",
|
|
43
|
-
name: "loginUrl",
|
|
44
|
-
message: "Login page path:",
|
|
45
|
-
default: "/login",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
type: "input",
|
|
49
|
-
name: "emailSelector",
|
|
50
|
-
message: "Email input selector:",
|
|
51
|
-
default: "#email",
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
type: "input",
|
|
55
|
-
name: "passwordSelector",
|
|
56
|
-
message: "Password input selector:",
|
|
57
|
-
default: "#password",
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
type: "input",
|
|
61
|
-
name: "submitSelector",
|
|
62
|
-
message: "Login button selector:",
|
|
63
|
-
default: "button[type='submit']",
|
|
64
|
-
},
|
|
65
|
-
]);
|
|
66
|
-
loginUrl = authAnswers.loginUrl;
|
|
67
|
-
emailSelector = authAnswers.emailSelector;
|
|
68
|
-
passwordSelector = authAnswers.passwordSelector;
|
|
69
|
-
submitSelector = authAnswers.submitSelector;
|
|
70
|
-
}
|
|
71
32
|
const { destination } = await inquirer.prompt({
|
|
72
33
|
type: "list",
|
|
73
34
|
name: "destination",
|
|
@@ -110,50 +71,54 @@ export async function initCommand() {
|
|
|
110
71
|
app: { baseUrl },
|
|
111
72
|
screenshot: {
|
|
112
73
|
defaultViewport: { width: 1280, height: 720, deviceScaleFactor: 2 },
|
|
113
|
-
defaultDiffThreshold: 0.
|
|
74
|
+
defaultDiffThreshold: 0.005,
|
|
114
75
|
},
|
|
76
|
+
publish: destination === "local"
|
|
77
|
+
? { destination: "local", outputDir }
|
|
78
|
+
: { destination: "s3", cdnBucket, cdnBaseUrl },
|
|
115
79
|
};
|
|
116
|
-
if (destination === "local") {
|
|
117
|
-
config.publish = {
|
|
118
|
-
destination: "local",
|
|
119
|
-
outputDir,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
config.publish = {
|
|
124
|
-
destination: "s3",
|
|
125
|
-
cdnBucket,
|
|
126
|
-
cdnBaseUrl,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
if (needsAuth) {
|
|
130
|
-
config.auth = {
|
|
131
|
-
loginUrl,
|
|
132
|
-
steps: [
|
|
133
|
-
{
|
|
134
|
-
action: "type",
|
|
135
|
-
selector: emailSelector,
|
|
136
|
-
text: "${KAGEMUSHA_DEMO_EMAIL}",
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
action: "type",
|
|
140
|
-
selector: passwordSelector,
|
|
141
|
-
text: "${KAGEMUSHA_DEMO_PASSWORD}",
|
|
142
|
-
},
|
|
143
|
-
{ action: "click", selector: submitSelector },
|
|
144
|
-
{ action: "waitForNavigation" },
|
|
145
|
-
],
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
80
|
// Write config
|
|
149
81
|
fs.writeFileSync(path.join(cwd, "kagemusha.config.yaml"), toYaml(config, { lineWidth: 120 }));
|
|
150
82
|
console.log(chalk.green("\nā Created kagemusha.config.yaml"));
|
|
83
|
+
// Update .gitignore so canonical/staging artifacts don't pollute the repo.
|
|
84
|
+
// Canonical lives in S3 (or a local outputDir for testing) ā never in git.
|
|
85
|
+
updateGitignore(cwd, outputDir);
|
|
151
86
|
// Step 2: Discover pages and create screenshot definitions
|
|
152
|
-
|
|
153
|
-
|
|
87
|
+
// Check if login is needed
|
|
88
|
+
if (!hasAuthState(cwd)) {
|
|
89
|
+
const { needsLogin } = await inquirer.prompt({
|
|
90
|
+
type: "confirm",
|
|
91
|
+
name: "needsLogin",
|
|
92
|
+
message: "Does this app require login?",
|
|
93
|
+
default: true,
|
|
94
|
+
});
|
|
95
|
+
if (needsLogin) {
|
|
96
|
+
const { ciAuto } = await inquirer.prompt({
|
|
97
|
+
type: "confirm",
|
|
98
|
+
name: "ciAuto",
|
|
99
|
+
message: "Generate a login.js skeleton for headless / CI auto-login? (recommended)",
|
|
100
|
+
default: true,
|
|
101
|
+
});
|
|
102
|
+
if (ciAuto) {
|
|
103
|
+
const skeletonPath = path.join(cwd, ".kagemusha", "login.mjs");
|
|
104
|
+
if (!fs.existsSync(skeletonPath)) {
|
|
105
|
+
fs.mkdirSync(path.dirname(skeletonPath), { recursive: true });
|
|
106
|
+
fs.writeFileSync(skeletonPath, generateLoginSkeleton());
|
|
107
|
+
console.log(chalk.green("ā Created .kagemusha/login.mjs (edit before use)"));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
console.log(chalk.blue("\nš Opening browser for login...\n"));
|
|
111
|
+
const { loginCommand } = await import("./login.js");
|
|
112
|
+
await loginCommand();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
console.log(chalk.green(" ā Using saved login session\n"));
|
|
117
|
+
}
|
|
118
|
+
console.log(chalk.blue(`š Scanning ${baseUrl} for pages...\n`));
|
|
154
119
|
let pages = [];
|
|
155
120
|
try {
|
|
156
|
-
pages = await discoverPages(baseUrl);
|
|
121
|
+
pages = await discoverPages(baseUrl, cwd);
|
|
157
122
|
}
|
|
158
123
|
catch {
|
|
159
124
|
console.log(chalk.yellow(" Could not auto-discover pages.\n"));
|
|
@@ -192,9 +157,32 @@ export async function initCommand() {
|
|
|
192
157
|
addMore = more;
|
|
193
158
|
}
|
|
194
159
|
}
|
|
160
|
+
// Preserve existing definitions; merge new ones (skip ID duplicates)
|
|
161
|
+
const existing = loadDefinitions(cwd);
|
|
162
|
+
let merged = existing;
|
|
163
|
+
let resetExisting = false;
|
|
164
|
+
if (existing.length > 0) {
|
|
165
|
+
const { keepExisting } = await inquirer.prompt({
|
|
166
|
+
type: "confirm",
|
|
167
|
+
name: "keepExisting",
|
|
168
|
+
message: `${existing.length} existing definition(s) found. Keep them and merge new selections?`,
|
|
169
|
+
default: true,
|
|
170
|
+
});
|
|
171
|
+
if (!keepExisting) {
|
|
172
|
+
console.log(chalk.yellow(` ā ${existing.length} existing definition(s) will be replaced.`));
|
|
173
|
+
merged = [];
|
|
174
|
+
resetExisting = true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const existingIds = new Set(merged.map((d) => d.id));
|
|
178
|
+
let added = 0;
|
|
195
179
|
for (const pagePath of selectedPaths) {
|
|
196
180
|
const id = deriveIdFromPath(pagePath);
|
|
197
|
-
|
|
181
|
+
if (existingIds.has(id)) {
|
|
182
|
+
console.log(chalk.gray(` ā· ${id} (already exists, skipped)`));
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const def = {
|
|
198
186
|
id,
|
|
199
187
|
name: id,
|
|
200
188
|
url: pagePath,
|
|
@@ -202,9 +190,13 @@ export async function initCommand() {
|
|
|
202
190
|
hideElements: [],
|
|
203
191
|
decorations: [],
|
|
204
192
|
};
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
193
|
+
merged.push(def);
|
|
194
|
+
existingIds.add(id);
|
|
195
|
+
added++;
|
|
196
|
+
console.log(chalk.green(` ā ${id}`));
|
|
197
|
+
}
|
|
198
|
+
if (added > 0 || resetExisting) {
|
|
199
|
+
saveDefinitions(merged, cwd);
|
|
208
200
|
}
|
|
209
201
|
console.log("");
|
|
210
202
|
// Step 3: GitHub Actions workflow
|
|
@@ -222,12 +214,72 @@ export async function initCommand() {
|
|
|
222
214
|
}
|
|
223
215
|
console.log(chalk.bold.green("\nā
Setup complete!\n"));
|
|
224
216
|
console.log(chalk.gray("Next steps:"));
|
|
225
|
-
console.log(chalk.gray(" npx kagemusha
|
|
226
|
-
console.log(chalk.gray(" npx kagemusha
|
|
227
|
-
console.log(chalk.gray(" npx kagemusha
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
|
|
217
|
+
console.log(chalk.gray(" npx kagemusha capture ā Capture & publish changed"));
|
|
218
|
+
console.log(chalk.gray(" npx kagemusha capture --dry-run ā Preview diffs only"));
|
|
219
|
+
console.log(chalk.gray(" npx kagemusha edit ā Edit annotations\n"));
|
|
220
|
+
};
|
|
221
|
+
// login.mjs 㯠team ć§å
±ęćććć¹ć (selector / ććć¼å®ē¾©ćÆ team property)
|
|
222
|
+
// ćŖć®ć§ęå³ēć« gitignore ććŖćć
|
|
223
|
+
const GITIGNORE_ENTRIES = [
|
|
224
|
+
".kagemusha/.staging/",
|
|
225
|
+
".kagemusha/.cache/",
|
|
226
|
+
".kagemusha/auth-state.json",
|
|
227
|
+
".kagemusha/auth-meta.json",
|
|
228
|
+
".kagemusha/login-failure.png",
|
|
229
|
+
"reports/",
|
|
230
|
+
];
|
|
231
|
+
// Strip trailing slash so `screenshots` and `screenshots/` are treated as the
|
|
232
|
+
// same gitignore entry (and we don't append duplicates).
|
|
233
|
+
const stripTrailingSlash = (s) => s.replace(/\/+$/, "");
|
|
234
|
+
const updateGitignore = (cwd, outputDir) => {
|
|
235
|
+
const gitignorePath = path.join(cwd, ".gitignore");
|
|
236
|
+
const existing = fs.existsSync(gitignorePath)
|
|
237
|
+
? fs.readFileSync(gitignorePath, "utf8")
|
|
238
|
+
: "";
|
|
239
|
+
const present = new Set(existing
|
|
240
|
+
.split("\n")
|
|
241
|
+
.map((l) => l.trim())
|
|
242
|
+
.filter((l) => l.length > 0)
|
|
243
|
+
.map(stripTrailingSlash));
|
|
244
|
+
const normalizedOutputDir = outputDir
|
|
245
|
+
.replace(/^\.\//, "")
|
|
246
|
+
.replace(/\/+$/, "");
|
|
247
|
+
const entries = [...GITIGNORE_ENTRIES, `${normalizedOutputDir}/`];
|
|
248
|
+
const additions = entries.filter((e) => !present.has(stripTrailingSlash(e)));
|
|
249
|
+
if (additions.length === 0)
|
|
250
|
+
return;
|
|
251
|
+
const block = ["", "# kagemusha", ...additions, ""];
|
|
252
|
+
const next = existing.endsWith("\n") || existing === ""
|
|
253
|
+
? existing + block.join("\n")
|
|
254
|
+
: `${existing}\n${block.join("\n")}`;
|
|
255
|
+
fs.writeFileSync(gitignorePath, next);
|
|
256
|
+
console.log(chalk.green(`ā Updated .gitignore (added ${additions.length} kagemusha entries)`));
|
|
257
|
+
};
|
|
258
|
+
const generateLoginSkeleton = () => `// Custom login flow ā runs headless, called by \`kagemusha login\`.
|
|
259
|
+
// Saved storage state is reused by \`kagemusha capture\` for all definitions.
|
|
260
|
+
//
|
|
261
|
+
// Examples:
|
|
262
|
+
// - Form login: fill email/password, submit, wait for redirect
|
|
263
|
+
// - HTTP basic: set extraHTTPHeaders or httpCredentials in kagemusha.config.yaml
|
|
264
|
+
// - Token-based: inject Authorization header via extraHTTPHeaders
|
|
265
|
+
// - SSO / OAuth: fall back to interactive \`kagemusha login\` (delete this file)
|
|
266
|
+
//
|
|
267
|
+
// The page already has \`baseURL\` set from kagemusha.config.yaml, so relative
|
|
268
|
+
// paths work in \`page.goto('/login')\`.
|
|
269
|
+
|
|
270
|
+
/** @param {import('playwright-chromium').Page} page */
|
|
271
|
+
export const login = async (page) => {
|
|
272
|
+
await page.goto("/login");
|
|
273
|
+
|
|
274
|
+
await page.fill('input[name="email"]', process.env.EMAIL ?? "");
|
|
275
|
+
await page.fill('input[name="password"]', process.env.PASSWORD ?? "");
|
|
276
|
+
await page.click('button[type="submit"]');
|
|
277
|
+
|
|
278
|
+
// Wait until we leave the login URL (= login succeeded).
|
|
279
|
+
await page.waitForURL((url) => !url.pathname.startsWith("/login"));
|
|
280
|
+
};
|
|
281
|
+
`;
|
|
282
|
+
const generateWorkflowTemplate = () => `name: Kagemusha - Screenshot Update
|
|
231
283
|
|
|
232
284
|
on:
|
|
233
285
|
pull_request:
|
|
@@ -235,33 +287,85 @@ on:
|
|
|
235
287
|
branches: [main]
|
|
236
288
|
workflow_dispatch:
|
|
237
289
|
|
|
290
|
+
# Serialize runs so concurrent merges can't race the S3 canonical
|
|
291
|
+
concurrency:
|
|
292
|
+
group: kagemusha
|
|
293
|
+
cancel-in-progress: false
|
|
294
|
+
|
|
295
|
+
# OIDC is recommended over long-lived access keys.
|
|
296
|
+
# To use OIDC instead: replace the AWS env vars below with
|
|
297
|
+
# \`uses: aws-actions/configure-aws-credentials@v4\` + \`role-to-assume\` and
|
|
298
|
+
# add the \`id-token: write\` permission.
|
|
299
|
+
permissions:
|
|
300
|
+
contents: read
|
|
301
|
+
|
|
238
302
|
jobs:
|
|
239
303
|
update-screenshots:
|
|
240
304
|
if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch'
|
|
241
305
|
runs-on: ubuntu-latest
|
|
242
306
|
steps:
|
|
243
307
|
- uses: actions/checkout@v4
|
|
244
|
-
with:
|
|
245
|
-
fetch-depth: 0
|
|
246
308
|
- uses: actions/setup-node@v4
|
|
247
309
|
with:
|
|
248
310
|
node-version: 20
|
|
249
311
|
- run: npm ci
|
|
250
312
|
- run: npx playwright install chromium
|
|
251
313
|
|
|
252
|
-
|
|
314
|
+
# If your app needs login, kagemusha auto-runs .kagemusha/login.js
|
|
315
|
+
# (generated by \`kagemusha init\`) to create a fresh session.
|
|
316
|
+
# Set login credentials as secrets and pass them as env below.
|
|
317
|
+
#
|
|
318
|
+
# For SSO / MFA apps where scripted login isn't possible, use:
|
|
319
|
+
# - name: Restore login session
|
|
320
|
+
# if: env.KAGEMUSHA_STORAGE_STATE != ''
|
|
321
|
+
# run: mkdir -p .kagemusha && echo "$KAGEMUSHA_STORAGE_STATE" | base64 --decode > .kagemusha/auth-state.json
|
|
322
|
+
# env:
|
|
323
|
+
# KAGEMUSHA_STORAGE_STATE: \${{ secrets.KAGEMUSHA_STORAGE_STATE }}
|
|
324
|
+
|
|
325
|
+
# Pulls canonical from S3, diffs against fresh capture,
|
|
326
|
+
# pushes only what changed back to S3. No screenshots/ commit needed.
|
|
327
|
+
# Region is auto-detected from publish.cdnBaseUrl in kagemusha.config.yaml.
|
|
328
|
+
- run: npx kagemusha capture
|
|
253
329
|
env:
|
|
254
|
-
KAGEMUSHA_DEMO_EMAIL: \${{ secrets.KAGEMUSHA_DEMO_EMAIL }}
|
|
255
|
-
KAGEMUSHA_DEMO_PASSWORD: \${{ secrets.KAGEMUSHA_DEMO_PASSWORD }}
|
|
256
330
|
AWS_ACCESS_KEY_ID: \${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
257
331
|
AWS_SECRET_ACCESS_KEY: \${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
332
|
+
# Name these to match what your .kagemusha/login.js reads
|
|
333
|
+
EMAIL: \${{ secrets.EMAIL }}
|
|
334
|
+
PASSWORD: \${{ secrets.PASSWORD }}
|
|
335
|
+
|
|
336
|
+
# Keep diff visualizations + summary.json as artifacts for later review
|
|
337
|
+
- if: always()
|
|
338
|
+
uses: actions/upload-artifact@v4
|
|
339
|
+
with:
|
|
340
|
+
name: kagemusha-reports
|
|
341
|
+
path: reports/
|
|
342
|
+
if-no-files-found: ignore
|
|
343
|
+
|
|
344
|
+
# Slack notification (opt-in: uncomment + add SLACK_WEBHOOK_URL secret)
|
|
345
|
+
# Notifies only when there are changed/new screenshots.
|
|
346
|
+
# - name: Slack notify
|
|
347
|
+
# if: always()
|
|
348
|
+
# run: |
|
|
349
|
+
# [ -f reports/summary.json ] || exit 0
|
|
350
|
+
# BODY=$(jq -r '
|
|
351
|
+
# [.results[] | select(.status == "changed" or .status == "new")] as $items
|
|
352
|
+
# | if ($items | length) == 0 then empty
|
|
353
|
+
# else
|
|
354
|
+
# "šø *kagemusha*: \\($items | length) screenshot(s)\\n" +
|
|
355
|
+
# ($items | map(
|
|
356
|
+
# if .status == "changed" then
|
|
357
|
+
# "~ \\(.id) (\\(.diffPercentage // .reason))"
|
|
358
|
+
# else
|
|
359
|
+
# "+ \\(.id) (new)"
|
|
360
|
+
# end
|
|
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 }}
|
|
258
370
|
`;
|
|
259
|
-
}
|
|
260
|
-
function deriveIdFromPath(urlPath) {
|
|
261
|
-
return (urlPath
|
|
262
|
-
.replace(/^\//, "")
|
|
263
|
-
.replace(/\.\w+$/, "")
|
|
264
|
-
.replace(/[/\\]/g, "-")
|
|
265
|
-
.replace(/[^a-zA-Z0-9-]/g, "") || "page");
|
|
266
|
-
}
|
|
267
371
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAsChD,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { findProjectRoot, loadDefinitions } from "../lib/config.js";
|
|
3
|
+
export const listCommand = async () => {
|
|
4
|
+
const projectRoot = findProjectRoot();
|
|
5
|
+
const definitions = loadDefinitions(projectRoot);
|
|
6
|
+
if (definitions.length === 0) {
|
|
7
|
+
console.log(chalk.yellow("\nNo definitions found.\n"));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
// Group by URL
|
|
11
|
+
const byUrl = new Map();
|
|
12
|
+
for (const def of definitions) {
|
|
13
|
+
const list = byUrl.get(def.url) ?? [];
|
|
14
|
+
list.push(def);
|
|
15
|
+
byUrl.set(def.url, list);
|
|
16
|
+
}
|
|
17
|
+
console.log(chalk.bold(`\nš ${definitions.length} definition(s) across ${byUrl.size} URL(s)\n`));
|
|
18
|
+
for (const [url, defs] of byUrl) {
|
|
19
|
+
console.log(chalk.blue(` ${url}`));
|
|
20
|
+
for (const def of defs) {
|
|
21
|
+
const decorations = def.decorations?.length ?? 0;
|
|
22
|
+
const meta = [
|
|
23
|
+
def.capture.mode,
|
|
24
|
+
decorations > 0 ? `${decorations} annotations` : null,
|
|
25
|
+
]
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join(", ");
|
|
28
|
+
console.log(` ${chalk.white(def.id)} ${chalk.dim(meta)}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
console.log("");
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGpE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACpD,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACvD,OAAO;IACR,CAAC;IAED,eAAe;IACf,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkC,CAAC;IACxD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CACT,QAAQ,WAAW,CAAC,MAAM,yBAAyB,KAAK,CAAC,IAAI,WAAW,CACxE,CACD,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG;gBACZ,GAAG,CAAC,OAAO,CAAC,IAAI;gBAChB,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,cAAc,CAAC,CAAC,CAAC,IAAI;aACrD;iBACC,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAoBA,UAAU,YAAY;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,GACxB,UAAS,YAAiB,KACxB,OAAO,CAAC,IAAI,CAoBd,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { defaultContextOptions, getAuthMetaPath, getAuthStatePath, resolveLoginScriptPath, } from "../lib/auth.js";
|
|
6
|
+
import { findProjectRoot, loadConfig } from "../lib/config.js";
|
|
7
|
+
import { LoginError } from "../lib/login-error.js";
|
|
8
|
+
export const loginCommand = async (options = {}) => {
|
|
9
|
+
const projectRoot = findProjectRoot();
|
|
10
|
+
const config = loadConfig(projectRoot);
|
|
11
|
+
const scriptPath = resolveLoginScriptPath(config, projectRoot);
|
|
12
|
+
try {
|
|
13
|
+
if (scriptPath) {
|
|
14
|
+
await runScriptedLogin(scriptPath, config, projectRoot, options);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
await runInteractiveLogin(config, projectRoot);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
if (e instanceof LoginError) {
|
|
22
|
+
// Friendly message + screenshot already printed inside runScriptedLogin.
|
|
23
|
+
// Just signal failure via exit code without dumping a stack.
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
throw e;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const runScriptedLogin = async (scriptPath, config, projectRoot, options = {}) => {
|
|
31
|
+
console.log(chalk.bold("\nš„· Kagemusha ā Login (scripted)\n"));
|
|
32
|
+
console.log(chalk.gray(` using: ${path.relative(projectRoot, scriptPath)}`));
|
|
33
|
+
if (options.headed) {
|
|
34
|
+
console.log(chalk.gray(` mode: headed (debug)\n`));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.log("");
|
|
38
|
+
}
|
|
39
|
+
const mod = (await import(pathToFileURL(scriptPath).href));
|
|
40
|
+
const loginFn = mod.login ?? mod.default;
|
|
41
|
+
if (typeof loginFn !== "function") {
|
|
42
|
+
throw new Error(`${scriptPath} must export a 'login(page)' function (named or default export).`);
|
|
43
|
+
}
|
|
44
|
+
const { chromium } = await import("playwright-chromium");
|
|
45
|
+
const browser = await chromium.launch({ headless: !options.headed });
|
|
46
|
+
// projectRoot=undefined ā no storageState applied (we are creating one).
|
|
47
|
+
const context = await browser.newContext(defaultContextOptions(config, undefined));
|
|
48
|
+
const page = await context.newPage();
|
|
49
|
+
try {
|
|
50
|
+
try {
|
|
51
|
+
await loginFn(page);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
const url = page.url();
|
|
55
|
+
const screenshotPath = path.join(projectRoot, ".kagemusha", "login-failure.png");
|
|
56
|
+
await page
|
|
57
|
+
.screenshot({ path: screenshotPath, fullPage: true })
|
|
58
|
+
.catch(() => { });
|
|
59
|
+
console.error(chalk.red(`\nā Login script threw: ${formatError(e)}`));
|
|
60
|
+
console.error(chalk.gray(` Last URL: ${url}`));
|
|
61
|
+
console.error(chalk.gray(` Screenshot: ${path.relative(projectRoot, screenshotPath)}`));
|
|
62
|
+
console.error(chalk.yellow(`\nHint:\n` +
|
|
63
|
+
` - Re-run with --headed to watch: \`kagemusha login --headed\`\n` +
|
|
64
|
+
` - Verify form selectors in .kagemusha/login.mjs match the live page\n` +
|
|
65
|
+
` - Check that EMAIL / PASSWORD env vars are correct`));
|
|
66
|
+
throw new LoginError(`login script threw: ${formatError(e)}`);
|
|
67
|
+
}
|
|
68
|
+
const landingUrl = page.url();
|
|
69
|
+
const landingPath = new URL(landingUrl).pathname;
|
|
70
|
+
// Verify login actually succeeded ā landing on /login* means we failed silently.
|
|
71
|
+
if (landingPath.startsWith("/login") || landingPath === "/") {
|
|
72
|
+
const screenshotPath = path.join(projectRoot, ".kagemusha", "login-failure.png");
|
|
73
|
+
await page
|
|
74
|
+
.screenshot({ path: screenshotPath, fullPage: true })
|
|
75
|
+
.catch(() => { });
|
|
76
|
+
console.error(chalk.red(`\nā Login script completed but the page is still on ${landingPath}.`));
|
|
77
|
+
console.error(chalk.gray(` Screenshot: ${path.relative(projectRoot, screenshotPath)}`));
|
|
78
|
+
console.error(chalk.yellow(`\nHint:\n` +
|
|
79
|
+
` - Re-run with \`kagemusha login --headed\` to see the live flow\n` +
|
|
80
|
+
` - Verify selectors / credentials in .kagemusha/login.mjs`));
|
|
81
|
+
throw new LoginError(`stuck on ${landingPath} after login script`);
|
|
82
|
+
}
|
|
83
|
+
// Verify the storageState actually has cookies (= a session was established).
|
|
84
|
+
const state = await context.storageState();
|
|
85
|
+
const cookieCount = state.cookies?.length ?? 0;
|
|
86
|
+
if (cookieCount === 0) {
|
|
87
|
+
console.warn(chalk.yellow(`ā Login script finished but no cookies were set ā the saved session may be empty.`));
|
|
88
|
+
}
|
|
89
|
+
const authStatePath = getAuthStatePath(projectRoot);
|
|
90
|
+
fs.mkdirSync(path.dirname(authStatePath), { recursive: true });
|
|
91
|
+
await context.storageState({ path: authStatePath });
|
|
92
|
+
const metaPath = getAuthMetaPath(projectRoot);
|
|
93
|
+
fs.writeFileSync(metaPath, JSON.stringify({ loginPath: "/login", landingPath }, null, 2));
|
|
94
|
+
console.log(chalk.bold.green("\nā
Session saved"));
|
|
95
|
+
console.log(chalk.gray(` Landing: ${landingPath} (${cookieCount} cookies)\n`));
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
await browser.close();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const formatError = (e) => e instanceof Error ? e.message : String(e);
|
|
102
|
+
const runInteractiveLogin = async (config, projectRoot) => {
|
|
103
|
+
console.log(chalk.bold("\nš„· Kagemusha ā Login\n"));
|
|
104
|
+
const inquirer = await import("inquirer");
|
|
105
|
+
const { loginPath } = await inquirer.default.prompt({
|
|
106
|
+
type: "input",
|
|
107
|
+
name: "loginPath",
|
|
108
|
+
message: "Login page path (e.g. /login):",
|
|
109
|
+
default: "/login",
|
|
110
|
+
});
|
|
111
|
+
const loginUrl = new URL(loginPath, config.app.baseUrl).toString();
|
|
112
|
+
const { chromium } = await import("playwright-chromium");
|
|
113
|
+
const browser = await chromium.launch({ headless: false });
|
|
114
|
+
const context = await browser.newContext(defaultContextOptions(config, undefined));
|
|
115
|
+
const page = await context.newPage();
|
|
116
|
+
console.log(chalk.blue(`š Opening ${loginUrl}...`));
|
|
117
|
+
console.log(chalk.gray(" Log in manually in the browser.\n"));
|
|
118
|
+
await page.goto(loginUrl, { waitUntil: "networkidle" });
|
|
119
|
+
await inquirer.default.prompt({
|
|
120
|
+
type: "confirm",
|
|
121
|
+
name: "done",
|
|
122
|
+
message: "Done logging in?",
|
|
123
|
+
default: true,
|
|
124
|
+
});
|
|
125
|
+
const landingUrl = page.url();
|
|
126
|
+
const landingPath = new URL(landingUrl).pathname;
|
|
127
|
+
if (landingPath === loginPath) {
|
|
128
|
+
console.log(chalk.yellow(`\nā Still on ${loginPath} ā looks like login wasn't completed.`));
|
|
129
|
+
console.log(chalk.yellow(" Session not saved. Re-run 'kagemusha login' after signing in.\n"));
|
|
130
|
+
await browser.close();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const authStatePath = getAuthStatePath(projectRoot);
|
|
134
|
+
fs.mkdirSync(path.dirname(authStatePath), { recursive: true });
|
|
135
|
+
await context.storageState({ path: authStatePath });
|
|
136
|
+
const metaPath = getAuthMetaPath(projectRoot);
|
|
137
|
+
fs.writeFileSync(metaPath, JSON.stringify({ loginPath, landingPath }, null, 2));
|
|
138
|
+
await browser.close();
|
|
139
|
+
console.log(chalk.bold.green("\nā
Session saved"));
|
|
140
|
+
console.log(chalk.gray(` Landing page: ${landingPath}\n`));
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ export async function validateCommand() {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
if (definitions.length === 0) {
|
|
38
|
-
console.log(chalk.yellow(" No definitions found in .kagemusha/definitions
|
|
38
|
+
console.log(chalk.yellow(" No definitions found in .kagemusha/definitions.json"));
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
catch (err) {
|