@wasao/kagemusha 0.1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/commands/capture.d.ts +7 -0
  4. package/dist/commands/capture.d.ts.map +1 -0
  5. package/dist/commands/capture.js +27 -0
  6. package/dist/commands/capture.js.map +1 -0
  7. package/dist/commands/init.d.ts +2 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +269 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/preview.d.ts +6 -0
  12. package/dist/commands/preview.d.ts.map +1 -0
  13. package/dist/commands/preview.js +33 -0
  14. package/dist/commands/preview.js.map +1 -0
  15. package/dist/commands/run.d.ts +6 -0
  16. package/dist/commands/run.d.ts.map +1 -0
  17. package/dist/commands/run.js +39 -0
  18. package/dist/commands/run.js.map +1 -0
  19. package/dist/commands/validate.d.ts +2 -0
  20. package/dist/commands/validate.d.ts.map +1 -0
  21. package/dist/commands/validate.js +53 -0
  22. package/dist/commands/validate.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +63 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/lib/annotate.d.ts +3 -0
  28. package/dist/lib/annotate.d.ts.map +1 -0
  29. package/dist/lib/annotate.js +102 -0
  30. package/dist/lib/annotate.js.map +1 -0
  31. package/dist/lib/config.d.ts +9 -0
  32. package/dist/lib/config.d.ts.map +1 -0
  33. package/dist/lib/config.js +92 -0
  34. package/dist/lib/config.js.map +1 -0
  35. package/dist/lib/crawl.d.ts +6 -0
  36. package/dist/lib/crawl.d.ts.map +1 -0
  37. package/dist/lib/crawl.js +95 -0
  38. package/dist/lib/crawl.js.map +1 -0
  39. package/dist/lib/screenshot.d.ts +3 -0
  40. package/dist/lib/screenshot.d.ts.map +1 -0
  41. package/dist/lib/screenshot.js +166 -0
  42. package/dist/lib/screenshot.js.map +1 -0
  43. package/dist/lib/upload.d.ts +9 -0
  44. package/dist/lib/upload.d.ts.map +1 -0
  45. package/dist/lib/upload.js +43 -0
  46. package/dist/lib/upload.js.map +1 -0
  47. package/dist/types.d.ts +168 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +63 -0
