@hitslop/shots 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 (151) hide show
  1. package/SKILL.md +536 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +113 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/auth.d.ts +7 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +106 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/crop.d.ts +5 -0
  11. package/dist/commands/crop.d.ts.map +1 -0
  12. package/dist/commands/crop.js +32 -0
  13. package/dist/commands/crop.js.map +1 -0
  14. package/dist/commands/default.d.ts +2 -0
  15. package/dist/commands/default.d.ts.map +1 -0
  16. package/dist/commands/default.js +142 -0
  17. package/dist/commands/default.js.map +1 -0
  18. package/dist/commands/feedback.d.ts +2 -0
  19. package/dist/commands/feedback.d.ts.map +1 -0
  20. package/dist/commands/feedback.js +6 -0
  21. package/dist/commands/feedback.js.map +1 -0
  22. package/dist/commands/generate.d.ts +3 -0
  23. package/dist/commands/generate.d.ts.map +1 -0
  24. package/dist/commands/generate.js +5 -0
  25. package/dist/commands/generate.js.map +1 -0
  26. package/dist/commands/init.d.ts +2 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +5 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/install.d.ts +2 -0
  31. package/dist/commands/install.d.ts.map +1 -0
  32. package/dist/commands/install.js +13 -0
  33. package/dist/commands/install.js.map +1 -0
  34. package/dist/commands/scrape.d.ts +5 -0
  35. package/dist/commands/scrape.d.ts.map +1 -0
  36. package/dist/commands/scrape.js +5 -0
  37. package/dist/commands/scrape.js.map +1 -0
  38. package/dist/commands/studio.d.ts +7 -0
  39. package/dist/commands/studio.d.ts.map +1 -0
  40. package/dist/commands/studio.js +351 -0
  41. package/dist/commands/studio.js.map +1 -0
  42. package/dist/commands/styles.d.ts +2 -0
  43. package/dist/commands/styles.d.ts.map +1 -0
  44. package/dist/commands/styles.js +25 -0
  45. package/dist/commands/styles.js.map +1 -0
  46. package/dist/commands/view.d.ts +2 -0
  47. package/dist/commands/view.d.ts.map +1 -0
  48. package/dist/commands/view.js +25 -0
  49. package/dist/commands/view.js.map +1 -0
  50. package/dist/core/crop-pipeline.d.ts +28 -0
  51. package/dist/core/crop-pipeline.d.ts.map +1 -0
  52. package/dist/core/crop-pipeline.js +82 -0
  53. package/dist/core/crop-pipeline.js.map +1 -0
  54. package/dist/core/generate.d.ts +20 -0
  55. package/dist/core/generate.d.ts.map +1 -0
  56. package/dist/core/generate.js +388 -0
  57. package/dist/core/generate.js.map +1 -0
  58. package/dist/core/init.d.ts +3 -0
  59. package/dist/core/init.d.ts.map +1 -0
  60. package/dist/core/init.js +77 -0
  61. package/dist/core/init.js.map +1 -0
  62. package/dist/core/mock-generator.d.ts +5 -0
  63. package/dist/core/mock-generator.d.ts.map +1 -0
  64. package/dist/core/mock-generator.js +42 -0
  65. package/dist/core/mock-generator.js.map +1 -0
  66. package/dist/core/prompt-builder.d.ts +15 -0
  67. package/dist/core/prompt-builder.d.ts.map +1 -0
  68. package/dist/core/prompt-builder.js +195 -0
  69. package/dist/core/prompt-builder.js.map +1 -0
  70. package/dist/core/providers/fal.d.ts +3 -0
  71. package/dist/core/providers/fal.d.ts.map +1 -0
  72. package/dist/core/providers/fal.js +53 -0
  73. package/dist/core/providers/fal.js.map +1 -0
  74. package/dist/core/providers/index.d.ts +3 -0
  75. package/dist/core/providers/index.d.ts.map +1 -0
  76. package/dist/core/providers/index.js +2 -0
  77. package/dist/core/providers/index.js.map +1 -0
  78. package/dist/core/providers/managed.d.ts +3 -0
  79. package/dist/core/providers/managed.d.ts.map +1 -0
  80. package/dist/core/providers/managed.js +132 -0
  81. package/dist/core/providers/managed.js.map +1 -0
  82. package/dist/core/providers/openai.d.ts +3 -0
  83. package/dist/core/providers/openai.d.ts.map +1 -0
  84. package/dist/core/providers/openai.js +40 -0
  85. package/dist/core/providers/openai.js.map +1 -0
  86. package/dist/core/providers/replicate.d.ts +3 -0
  87. package/dist/core/providers/replicate.d.ts.map +1 -0
  88. package/dist/core/providers/replicate.js +87 -0
  89. package/dist/core/providers/replicate.js.map +1 -0
  90. package/dist/core/providers/resolve.d.ts +3 -0
  91. package/dist/core/providers/resolve.d.ts.map +1 -0
  92. package/dist/core/providers/resolve.js +41 -0
  93. package/dist/core/providers/resolve.js.map +1 -0
  94. package/dist/core/providers/types.d.ts +29 -0
  95. package/dist/core/providers/types.d.ts.map +1 -0
  96. package/dist/core/providers/types.js +2 -0
  97. package/dist/core/providers/types.js.map +1 -0
  98. package/dist/core/scraper.d.ts +22 -0
  99. package/dist/core/scraper.d.ts.map +1 -0
  100. package/dist/core/scraper.js +138 -0
  101. package/dist/core/scraper.js.map +1 -0
  102. package/dist/core/walkthrough.d.ts +10 -0
  103. package/dist/core/walkthrough.d.ts.map +1 -0
  104. package/dist/core/walkthrough.js +116 -0
  105. package/dist/core/walkthrough.js.map +1 -0
  106. package/dist/schema/config.d.ts +45 -0
  107. package/dist/schema/config.d.ts.map +1 -0
  108. package/dist/schema/config.js +36 -0
  109. package/dist/schema/config.js.map +1 -0
  110. package/dist/schema/manifest.d.ts +43 -0
  111. package/dist/schema/manifest.d.ts.map +1 -0
  112. package/dist/schema/manifest.js +5 -0
  113. package/dist/schema/manifest.js.map +1 -0
  114. package/dist/schema/style-meta.d.ts +8 -0
  115. package/dist/schema/style-meta.d.ts.map +1 -0
  116. package/dist/schema/style-meta.js +2 -0
  117. package/dist/schema/style-meta.js.map +1 -0
  118. package/dist/styles/installer.d.ts +2 -0
  119. package/dist/styles/installer.d.ts.map +1 -0
  120. package/dist/styles/installer.js +43 -0
  121. package/dist/styles/installer.js.map +1 -0
  122. package/dist/styles/registry.d.ts +20 -0
  123. package/dist/styles/registry.d.ts.map +1 -0
  124. package/dist/styles/registry.js +96 -0
  125. package/dist/styles/registry.js.map +1 -0
  126. package/dist/util/auth-store.d.ts +12 -0
  127. package/dist/util/auth-store.d.ts.map +1 -0
  128. package/dist/util/auth-store.js +46 -0
  129. package/dist/util/auth-store.js.map +1 -0
  130. package/dist/util/id.d.ts +2 -0
  131. package/dist/util/id.d.ts.map +1 -0
  132. package/dist/util/id.js +14 -0
  133. package/dist/util/id.js.map +1 -0
  134. package/dist/util/json.d.ts +3 -0
  135. package/dist/util/json.d.ts.map +1 -0
  136. package/dist/util/json.js +9 -0
  137. package/dist/util/json.js.map +1 -0
  138. package/dist/util/open.d.ts +2 -0
  139. package/dist/util/open.d.ts.map +1 -0
  140. package/dist/util/open.js +21 -0
  141. package/dist/util/open.js.map +1 -0
  142. package/dist/util/paths.d.ts +9 -0
  143. package/dist/util/paths.d.ts.map +1 -0
  144. package/dist/util/paths.js +21 -0
  145. package/dist/util/paths.js.map +1 -0
  146. package/package.json +37 -0
  147. package/studio/assets/index-BgiuT_Mv.css +1 -0
  148. package/studio/assets/index-DnN633_x.js +9 -0
  149. package/studio/index.html +13 -0
  150. package/styles/clean-premium/meta.json +7 -0
  151. package/styles/clean-premium/prompt.md +16 -0
