@wasao/kagemusha 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +497 -58
  2. package/dist/commands/add.d.ts +6 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +26 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/capture.d.ts +4 -2
  7. package/dist/commands/capture.d.ts.map +1 -1
  8. package/dist/commands/capture.js +236 -11
  9. package/dist/commands/capture.js.map +1 -1
  10. package/dist/commands/discover.d.ts +2 -0
  11. package/dist/commands/discover.d.ts.map +1 -0
  12. package/dist/commands/discover.js +62 -0
  13. package/dist/commands/discover.js.map +1 -0
  14. package/dist/commands/edit.d.ts +6 -0
  15. package/dist/commands/edit.d.ts.map +1 -0
  16. package/dist/commands/edit.js +120 -0
  17. package/dist/commands/edit.js.map +1 -0
  18. package/dist/commands/init.d.ts +1 -1
  19. package/dist/commands/init.d.ts.map +1 -1
  20. package/dist/commands/init.js +220 -118
  21. package/dist/commands/init.js.map +1 -1
  22. package/dist/commands/list.d.ts +2 -0
  23. package/dist/commands/list.d.ts.map +1 -0
  24. package/dist/commands/list.js +33 -0
  25. package/dist/commands/list.js.map +1 -0
  26. package/dist/commands/login.d.ts +6 -0
  27. package/dist/commands/login.d.ts.map +1 -0
  28. package/dist/commands/login.js +142 -0
  29. package/dist/commands/login.js.map +1 -0
  30. package/dist/commands/validate.js +1 -1
  31. package/dist/commands/validate.js.map +1 -1
  32. package/dist/editor/inject-script.d.ts +2 -0
  33. package/dist/editor/inject-script.d.ts.map +1 -0
  34. package/dist/editor/inject-script.js +768 -0
  35. package/dist/editor/inject-script.js.map +1 -0
  36. package/dist/index.js +32 -20
  37. package/dist/index.js.map +1 -1
  38. package/dist/lib/annotate.d.ts +2 -2
  39. package/dist/lib/annotate.d.ts.map +1 -1
  40. package/dist/lib/annotate.js +36 -44
  41. package/dist/lib/annotate.js.map +1 -1
  42. package/dist/lib/auth.d.ts +18 -0
  43. package/dist/lib/auth.d.ts.map +1 -0
  44. package/dist/lib/auth.js +45 -0
  45. package/dist/lib/auth.js.map +1 -0
  46. package/dist/lib/aws-error.d.ts +7 -0
  47. package/dist/lib/aws-error.d.ts.map +1 -0
  48. package/dist/lib/aws-error.js +74 -0
  49. package/dist/lib/aws-error.js.map +1 -0
  50. package/dist/lib/canonical.d.ts +22 -0
  51. package/dist/lib/canonical.d.ts.map +1 -0
  52. package/dist/lib/canonical.js +92 -0
  53. package/dist/lib/canonical.js.map +1 -0
  54. package/dist/lib/config.d.ts +2 -0
  55. package/dist/lib/config.d.ts.map +1 -1
  56. package/dist/lib/config.js +23 -13
  57. package/dist/lib/config.js.map +1 -1
  58. package/dist/lib/crawl.d.ts +1 -1
  59. package/dist/lib/crawl.d.ts.map +1 -1
  60. package/dist/lib/crawl.js +213 -20
  61. package/dist/lib/crawl.js.map +1 -1
  62. package/dist/lib/definition.d.ts +2 -0
  63. package/dist/lib/definition.d.ts.map +1 -0
  64. package/dist/lib/definition.js +6 -0
  65. package/dist/lib/definition.js.map +1 -0
  66. package/dist/lib/diff.d.ts +52 -0
  67. package/dist/lib/diff.d.ts.map +1 -0
  68. package/dist/lib/diff.js +41 -0
  69. package/dist/lib/diff.js.map +1 -0
  70. package/dist/lib/login-error.d.ts +10 -0
  71. package/dist/lib/login-error.d.ts.map +1 -0
  72. package/dist/lib/login-error.js +13 -0
  73. package/dist/lib/login-error.js.map +1 -0
  74. package/dist/lib/screenshot.d.ts +8 -2
  75. package/dist/lib/screenshot.d.ts.map +1 -1
  76. package/dist/lib/screenshot.js +44 -61
  77. package/dist/lib/screenshot.js.map +1 -1
  78. package/dist/lib/staging.d.ts +8 -0
  79. package/dist/lib/staging.d.ts.map +1 -0
  80. package/dist/lib/staging.js +24 -0
  81. package/dist/lib/staging.js.map +1 -0
  82. package/dist/types.d.ts +5 -23
  83. package/dist/types.d.ts.map +1 -1
  84. package/package.json +18 -11
  85. package/dist/commands/preview.d.ts +0 -6
  86. package/dist/commands/preview.d.ts.map +0 -1
  87. package/dist/commands/preview.js +0 -33
  88. package/dist/commands/preview.js.map +0 -1
  89. package/dist/commands/run.d.ts +0 -6
  90. package/dist/commands/run.d.ts.map +0 -1
  91. package/dist/commands/run.js +0 -39
  92. package/dist/commands/run.js.map +0 -1
  93. package/dist/lib/upload.d.ts +0 -9
  94. package/dist/lib/upload.d.ts.map +0 -1
  95. package/dist/lib/upload.js +0 -43
  96. package/dist/lib/upload.js.map +0 -1
@@ -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",
@@ -90,72 +51,74 @@ export async function initCommand() {
90
51
  outputDir = dir;
91
52
  }
92
53
  else {
93
- const s3Answers = await inquirer.prompt([
94
- {
95
- type: "input",
96
- name: "cdnBucket",
97
- message: "S3 bucket name:",
98
- default: "kagemusha-screenshots",
99
- },
100
- {
101
- type: "input",
102
- name: "cdnBaseUrl",
103
- message: "S3 public URL base:",
104
- default: "https://kagemusha-screenshots.s3.ap-northeast-1.amazonaws.com",
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.5,
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
- fs.mkdirSync(path.join(cwd, ".kagemusha/definitions"), { recursive: true });
155
- 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`));
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
- const definition = {
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
- const defPath = path.join(cwd, ".kagemusha/definitions", `${id}.json`);
208
- fs.writeFileSync(defPath, `${JSON.stringify(definition, null, 2)}\n`);
209
- 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);
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 preview — Preview screenshots locally"));
228
- console.log(chalk.gray(" npx kagemusha validate — Validate config files"));
229
- console.log(chalk.gray(" npx kagemusha run — Run full pipeline\n"));
230
- }
231
- function generateWorkflowTemplate() {
232
- 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
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
- - 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
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":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -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"}