@@ -0,0 +1,43 @@
1
+ import fs from "node:fs";
2
+ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
3
+ export async function uploadToS3(config, results, _projectRoot) {
4
+ if (!config.publish) {
5
+ throw new Error("publish config is required for S3 upload");
6
+ }
7
+ const client = new S3Client({});
8
+ const uploadResults = [];
9
+ for (const result of results) {
10
+ const imagePath = result.annotatedPath;
11
+ if (!fs.existsSync(imagePath)) {
12
+ console.warn(`Image not found, skipping: ${imagePath}`);
13
+ continue;
14
+ }
15
+ const body = fs.readFileSync(imagePath);
16
+ const key = `${result.id}/latest.png`;
17
+ await client.send(new PutObjectCommand({
18
+ Bucket: config.publish.cdnBucket,
19
+ Key: key,
20
+ Body: body,
21
+ ContentType: "image/png",
22
+ CacheControl: "no-cache",
23
+ }));
24
+ // Also upload with timestamp for history
25
+ const historyKey = `${result.id}/${result.timestamp}.png`;
26
+ await client.send(new PutObjectCommand({
27
+ Bucket: config.publish.cdnBucket,
28
+ Key: historyKey,
29
+ Body: body,
30
+ ContentType: "image/png",
31
+ }));
32
+ const url = `${config.publish.cdnBaseUrl}/${key}`;
33
+ uploadResults.push({
34
+ id: result.id,
35
+ url,
36
+ bucket: config.publish.cdnBucket ?? "",
37
+ key,
38
+ });
39
+ console.log(` Uploaded: ${result.id} → ${url}`);
40
+ }
41
+ return uploadResults;
42
+ }
43
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAUhE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,MAAuB,EACvB,OAAwB,EACxB,YAAoB;IAEpB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;YACxD,SAAS;QACV,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,EAAE,aAAa,CAAC;QAEtC,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,gBAAgB,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YAChC,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,WAAW;YACxB,YAAY,EAAE,UAAU;SACxB,CAAC,CACF,CAAC;QAEF,yCAAyC;QACzC,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,MAAM,CAAC;QAC1D,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,gBAAgB,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YAChC,GAAG,EAAE,UAAU;YACf,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,WAAW;SACxB,CAAC,CACF,CAAC;QAEF,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;QAClD,aAAa,CAAC,IAAI,CAAC;YAClB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,GAAG;YACH,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE;YACtC,GAAG;SACH,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,aAAa,CAAC;AACtB,CAAC"}
@@ -0,0 +1,168 @@
1
+ export interface KagemushaConfig {
2
+ app: {
3
+ baseUrl: string;
4
+ };
5
+ auth?: {
6
+ loginUrl: string;
7
+ steps: CaptureAction[];
8
+ };
9
+ screenshot: {
10
+ defaultViewport: Viewport;
11
+ defaultDiffThreshold: number;
12
+ };
13
+ publish?: {
14
+ destination: "local" | "s3" | "intercom";
15
+ outputDir?: string;
16
+ cdnBucket?: string;
17
+ cdnBaseUrl?: string;
18
+ };
19
+ routing?: Route[];
20
+ notification?: {
21
+ slack?: {
22
+ webhookUrl: string;
23
+ };
24
+ };
25
+ }
26
+ export interface Route {
27
+ pattern: string;
28
+ screenshots: string[];
29
+ }
30
+ export interface Viewport {
31
+ width: number;
32
+ height: number;
33
+ deviceScaleFactor?: number;
34
+ }
35
+ export interface ScreenshotDefinition {
36
+ id: string;
37
+ name: string;
38
+ url: string;
39
+ urlParams?: Record<string, string>;
40
+ viewport?: Viewport;
41
+ beforeCapture?: CaptureAction[];
42
+ capture: CaptureConfig;
43
+ decorations?: Decoration[];
44
+ hideElements?: string[];
45
+ intercom?: {
46
+ articleId: string;
47
+ imageSelector?: string;
48
+ };
49
+ }
50
+ export type CaptureAction = {
51
+ action: "click";
52
+ selector: string;
53
+ } | {
54
+ action: "type";
55
+ selector: string;
56
+ text: string;
57
+ } | {
58
+ action: "select";
59
+ selector: string;
60
+ value: string;
61
+ } | {
62
+ action: "hover";
63
+ selector: string;
64
+ } | {
65
+ action: "scroll";
66
+ selector?: string;
67
+ y: number;
68
+ } | {
69
+ action: "wait";
70
+ ms: number;
71
+ } | {
72
+ action: "waitForSelector";
73
+ selector: string;
74
+ timeout?: number;
75
+ } | {
76
+ action: "waitForNavigation";
77
+ timeout?: number;
78
+ } | {
79
+ action: "evaluate";
80
+ script: string;
81
+ };
82
+ export type CaptureConfig = {
83
+ mode: "fullPage";
84
+ } | {
85
+ mode: "selector";
86
+ selector: string;
87
+ } | {
88
+ mode: "crop";
89
+ crop: {
90
+ start: {
91
+ x: number;
92
+ y: number;
93
+ };
94
+ end: {
95
+ x: number;
96
+ y: number;
97
+ };
98
+ };
99
+ };
100
+ export type Decoration = RectDecoration | ArrowDecoration | LabelDecoration;
101
+ export interface RectDecoration {
102
+ type: "rect";
103
+ target: {
104
+ selector: string;
105
+ } | {
106
+ x: number;
107
+ y: number;
108
+ width: number;
109
+ height: number;
110
+ };
111
+ style?: {
112
+ color?: string;
113
+ strokeWidth?: number;
114
+ borderRadius?: number;
115
+ };
116
+ }
117
+ export interface ArrowDecoration {
118
+ type: "arrow";
119
+ from: {
120
+ x: number;
121
+ y: number;
122
+ } | {
123
+ selector: string;
124
+ anchor?: string;
125
+ };
126
+ to: {
127
+ x: number;
128
+ y: number;
129
+ } | {
130
+ selector: string;
131
+ anchor?: string;
132
+ };
133
+ style?: {
134
+ color?: string;
135
+ strokeWidth?: number;
136
+ };
137
+ }
138
+ export interface LabelDecoration {
139
+ type: "label";
140
+ text: string;
141
+ position: {
142
+ x: number;
143
+ y: number;
144
+ } | {
145
+ selector: string;
146
+ anchor?: string;
147
+ };
148
+ style?: {
149
+ fontSize?: number;
150
+ color?: string;
151
+ background?: string;
152
+ };
153
+ }
154
+ export interface CaptureResult {
155
+ id: string;
156
+ rawPath: string;
157
+ annotatedPath: string;
158
+ timestamp: string;
159
+ }
160
+ export interface CompareResult {
161
+ id: string;
162
+ status: "unchanged" | "minor" | "changed";
163
+ diffRate: number;
164
+ beforePath?: string;
165
+ afterPath?: string;
166
+ diffPath?: string;
167
+ }
168
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@wasao/kagemusha",
3
+ "version": "0.1.0",
4
+ "description": "Auto-update help center screenshots when your code changes. The shadow warrior for your documentation.",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./dist/index.js"
8
+ },
9
+ "bin": {
10
+ "kagemusha": "dist/index.js"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "bun --watch src/index.ts",
18
+ "typecheck": "tsc --noEmit",
19
+ "lint": "bunx biome check .",
20
+ "format": "bunx biome format --write .",
21
+ "test": "bun test",
22
+ "prepare": "husky",
23
+ "prepublishOnly": "bun run build"
24
+ },
25
+ "keywords": [
26
+ "screenshot",
27
+ "documentation",
28
+ "help-center",
29
+ "intercom",
30
+ "playwright",
31
+ "vrt",
32
+ "visual-regression",
33
+ "automation"
34
+ ],
35
+ "author": "iwasawahideto",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/iwasawahideto/kagemusha.git"
40
+ },
41
+ "engines": {
42
+ "node": ">=18"
43
+ },
44
+ "dependencies": {
45
+ "@aws-sdk/client-s3": "^3.700.0",
46
+ "chalk": "^5.4.0",
47
+ "commander": "^13.0.0",
48
+ "glob": "^11.0.0",
49
+ "inquirer": "^12.0.0",
50
+ "playwright-chromium": "^1.50.0",
51
+ "sharp": "^0.34.5",
52
+ "yaml": "^2.7.0"
53
+ },
54
+ "devDependencies": {
55
+ "@biomejs/biome": "^2.4.12",
56
+ "@types/bun": "latest",
57
+ "@types/inquirer": "^9.0.0",
58
+ "@types/node": "^22.0.0",
59
+ "@types/sharp": "^0.32.0",
60
+ "husky": "^9.1.7",
61
+ "typescript": "^5.7.0"
62
+ }
63
+ }