@@ -0,0 +1,7 @@
1
+ export declare function authStatusCommand(): Promise<void>;
2
+ export declare function authLoginCommand(options: {
3
+ apiKey?: string;
4
+ apiUrl?: string;
5
+ }): Promise<void>;
6
+ export declare function authLogoutCommand(): Promise<void>;
7
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AASA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BvD;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhB;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGvD"}
@@ -0,0 +1,106 @@
1
+ import { clearManagedAuth, defaultApiUrl, readManagedAuth, writeManagedAuth } from "../util/auth-store.js";
2
+ export async function authStatusCommand() {
3
+ const managed = await readManagedAuth();
4
+ if (managed) {
5
+ console.log(`Managed: configured (${managed.apiUrl})`);
6
+ const usage = await fetchManagedUsage(managed.apiUrl, managed.apiKey);
7
+ if (usage.ok) {
8
+ console.log(`Managed plan: ${usage.value.plan}`);
9
+ console.log(`Managed usage: ${usage.value.used}/${usage.value.limit}${usage.value.period ? ` (${usage.value.period})` : ""}`);
10
+ }
11
+ else {
12
+ console.log(`Managed status: ${usage.error}`);
13
+ }
14
+ }
15
+ else {
16
+ console.log("Managed: not configured");
17
+ }
18
+ if (process.env.OPENAI_API_KEY) {
19
+ console.log("BYOK OpenAI: configured");
20
+ }
21
+ else {
22
+ console.log("BYOK OpenAI: missing OPENAI_API_KEY");
23
+ }
24
+ if (process.env.FAL_KEY) {
25
+ console.log("BYOK fal.ai: configured");
26
+ }
27
+ else {
28
+ console.log("BYOK fal.ai: missing FAL_KEY");
29
+ }
30
+ }
31
+ export async function authLoginCommand(options) {
32
+ if (!options.apiKey) {
33
+ console.log("Open the Shots dashboard, create a CLI API key, then run:");
34
+ console.log(" npx -y @hitslop/shots@latest auth login --api-key <key>");
35
+ console.log("");
36
+ console.log(`Default API URL: ${defaultApiUrl()}`);
37
+ return;
38
+ }
39
+ const apiUrl = options.apiUrl || defaultApiUrl();
40
+ const usage = await fetchManagedUsage(apiUrl, options.apiKey);
41
+ if (!usage.ok) {
42
+ throw new Error(`Managed auth failed: ${usage.error}`);
43
+ }
44
+ await writeManagedAuth({
45
+ apiKey: options.apiKey,
46
+ apiUrl,
47
+ createdAt: new Date().toISOString(),
48
+ });
49
+ console.log(`Managed auth saved for ${apiUrl}`);
50
+ console.log(`Plan: ${usage.value.plan}`);
51
+ console.log(`Usage: ${usage.value.used}/${usage.value.limit}${usage.value.period ? ` (${usage.value.period})` : ""}`);
52
+ }
53
+ export async function authLogoutCommand() {
54
+ await clearManagedAuth();
55
+ console.log("Managed auth cleared.");
56
+ }
57
+ async function fetchManagedUsage(apiUrl, apiKey) {
58
+ const controller = new AbortController();
59
+ const timeout = setTimeout(() => controller.abort(), 8000);
60
+ try {
61
+ const response = await fetch(`${apiUrl}/api/v1/usage`, {
62
+ headers: { Authorization: `Bearer ${apiKey}` },
63
+ signal: controller.signal,
64
+ });
65
+ if (!response.ok) {
66
+ return { ok: false, error: `${response.status} ${await responseText(response)}` };
67
+ }
68
+ const body = (await response.json());
69
+ if (typeof body.plan !== "string" ||
70
+ typeof body.used !== "number" ||
71
+ typeof body.limit !== "number") {
72
+ return { ok: false, error: "usage response was malformed" };
73
+ }
74
+ return {
75
+ ok: true,
76
+ value: {
77
+ plan: body.plan,
78
+ used: body.used,
79
+ limit: body.limit,
80
+ period: typeof body.period === "string" ? body.period : undefined,
81
+ },
82
+ };
83
+ }
84
+ catch (error) {
85
+ return {
86
+ ok: false,
87
+ error: error instanceof Error ? error.message : String(error),
88
+ };
89
+ }
90
+ finally {
91
+ clearTimeout(timeout);
92
+ }
93
+ }
94
+ async function responseText(response) {
95
+ const text = await response.text();
96
+ try {
97
+ const parsed = JSON.parse(text);
98
+ if (typeof parsed.error === "string")
99
+ return parsed.error;
100
+ }
101
+ catch {
102
+ // Plain text is fine.
103
+ }
104
+ return text || response.statusText;
105
+ }
106
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type AppStorePlatform } from "../core/crop-pipeline.js";
2
+ export declare function cropCommand(runId: string, options?: {
3
+ platform?: AppStorePlatform;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=crop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop.d.ts","sourceRoot":"","sources":["../../src/commands/crop.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGhF,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BzG"}
@@ -0,0 +1,32 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { cropAndResize } from "../core/crop-pipeline.js";
4
+ import { shotsDir } from "../util/paths.js";
5
+ export async function cropCommand(runId, options) {
6
+ const dir = shotsDir();
7
+ const runDir = path.join(dir, "runs", runId);
8
+ const compositePath = path.join(runDir, "composite.png");
9
+ const screenshotsDir = path.join(runDir, "screenshots");
10
+ const metadataPath = path.join(runDir, "metadata.json");
11
+ let platform = options?.platform;
12
+ let panelCount = 3;
13
+ try {
14
+ const metadata = JSON.parse(await fs.readFile(metadataPath, "utf-8"));
15
+ platform = platform ?? metadata.dimensions?.platform;
16
+ panelCount = metadata.panelCount ?? panelCount;
17
+ }
18
+ catch {
19
+ platform = platform ?? "iphone";
20
+ }
21
+ const composite = await fs.readFile(compositePath);
22
+ const files = await cropAndResize(composite, runId, panelCount, {
23
+ outputDir: screenshotsDir,
24
+ manifestPrefix: `runs/${runId}/screenshots`,
25
+ platform,
26
+ });
27
+ console.log(`Cropped ${files.length} panel(s):`);
28
+ for (const file of files) {
29
+ console.log(` ${file}`);
30
+ }
31
+ }
32
+ //# sourceMappingURL=crop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop.js","sourceRoot":"","sources":["../../src/commands/crop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAyB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,OAAyC;IACxF,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAExD,IAAI,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;IACjC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAGnE,CAAC;QACF,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;QACrD,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,UAAU,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC;IAClC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;QAC9D,SAAS,EAAE,cAAc;QACzB,cAAc,EAAE,QAAQ,KAAK,cAAc;QAC3C,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function defaultCommand(): Promise<void>;
2
+ //# sourceMappingURL=default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../src/commands/default.ts"],"names":[],"mappings":"AAuEA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAoDpD"}
@@ -0,0 +1,142 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { spawn } from "node:child_process";
4
+ import chalk from "chalk";
5
+ import select from "@inquirer/select";
6
+ import { initWorkspace } from "../core/init.js";
7
+ import { runWalkthrough } from "../core/walkthrough.js";
8
+ import { shotsDir } from "../util/paths.js";
9
+ import { openPath } from "../util/open.js";
10
+ // ---------------------------------------------------------------------------
11
+ // Helpers
12
+ // ---------------------------------------------------------------------------
13
+ function buildAgentPrompt(opts) {
14
+ const skillPath = opts.agent === "claude"
15
+ ? ".claude/skills/shots/SKILL.md"
16
+ : ".agents/skills/shots/SKILL.md";
17
+ const lines = [
18
+ "You are helping generate App Store screenshots using Shots.",
19
+ `Read and follow the Shots skill at ${skillPath}.`,
20
+ "",
21
+ "Start by preparing the workspace, not by generating immediately:",
22
+ "- Read .shots/config.json",
23
+ "- Inspect local source/docs if they exist, but work even if this is not inside an app repo",
24
+ "- Use App Store metadata, current app screenshots, inspiration, and live web research when useful",
25
+ "- Fill as much of .shots/config.json as you can confidently",
26
+ "- Ask the user concise follow-up questions only for missing or uncertain inputs",
27
+ "- Draft benefits/panels and get approval before generating",
28
+ "",
29
+ `The user wants ${opts.screenshotCount} screenshot panels.`,
30
+ ];
31
+ if (opts.featuresToHighlight) {
32
+ lines.push(`Features to highlight: ${opts.featuresToHighlight}`);
33
+ }
34
+ if (opts.aestheticGuidance) {
35
+ lines.push(`Visual direction: ${opts.aestheticGuidance}`);
36
+ }
37
+ lines.push("", "When you are ready to generate and the user has approved the plan, use these commands:");
38
+ const runs = Math.ceil(opts.screenshotCount / 3);
39
+ if (runs === 1) {
40
+ lines.push(` npx -y @hitslop/shots@latest generate --prompt "your detailed prompt" --panels ${opts.screenshotCount}`);
41
+ }
42
+ else {
43
+ for (let i = 0; i < runs; i++) {
44
+ const panelsThisRun = Math.min(3, opts.screenshotCount - i * 3);
45
+ const start = i * 3 + 1;
46
+ const end = start + panelsThisRun - 1;
47
+ lines.push(` npx -y @hitslop/shots@latest generate --prompt "Panels ${start}-${end}: ..." --panels ${panelsThisRun} --set-name "batch-${i + 1}"`);
48
+ }
49
+ }
50
+ return lines.join("\n");
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // Main command
54
+ // ---------------------------------------------------------------------------
55
+ export async function defaultCommand() {
56
+ const dir = shotsDir();
57
+ // Init if needed
58
+ let needsInit = false;
59
+ try {
60
+ await fs.access(dir);
61
+ }
62
+ catch {
63
+ needsInit = true;
64
+ }
65
+ if (needsInit) {
66
+ const result = await runWalkthrough();
67
+ await initWorkspace(result.config);
68
+ // Download screenshots if scrape found them
69
+ if (result.downloadScreenshots &&
70
+ result.config.scrapedAssets?.screenshotUrls?.length) {
71
+ const screenshotDir = path.join(dir, "app-screenshots");
72
+ await fs.mkdir(screenshotDir, { recursive: true });
73
+ console.log("\nDownloading screenshots...");
74
+ const urls = result.config.scrapedAssets.screenshotUrls;
75
+ for (let i = 0; i < urls.length; i++) {
76
+ try {
77
+ const response = await fetch(urls[i]);
78
+ if (!response.ok)
79
+ throw new Error(`HTTP ${response.status}`);
80
+ const buffer = Buffer.from(await response.arrayBuffer());
81
+ const ext = path.extname(new URL(urls[i]).pathname) || ".png";
82
+ const filename = `app-screenshot-${i + 1}${ext}`;
83
+ await fs.writeFile(path.join(screenshotDir, filename), buffer);
84
+ console.log(` Downloaded: ${filename}`);
85
+ }
86
+ catch (err) {
87
+ console.warn(` Failed to download screenshot ${i + 1}: ${err}`);
88
+ }
89
+ }
90
+ }
91
+ await launchWorkspaceFlow({
92
+ screenshotCount: result.screenshotCount,
93
+ featuresToHighlight: result.featuresToHighlight,
94
+ aestheticGuidance: result.aestheticGuidance,
95
+ });
96
+ return;
97
+ }
98
+ await launchWorkspaceFlow({
99
+ screenshotCount: 3,
100
+ featuresToHighlight: "",
101
+ aestheticGuidance: "",
102
+ });
103
+ }
104
+ async function launchWorkspaceFlow(opts) {
105
+ const dir = shotsDir();
106
+ console.log(chalk.bold("\nOpening your Shots workspace...\n"));
107
+ if (!openPath(dir)) {
108
+ console.log(chalk.dim(` Could not open folder automatically: ${dir}\n`));
109
+ }
110
+ console.log(chalk.yellow("Add files here before generating:\n"));
111
+ console.log(chalk.white(` App screenshots: ${path.join(dir, "app-screenshots")}`));
112
+ console.log(chalk.white(` Inspiration: ${path.join(dir, "inspo")}`));
113
+ console.log(chalk.white(` Config: ${path.join(dir, "config.json")}\n`));
114
+ console.log(chalk.dim("Drag current App Store screenshots into app-screenshots/ and design inspo into inspo/. The agent will research and fill config.json as far as it can.\n"));
115
+ const choice = await select({
116
+ message: "How would you like to continue?",
117
+ choices: [
118
+ { name: "Claude Code", value: "claude", description: "Launch Claude Code with the Shots workflow" },
119
+ { name: "Codex", value: "codex", description: "Launch OpenAI Codex with the Shots workflow" },
120
+ { name: "Skip", value: "skip", description: "Leave the workspace open and work manually" },
121
+ ],
122
+ });
123
+ if (choice === "skip") {
124
+ console.log(chalk.dim("\nSkipped. Generate later with:"));
125
+ console.log(chalk.white(" npx -y @hitslop/shots@latest generate --prompt \"your prompt here\"\n"));
126
+ return;
127
+ }
128
+ const prompt = buildAgentPrompt({
129
+ agent: choice,
130
+ screenshotCount: opts.screenshotCount,
131
+ featuresToHighlight: opts.featuresToHighlight,
132
+ aestheticGuidance: opts.aestheticGuidance,
133
+ });
134
+ console.log(choice === "claude"
135
+ ? chalk.green("\nLaunching Claude Code...\n")
136
+ : chalk.blue("\nLaunching Codex...\n"));
137
+ const child = spawn(choice, [prompt], {
138
+ stdio: "inherit",
139
+ });
140
+ await new Promise((resolve) => child.on("close", () => resolve()));
141
+ }
142
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../src/commands/default.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,IAKzB;IACC,MAAM,SAAS,GACb,IAAI,CAAC,KAAK,KAAK,QAAQ;QACrB,CAAC,CAAC,+BAA+B;QACjC,CAAC,CAAC,+BAA+B,CAAC;IAEtC,MAAM,KAAK,GAAG;QACZ,6DAA6D;QAC7D,sCAAsC,SAAS,GAAG;QAClD,EAAE;QACF,kEAAkE;QAClE,2BAA2B;QAC3B,4FAA4F;QAC5F,mGAAmG;QACnG,6DAA6D;QAC7D,iFAAiF;QACjF,4DAA4D;QAC5D,EAAE;QACF,kBAAkB,IAAI,CAAC,eAAe,qBAAqB;KAC5D,CAAC;IAEF,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,wFAAwF,CACzF,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oFAAoF,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACzH,CAAC;SAAM,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,KAAK,GAAG,aAAa,GAAG,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,4DAA4D,KAAK,IAAI,GAAG,mBAAmB,aAAa,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrJ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IAEvB,iBAAiB;IACjB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,MAAM,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEnC,4CAA4C;QAC5C,IACE,MAAM,CAAC,mBAAmB;YAC1B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,EAAE,MAAM,EACnD,CAAC;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAE5C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC;YACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACtC,IAAI,CAAC,QAAQ,CAAC,EAAE;wBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;oBACzD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;oBAC9D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;oBACjD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;oBAC/D,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;gBAC3C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,mBAAmB,CAAC;YACxB,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;SAC5C,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,mBAAmB,CAAC;QACxB,eAAe,EAAE,CAAC;QAClB,mBAAmB,EAAE,EAAE;QACvB,iBAAiB,EAAE,EAAE;KACtB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAIlC;IACC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IAEvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,yJAAyJ,CAC1J,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO,EAAE,iCAAiC;QAC1C,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAiB,EAAE,WAAW,EAAE,4CAA4C,EAAE;YAC5G,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAgB,EAAE,WAAW,EAAE,6CAA6C,EAAE;YACtG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAe,EAAE,WAAW,EAAE,4CAA4C,EAAE;SACpG;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC,CAAC;QACpG,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC9B,KAAK,EAAE,MAAM;QACb,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;KAC1C,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CACT,MAAM,KAAK,QAAQ;QACjB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC;QAC7C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CACzC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;QACpC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function feedbackCommand(shotId: string, text: string): Promise<void>;
2
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,6 @@
1
+ import { appendFeedback } from "../core/generate.js";
2
+ export async function feedbackCommand(shotId, text) {
3
+ await appendFeedback(shotId, text);
4
+ console.log(`Feedback saved for ${shotId}.`);
5
+ }
6
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,IAAY;IAEZ,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,GAAG,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type GenerateOptions } from "../core/generate.js";
2
+ export declare function generateCommand(options: GenerateOptions): Promise<void>;
3
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAExE,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E"}
@@ -0,0 +1,5 @@
1
+ import { runGenerate } from "../core/generate.js";
2
+ export async function generateCommand(options) {
3
+ await runGenerate(options);
4
+ }
5
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAwB,MAAM,qBAAqB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjD"}
@@ -0,0 +1,5 @@
1
+ import { initWorkspace } from "../core/init.js";
2
+ export async function initCommand() {
3
+ await initWorkspace();
4
+ }
5
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function installCommand(styleName: string): Promise<void>;
2
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAEA,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE"}
@@ -0,0 +1,13 @@
1
+ import { installStyle } from "../styles/installer.js";
2
+ export async function installCommand(styleName) {
3
+ try {
4
+ await installStyle(styleName);
5
+ console.log(`Style "${styleName}" installed to .shots/styles/${styleName}/`);
6
+ console.log(`Set as active style in .shots/config.json`);
7
+ }
8
+ catch (err) {
9
+ console.error(err.message);
10
+ process.exit(1);
11
+ }
12
+ }
13
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB;IACpD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,UAAU,SAAS,gCAAgC,SAAS,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function scrapeCommand(url: string, options: {
2
+ downloadScreenshots?: boolean;
3
+ country?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=scrape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,5 @@
1
+ import { scrapeAndUpdateConfig } from "../core/scraper.js";
2
+ export async function scrapeCommand(url, options) {
3
+ await scrapeAndUpdateConfig(url, options);
4
+ }
5
+ //# sourceMappingURL=scrape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,OAA4D;IAE5D,MAAM,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface StudioOptions {
2
+ host?: string;
3
+ port?: number;
4
+ open?: boolean;
5
+ }
6
+ export declare function studioCommand(options?: StudioOptions): Promise<void>;
7
+ //# sourceMappingURL=studio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA0XD,wBAAsB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9E"}