@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.
Files changed (104) hide show
  1. package/README.md +496 -57
  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 +3 -2
  7. package/dist/commands/capture.d.ts.map +1 -1
  8. package/dist/commands/capture.js +234 -20
  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.map +1 -1
  15. package/dist/commands/edit.js +40 -20
  16. package/dist/commands/edit.js.map +1 -1
  17. package/dist/commands/init.d.ts +1 -1
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +206 -102
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/list.d.ts +2 -0
  22. package/dist/commands/list.d.ts.map +1 -0
  23. package/dist/commands/list.js +33 -0
  24. package/dist/commands/list.js.map +1 -0
  25. package/dist/commands/login.d.ts +6 -0
  26. package/dist/commands/login.d.ts.map +1 -0
  27. package/dist/commands/login.js +142 -0
  28. package/dist/commands/login.js.map +1 -0
  29. package/dist/commands/validate.js +1 -1
  30. package/dist/commands/validate.js.map +1 -1
  31. package/dist/editor/inject-script.js +407 -33
  32. package/dist/editor/inject-script.js.map +1 -1
  33. package/dist/index.js +27 -16
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib/annotate.d.ts +2 -2
  36. package/dist/lib/annotate.d.ts.map +1 -1
  37. package/dist/lib/annotate.js +35 -43
  38. package/dist/lib/annotate.js.map +1 -1
  39. package/dist/lib/auth.d.ts +18 -0
  40. package/dist/lib/auth.d.ts.map +1 -0
  41. package/dist/lib/auth.js +45 -0
  42. package/dist/lib/auth.js.map +1 -0
  43. package/dist/lib/aws-error.d.ts +7 -0
  44. package/dist/lib/aws-error.d.ts.map +1 -0
  45. package/dist/lib/aws-error.js +74 -0
  46. package/dist/lib/aws-error.js.map +1 -0
  47. package/dist/lib/canonical.d.ts +22 -0
  48. package/dist/lib/canonical.d.ts.map +1 -0
  49. package/dist/lib/canonical.js +92 -0
  50. package/dist/lib/canonical.js.map +1 -0
  51. package/dist/lib/config.d.ts +2 -0
  52. package/dist/lib/config.d.ts.map +1 -1
  53. package/dist/lib/config.js +23 -13
  54. package/dist/lib/config.js.map +1 -1
  55. package/dist/lib/crawl.d.ts +1 -1
  56. package/dist/lib/crawl.d.ts.map +1 -1
  57. package/dist/lib/crawl.js +213 -20
  58. package/dist/lib/crawl.js.map +1 -1
  59. package/dist/lib/definition.d.ts +2 -0
  60. package/dist/lib/definition.d.ts.map +1 -0
  61. package/dist/lib/definition.js +6 -0
  62. package/dist/lib/definition.js.map +1 -0
  63. package/dist/lib/diff.d.ts +52 -0
  64. package/dist/lib/diff.d.ts.map +1 -0
  65. package/dist/lib/diff.js +41 -0
  66. package/dist/lib/diff.js.map +1 -0
  67. package/dist/lib/login-error.d.ts +10 -0
  68. package/dist/lib/login-error.d.ts.map +1 -0
  69. package/dist/lib/login-error.js +13 -0
  70. package/dist/lib/login-error.js.map +1 -0
  71. package/dist/lib/screenshot.d.ts +8 -2
  72. package/dist/lib/screenshot.d.ts.map +1 -1
  73. package/dist/lib/screenshot.js +44 -61
  74. package/dist/lib/screenshot.js.map +1 -1
  75. package/dist/lib/staging.d.ts +8 -0
  76. package/dist/lib/staging.d.ts.map +1 -0
  77. package/dist/lib/staging.js +24 -0
  78. package/dist/lib/staging.js.map +1 -0
  79. package/dist/types.d.ts +5 -23
  80. package/dist/types.d.ts.map +1 -1
  81. package/package.json +18 -11
  82. package/dist/commands/preview.d.ts +0 -6
  83. package/dist/commands/preview.d.ts.map +0 -1
  84. package/dist/commands/preview.js +0 -33
  85. package/dist/commands/preview.js.map +0 -1
  86. package/dist/commands/run.d.ts +0 -6
  87. package/dist/commands/run.d.ts.map +0 -1
  88. package/dist/commands/run.js +0 -39
  89. package/dist/commands/run.js.map +0 -1
  90. package/dist/editor/editor/editor.html +0 -313
  91. package/dist/editor/editor/inject.ts +0 -385
  92. package/dist/editor/editor.html +0 -338
  93. package/dist/editor/inject-script.cjs +0 -398
  94. package/dist/editor/inject-script.cjs.map +0 -1
  95. package/dist/editor/inject-script.d.cts +0 -2
  96. package/dist/editor/inject-script.d.cts.map +0 -1
  97. package/dist/editor/inject.d.ts +0 -2
  98. package/dist/editor/inject.d.ts.map +0 -1
  99. package/dist/editor/inject.js +0 -385
  100. package/dist/editor/inject.js.map +0 -1
  101. package/dist/lib/upload.d.ts +0 -9
  102. package/dist/lib/upload.d.ts.map +0 -1
  103. package/dist/lib/upload.js +0 -43
  104. package/dist/lib/upload.js.map +0 -1
