@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.
- package/README.md +497 -58
- 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 +4 -2
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +236 -11
- 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 +6 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +120 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +220 -118
- 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.d.ts +2 -0
- package/dist/editor/inject-script.d.ts.map +1 -0
- package/dist/editor/inject-script.js +768 -0
- package/dist/editor/inject-script.js.map +1 -0
- package/dist/index.js +32 -20
- 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 +36 -44
- 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/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",
|
|
@@ -90,72 +51,74 @@ export async function initCommand() {
|
|
|
90
51
|
outputDir = dir;
|
|
91
52
|
}
|
|
92
53
|
else {
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
cdnBucket = s3Answers.cdnBucket;
|
|
108
|
-
cdnBaseUrl = s3Answers.cdnBaseUrl;
|
|
54
|
+
const { bucket } = await inquirer.prompt({
|
|
55
|
+
type: "input",
|
|
56
|
+
name: "bucket",
|
|
57
|
+
message: "S3 bucket name:",
|
|
58
|
+
default: "kagemusha-screenshots",
|
|
59
|
+
});
|
|
60
|
+
cdnBucket = bucket;
|
|
61
|
+
const { url } = await inquirer.prompt({
|
|
62
|
+
type: "input",
|
|
63
|
+
name: "url",
|
|
64
|
+
message: "S3 public URL base:",
|
|
65
|
+
default: `https://${bucket}.s3.ap-northeast-1.amazonaws.com`,
|
|
66
|
+
});
|
|
67
|
+
cdnBaseUrl = url;
|
|
109
68
|
}
|
|
110
69
|
// Build config
|
|
111
70
|
const config = {
|
|
112
71
|
app: { baseUrl },
|
|
113
72
|
screenshot: {
|
|
114
73
|
defaultViewport: { width: 1280, height: 720, deviceScaleFactor: 2 },
|
|
115
|
-
defaultDiffThreshold: 0.
|
|
74
|
+
defaultDiffThreshold: 0.005,
|
|
116
75
|
},
|
|
76
|
+
publish: destination === "local"
|
|
77
|
+
? { destination: "local", outputDir }
|
|
78
|
+
: { destination: "s3", cdnBucket, cdnBaseUrl },
|
|
117
79
|
};
|
|
118
|
-
if (destination === "local") {
|
|
119
|
-
config.publish = {
|
|
120
|
-
destination: "local",
|
|
121
|
-
outputDir,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
config.publish = {
|
|
126
|
-
destination: "s3",
|
|
127
|
-
cdnBucket,
|
|
128
|
-
cdnBaseUrl,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
if (needsAuth) {
|
|
132
|
-
config.auth = {
|
|
133
|
-
loginUrl,
|
|
134
|
-
steps: [
|
|
135
|
-
{
|
|
136
|
-
action: "type",
|
|
137
|
-
selector: emailSelector,
|
|
138
|
-
text: "${KAGEMUSHA_DEMO_EMAIL}",
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
action: "type",
|
|
142
|
-
selector: passwordSelector,
|
|
143
|
-
text: "${KAGEMUSHA_DEMO_PASSWORD}",
|
|
144
|
-
},
|
|
145
|
-
{ action: "click", selector: submitSelector },
|
|
146
|
-
{ action: "waitForNavigation" },
|
|
147
|
-
],
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
80
|
// Write config
|
|
151
81
|
fs.writeFileSync(path.join(cwd, "kagemusha.config.yaml"), toYaml(config, { lineWidth: 120 }));
|
|
152
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);
|
|
153
86
|
// Step 2: Discover pages and create screenshot definitions
|
|
154
|
-
|
|
155
|
-
|
|
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`));
|
|
156
119
|
let pages = [];
|
|
157
120
|
try {
|
|
158
|
-
pages = await discoverPages(baseUrl);
|
|
121
|
+
pages = await discoverPages(baseUrl, cwd);
|
|
159
122
|
}
|
|
160
123
|
catch {
|
|
161
124
|
console.log(chalk.yellow(" Could not auto-discover pages.\n"));
|
|
@@ -194,9 +157,32 @@ export async function initCommand() {
|
|
|
194
157
|
addMore = more;
|
|
195
158
|
}
|
|
196
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;
|
|
197
179
|
for (const pagePath of selectedPaths) {
|
|
198
180
|
const id = deriveIdFromPath(pagePath);
|
|
199
|
-
|
|
181
|
+
if (existingIds.has(id)) {
|
|
182
|
+
console.log(chalk.gray(` ā· ${id} (already exists, skipped)`));
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const def = {
|
|
200
186
|
id,
|
|
201
187
|
name: id,
|
|
202
188
|
url: pagePath,
|
|
@@ -204,9 +190,13 @@ export async function initCommand() {
|
|
|
204
190
|
hideElements: [],
|
|
205
191
|
decorations: [],
|
|
206
192
|
};
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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);
|
|
210
200
|
}
|
|
211
201
|
console.log("");
|
|
212
202
|
// Step 3: GitHub Actions workflow
|
|
@@ -224,12 +214,72 @@ export async function initCommand() {
|
|
|
224
214
|
}
|
|
225
215
|
console.log(chalk.bold.green("\nā
Setup complete!\n"));
|
|
226
216
|
console.log(chalk.gray("Next steps:"));
|
|
227
|
-
console.log(chalk.gray(" npx kagemusha
|
|
228
|
-
console.log(chalk.gray(" npx kagemusha
|
|
229
|
-
console.log(chalk.gray(" npx kagemusha
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
|
|
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
|
|
233
283
|
|
|
234
284
|
on:
|
|
235
285
|
pull_request:
|
|
@@ -237,33 +287,85 @@ on:
|
|
|
237
287
|
branches: [main]
|
|
238
288
|
workflow_dispatch:
|
|
239
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
|
+
|
|
240
302
|
jobs:
|
|
241
303
|
update-screenshots:
|
|
242
304
|
if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch'
|
|
243
305
|
runs-on: ubuntu-latest
|
|
244
306
|
steps:
|
|
245
307
|
- uses: actions/checkout@v4
|
|
246
|
-
with:
|
|
247
|
-
fetch-depth: 0
|
|
248
308
|
- uses: actions/setup-node@v4
|
|
249
309
|
with:
|
|
250
310
|
node-version: 20
|
|
251
311
|
- run: npm ci
|
|
252
312
|
- run: npx playwright install chromium
|
|
253
313
|
|
|
254
|
-
|
|
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
|
|
255
329
|
env:
|
|
256
|
-
KAGEMUSHA_DEMO_EMAIL: \${{ secrets.KAGEMUSHA_DEMO_EMAIL }}
|
|
257
|
-
KAGEMUSHA_DEMO_PASSWORD: \${{ secrets.KAGEMUSHA_DEMO_PASSWORD }}
|
|
258
330
|
AWS_ACCESS_KEY_ID: \${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
259
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 }}
|
|
260
370
|
`;
|
|
261
|
-
}
|
|
262
|
-
function deriveIdFromPath(urlPath) {
|
|
263
|
-
return (urlPath
|
|
264
|
-
.replace(/^\//, "")
|
|
265
|
-
.replace(/\.\w+$/, "")
|
|
266
|
-
.replace(/[/\\]/g, "-")
|
|
267
|
-
.replace(/[^a-zA-Z0-9-]/g, "") || "page");
|
|
268
|
-
}
|
|
269
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"}
|