@@ -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
- export async function initCommand() {
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.5,
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
- fs.mkdirSync(path.join(cwd, ".kagemusha/definitions"), { recursive: true });
153
- console.log(chalk.blue(`\nšŸ” Scanning ${baseUrl} for pages...\n`));
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
- const definition = {
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
- const defPath = path.join(cwd, ".kagemusha/definitions", `${id}.json`);
206
- fs.writeFileSync(defPath, `${JSON.stringify(definition, null, 2)}\n`);
207
- console.log(chalk.green(` āœ“ ${id} → ${defPath}`));
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 preview — Preview screenshots locally"));
226
- console.log(chalk.gray(" npx kagemusha validate — Validate config files"));
227
- console.log(chalk.gray(" npx kagemusha run — Run full pipeline\n"));
228
- }
229
- function generateWorkflowTemplate() {
230
- return `name: Kagemusha - Screenshot Update
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
- - run: npx kagemusha run
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":"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"}
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,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;YACnE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kDAAkD;YAC3D,OAAO,EAAE,KAAK;SACd,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACtC,OAAO;QACR,CAAC;IACF,CAAC;IAED,uBAAuB;IACvB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAsB;QAC9D,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,8CAA8C;QACvD,OAAO,EAAE,uBAAuB;KAChC,CAAC,CAAC;IAEH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA0B;QACtE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,4BAA4B;QACrC,OAAO,EAAE;YACR,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE;YACjD,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;SAC3B;KACD,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,eAAe,CAAC;IAChC,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAkB;YACtD,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE,eAAe;SACxB,CAAC,CAAC;QACH,SAAS,GAAG,GAAG,CAAC;IACjB,CAAC;SAAM,CAAC;QACP,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAqB;YAC5D,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,uBAAuB;SAChC,CAAC,CAAC;QACH,SAAS,GAAG,MAAM,CAAC;QAEnB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAkB;YACtD,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE,WAAW,MAAM,kCAAkC;SAC5D,CAAC,CAAC;QACH,UAAU,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,eAAe;IACf,MAAM,MAAM,GAAoB;QAC/B,GAAG,EAAE,EAAE,OAAO,EAAE;QAChB,UAAU,EAAE;YACX,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE;YACnE,oBAAoB,EAAE,KAAK;SAC3B;QACD,OAAO,EACN,WAAW,KAAK,OAAO;YACtB,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE;YACrC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE;KAChD,CAAC;IAEF,eAAe;IACf,EAAE,CAAC,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,EACvC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAClC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAE9D,2EAA2E;IAC3E,2EAA2E;IAC3E,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAEhC,2DAA2D;IAE3D,2BAA2B;IAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA0B;YACrE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QAEH,IAAI,UAAU,EAAE,CAAC;YAChB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAsB;gBAC7D,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EACN,0EAA0E;gBAC3E,OAAO,EAAE,IAAI;aACb,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;gBAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9D,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,qBAAqB,EAAE,CAAC,CAAC;oBACxD,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAC/D,CAAC;gBACH,CAAC;YACF,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC/D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YACpD,MAAM,YAAY,EAAE,CAAC;QACtB,CAAC;IACF,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,iBAAiB,CAAC,CAAC,CAAC;IAEjE,IAAI,KAAK,GAAsC,EAAE,CAAC;IAClD,IAAI,CAAC;QACJ,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,aAAa,GAAa,EAAE,CAAC;IAEjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;QAE9D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;YAClE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,4CAA4C;YACrD,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;gBACzC,KAAK,EAAE,CAAC,CAAC,IAAI;gBACb,OAAO,EAAE,IAAI;aACb,CAAC,CAAC;SACH,CAAC,CAAC;QACH,aAAa,GAAG,QAAQ,CAAC;IAC1B,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAEpE,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,OAAO,OAAO,EAAE,CAAC;YAChB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;gBACpE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,+BAA+B;aACxC,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAoB;gBACzD,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,mBAAmB;gBAC5B,OAAO,EAAE,KAAK;aACd,CAAC,CAAC;YACH,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;IACF,CAAC;IAED,qEAAqE;IACrE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,MAAM,GAA2B,QAAQ,CAAC;IAC9C,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA4B;YACzE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,oEAAoE;YAC/F,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,MAAM,CACX,OAAO,QAAQ,CAAC,MAAM,2CAA2C,CACjE,CACD,CAAC;YACF,MAAM,GAAG,EAAE,CAAC;YACZ,aAAa,GAAG,IAAI,CAAC;QACtB,CAAC;IACF,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC,CAAC;YAC/D,SAAS;QACV,CAAC;QACD,MAAM,GAAG,GAAyB;YACjC,EAAE;YACF,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE,EAAE,IAAI,EAAE,UAAmB,EAAE;YACtC,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,EAAE;SACf,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpB,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC;QAChC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,kCAAkC;IAClC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAC/C;QACC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,mCAAmC;QAC5C,OAAO,EAAE,IAAI;KACb,CACD,CAAC;IAEF,IAAI,cAAc,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;QACxD,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EACvC,wBAAwB,EAAE,CAC1B,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CACT,gEAAgE,CAChE,CACD,CAAC;IACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CACrE,CAAC;IACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CACrE,CAAC;AACH,CAAC,CAAC;AAEF,8DAA8D;AAC9D,yBAAyB;AACzB,MAAM,iBAAiB,GAAG;IACzB,sBAAsB;IACtB,oBAAoB;IACpB,4BAA4B;IAC5B,2BAA2B;IAC3B,8BAA8B;IAC9B,UAAU;CACV,CAAC;AAEF,8EAA8E;AAC9E,yDAAyD;AACzD,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAExE,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,SAAiB,EAAQ,EAAE;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAC5C,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;QACxC,CAAC,CAAC,EAAE,CAAC;IACN,MAAM,OAAO,GAAG,IAAI,GAAG,CACtB,QAAQ;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,kBAAkB,CAAC,CACzB,CAAC;IAEF,MAAM,mBAAmB,GAAG,SAAS;SACnC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtB,MAAM,OAAO,GAAG,CAAC,GAAG,iBAAiB,EAAE,GAAG,mBAAmB,GAAG,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEnC,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GACT,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,EAAE;QACzC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B,CAAC,CAAC,GAAG,QAAQ,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CACV,+BAA+B,SAAS,CAAC,MAAM,qBAAqB,CACpE,CACD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,GAAW,EAAE,CAC1C;;;;;;;;;;;;;;;;;;;;;;;CAuBA,CAAC;AAEF,MAAM,wBAAwB,GAAG,GAAW,EAAE,CAC7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFA,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const listCommand: () => Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -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,6 @@
1
+ interface LoginOptions {
2
+ headed?: boolean;
3
+ }
4
+ export declare const loginCommand: (options?: LoginOptions) => Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=login.d.ts.map
@@ -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) {