pinpatch 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -27,9 +27,10 @@ npx pinpatch@latest --help
27
27
  ## Quick Start
28
28
 
29
29
  1. Start your local app (example on `3000`).
30
- 2. Start Pinpatch:
30
+ 2. In another terminal, `cd` into your app's directory and start Pinpatch:
31
31
 
32
32
  ```bash
33
+ cd /path/to/your-app
33
34
  pinpatch dev --target 3000
34
35
  ```
35
36
 
package/dist/index.cjs CHANGED
@@ -72,6 +72,40 @@ var keyboardShortcutsHelp = [
72
72
  " Enter Submit from composer/follow-up textarea",
73
73
  " Shift+Enter Insert a newline in composer/follow-up textarea"
74
74
  ].join("\n");
75
+ var commandOptionsHelp = [
76
+ "Command options:",
77
+ " pinpatch dev [options]",
78
+ " --target <port> Target app localhost port (default: 3000)",
79
+ " --provider <name> Provider (codex|claude, default: codex)",
80
+ " --model <model> Model override (provider-aware default when omitted)",
81
+ " --bridge-port <port> Bridge API port (default: 7331)",
82
+ " --proxy-port <port> Reverse proxy port (default: 3030)",
83
+ " --debug Enable verbose logging",
84
+ "",
85
+ " pinpatch implement <taskId> [options]",
86
+ " --provider <name> Provider override for this run",
87
+ " --model <model> Model override for this run",
88
+ " --dry-run Run provider in dry-run mode",
89
+ " --debug Enable verbose logging",
90
+ "",
91
+ " pinpatch tasks [options]",
92
+ " --prune Prune expired logs and orphan sessions",
93
+ " --debug Enable verbose logging"
94
+ ].join("\n");
95
+ var defaultsAndConfigHelp = [
96
+ "Defaults and config precedence:",
97
+ " CLI flags > .pinpatch/config.json > built-in defaults",
98
+ " Provider default: codex",
99
+ " Model defaults: gpt-5.3-codex-spark (codex), sonnet (claude)"
100
+ ].join("\n");
101
+ var examplesHelp = [
102
+ "Examples:",
103
+ " pinpatch dev --target 3000",
104
+ " pinpatch dev --target 3000 --provider claude --model sonnet",
105
+ " pinpatch implement <taskId> --dry-run --provider codex",
106
+ " pinpatch tasks",
107
+ " pinpatch tasks --prune"
108
+ ].join("\n");
75
109
  var waitForSignal = async () => {
76
110
  await new Promise((resolve) => {
77
111
  const onSignal = () => {
@@ -342,11 +376,11 @@ program.name("pinpatch").description("Pinpatch CLI").version("0.1.0");
342
376
  program.addHelpText(
343
377
  "after",
344
378
  `
345
- Quick reference:
346
- pinpatch dev --target <port>
347
- pinpatch implement <taskId>
348
- pinpatch tasks
349
- pinpatch tasks --prune
379
+ ${commandOptionsHelp}
380
+
381
+ ${defaultsAndConfigHelp}
382
+
383
+ ${examplesHelp}
350
384
 
351
385
  ${keyboardShortcutsHelp}
352
386
  `
@@ -363,13 +397,19 @@ program.command("dev").description("Start Pinpatch bridge + proxy runtime").opti
363
397
  "--proxy-port <port>",
364
398
  "Proxy server port",
365
399
  (value) => Number.parseInt(value, 10)
366
- ).option("--debug", "Enable debug logs", false).action(async (options) => {
400
+ ).option("--debug", "Enable debug logs", false).addHelpText(
401
+ "after",
402
+ "\nProvider/model can be set via flags or .pinpatch/config.json. Flags take precedence."
403
+ ).action(async (options) => {
367
404
  await runDev(options);
368
405
  });
369
- program.command("implement").description("Execute a saved task through provider adapter").argument("<taskId>", "Task id").option("--provider <name>", "Provider name").option("--model <model>", "Provider model").option("--dry-run", "Do not apply provider edits", false).option("--debug", "Enable debug logs", false).action(async (taskId, options) => {
406
+ program.command("implement").description("Execute a saved task through provider adapter").argument("<taskId>", "Task id").option("--provider <name>", "Provider name").option("--model <model>", "Provider model").option("--dry-run", "Do not apply provider edits", false).option("--debug", "Enable debug logs", false).addHelpText(
407
+ "after",
408
+ "\nExample:\n pinpatch implement <taskId> --provider claude --model sonnet --dry-run"
409
+ ).action(async (taskId, options) => {
370
410
  await runImplement(taskId, options);
371
411
  });
372
- program.command("tasks").description("List or prune task/session artifacts").option("--prune", "Prune expired logs and orphan sessions", false).option("--debug", "Enable debug logs", false).action(async (options) => {
412
+ program.command("tasks").description("List or prune task/session artifacts").option("--prune", "Prune expired logs and orphan sessions", false).option("--debug", "Enable debug logs", false).addHelpText("after", "\nExample:\n pinpatch tasks --prune").action(async (options) => {
373
413
  await runTasks(options);
374
414
  });
375
415
  program.parseAsync(process.argv).catch((error) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport http from \"node:http\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n ArtifactStore,\n createBridgeServer,\n createLogger,\n generateSessionId,\n resolveConfig,\n TaskEventBus,\n TaskRunner,\n type ProviderName,\n} from \"@pinpatch/core\";\nimport { createProviderRegistry } from \"@pinpatch/providers\";\nimport { createReverseProxy } from \"@pinpatch/proxy\";\n\nconst cliEntrypointDir = process.argv[1]\n ? path.dirname(path.resolve(process.argv[1]))\n : process.cwd();\nconst packageRootFromCli = [\"bin\", \"dist\", \"src\"].includes(\n path.basename(cliEntrypointDir),\n)\n ? path.resolve(cliEntrypointDir, \"..\")\n : cliEntrypointDir;\nconst workspaceRootFromCli = path.resolve(packageRootFromCli, \"../..\");\n\nconst resolveRuntimeCwd = (): string => {\n const initCwd = process.env.INIT_CWD?.trim();\n if (initCwd) {\n const resolved = path.resolve(initCwd);\n if (existsSync(resolved)) {\n return resolved;\n }\n }\n\n const cwd = process.cwd();\n\n const workspaceRootFromCwd = path.resolve(cwd, \"../..\");\n const workspaceMarkerFromCwd = path.join(\n workspaceRootFromCwd,\n \"pnpm-workspace.yaml\",\n );\n const appearsToBeCliPackage =\n path.basename(cwd) === \"cli\" &&\n path.basename(path.dirname(cwd)) === \"packages\";\n if (appearsToBeCliPackage && existsSync(workspaceMarkerFromCwd)) {\n return workspaceRootFromCwd;\n }\n\n const workspaceMarker = path.join(\n workspaceRootFromCli,\n \"pnpm-workspace.yaml\",\n );\n if (cwd === packageRootFromCli && existsSync(workspaceMarker)) {\n return workspaceRootFromCli;\n }\n\n return cwd;\n};\n\ntype DevCommandOptions = {\n target?: number;\n provider?: ProviderName;\n model?: string;\n debug?: boolean;\n bridgePort?: number;\n proxyPort?: number;\n};\n\ntype ImplementCommandOptions = {\n provider?: ProviderName;\n model?: string;\n dryRun?: boolean;\n debug?: boolean;\n};\n\ntype TasksCommandOptions = {\n prune?: boolean;\n debug?: boolean;\n};\n\nconst keyboardShortcutsHelp = [\n \"Keyboard shortcuts (when using `pinpatch dev` in the proxied app):\",\n \" c Toggle pin mode\",\n \" Escape Exit pin mode and close the composer\",\n \" Cmd+Delete/Backspace Clear all pins (macOS)\",\n \" Ctrl+Delete/Backspace Clear all pins (Windows/Linux)\",\n \" Enter Submit from composer/follow-up textarea\",\n \" Shift+Enter Insert a newline in composer/follow-up textarea\",\n].join(\"\\n\");\n\nconst waitForSignal = async (): Promise<void> => {\n await new Promise<void>((resolve) => {\n const onSignal = () => {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n };\n\n process.on(\"SIGINT\", onSignal);\n process.on(\"SIGTERM\", onSignal);\n });\n};\n\nconst targetReachable = async (port: number): Promise<boolean> => {\n return await new Promise<boolean>((resolve) => {\n const request = http.get(\n {\n host: \"localhost\",\n port,\n path: \"/\",\n timeout: 1500,\n },\n () => {\n request.destroy();\n resolve(true);\n },\n );\n\n request.on(\"error\", () => resolve(false));\n request.on(\"timeout\", () => {\n request.destroy();\n resolve(false);\n });\n });\n};\n\nconst resolveOverlayBundlePath = (cwd: string): string | undefined => {\n const candidates = [\n process.env.PINPATCH_OVERLAY_SCRIPT_PATH,\n path.join(cwd, \"apps\", \"overlay\", \"dist\", \"pinpatch-overlay.iife.js\"),\n path.join(\n cwd,\n \"node_modules\",\n \"@pinpatch\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n packageRootFromCli,\n \"node_modules\",\n \"@pinpatch\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n workspaceRootFromCli,\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n resolveRuntimeCwd(),\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n ].filter((value): value is string => Boolean(value));\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n const maybeBuildOverlay = (workspaceRoot: string): string | undefined => {\n const overlayWorkspace = path.join(\n workspaceRoot,\n \"apps\",\n \"overlay\",\n \"package.json\",\n );\n if (!existsSync(overlayWorkspace)) {\n return undefined;\n }\n\n const output = spawnSync(\n \"pnpm\",\n [\"--filter\", \"@pinpatch/overlay\", \"build\"],\n {\n cwd: workspaceRoot,\n stdio: \"inherit\",\n },\n );\n\n if (output.status === 0) {\n const builtPath = path.join(\n workspaceRoot,\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n );\n if (existsSync(builtPath)) {\n return builtPath;\n }\n }\n\n return undefined;\n };\n\n const buildRoots = Array.from(new Set([cwd, workspaceRootFromCli]));\n for (const buildRoot of buildRoots) {\n const built = maybeBuildOverlay(buildRoot);\n if (built) {\n return built;\n }\n }\n\n return undefined;\n};\n\nconst runDev = async (options: DevCommandOptions): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n await store.ensureGitignoreEntry();\n\n const config = await resolveConfig(cwd, {\n provider: options.provider,\n model: options.model,\n target: options.target,\n debug: options.debug,\n bridgePort: options.bridgePort,\n proxyPort: options.proxyPort,\n });\n\n const logger = createLogger({\n store,\n component: \"cli\",\n debugEnabled: config.debug,\n });\n\n const reachable = await targetReachable(config.target);\n if (!reachable) {\n throw new Error(\n `Target localhost:${config.target} is unreachable. Start your app first and retry. Hint: lsof -i :${config.target}`,\n );\n }\n\n const overlayScriptPath = resolveOverlayBundlePath(cwd);\n\n const providerRegistry = createProviderRegistry([\"codex\", \"claude\"]);\n const bridge = createBridgeServer({\n cwd,\n port: config.bridgePort,\n store,\n logger,\n overlayScriptPath,\n getProviderAdapter: (provider) => providerRegistry.getAdapter(provider),\n });\n\n const proxy = createReverseProxy({\n targetPort: config.target,\n proxyPort: config.proxyPort,\n bridgePort: config.bridgePort,\n provider: config.provider,\n model: config.model,\n logger,\n });\n\n try {\n await bridge.start();\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EADDRINUSE\") {\n throw new Error(\n `Bridge port ${config.bridgePort} is already in use. Hint: lsof -i :${config.bridgePort}`,\n );\n }\n\n throw error;\n }\n\n try {\n await proxy.start();\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EADDRINUSE\") {\n await bridge.stop();\n throw new Error(\n `Proxy port ${config.proxyPort} is already in use. Hint: lsof -i :${config.proxyPort}`,\n );\n }\n\n await bridge.stop();\n throw error;\n }\n\n console.log(`Pinpatch dev ready`);\n console.log(`Target app: http://localhost:${config.target}`);\n console.log(`Proxied app: http://localhost:${config.proxyPort}`);\n console.log(`Bridge API: http://localhost:${config.bridgePort}`);\n\n await waitForSignal();\n\n await proxy.stop();\n await bridge.stop();\n};\n\nconst runImplement = async (\n taskId: string,\n options: ImplementCommandOptions,\n): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n await store.ensureGitignoreEntry();\n\n const config = await resolveConfig(cwd, {\n provider: options.provider,\n model: options.model,\n debug: options.debug,\n });\n\n const logger = createLogger({\n store,\n component: \"cli\",\n debugEnabled: config.debug,\n });\n\n const task = await store.getTask(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} was not found under .pinpatch/tasks`);\n }\n\n const providerRegistry = createProviderRegistry([\"codex\", \"claude\"]);\n const eventBus = new TaskEventBus();\n const runner = new TaskRunner({\n cwd,\n store,\n logger,\n eventBus,\n getProviderAdapter: (provider) => providerRegistry.getAdapter(provider),\n });\n\n const sessionId = generateSessionId();\n const result = await runner.runTask({\n taskId,\n sessionId,\n provider: config.provider,\n model: config.model,\n dryRun: Boolean(options.dryRun),\n debug: config.debug,\n });\n\n console.log(`Task ${taskId} -> ${result.status}`);\n console.log(result.summary);\n if (result.changedFiles.length > 0) {\n console.log(\"Changed files:\");\n for (const changedFile of result.changedFiles) {\n console.log(` - ${changedFile}`);\n }\n }\n\n if (result.status !== \"completed\") {\n process.exitCode = 1;\n }\n};\n\nconst runTasks = async (options: TasksCommandOptions): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n\n if (options.prune) {\n const result = await store.prune();\n console.log(`Pruned logs: ${result.removedLogs}`);\n console.log(`Pruned orphan sessions: ${result.removedSessions}`);\n return;\n }\n\n const tasks = await store.listTasks();\n tasks.sort(\n (left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt),\n );\n\n if (tasks.length === 0) {\n console.log(\"No tasks found in .pinpatch/tasks\");\n return;\n }\n\n console.table(\n tasks.map((task) => ({\n taskId: task.taskId,\n status: task.status,\n updatedAt: task.updatedAt,\n provider: task.provider ?? \"-\",\n model: task.model ?? \"-\",\n latestSessionId: task.latestSessionId ?? \"-\",\n })),\n );\n};\n\nconst program = new Command();\nprogram.name(\"pinpatch\").description(\"Pinpatch CLI\").version(\"0.1.0\");\nprogram.addHelpText(\n \"after\",\n `\\nQuick reference:\\n pinpatch dev --target <port>\\n pinpatch implement <taskId>\\n pinpatch tasks\\n pinpatch tasks --prune\\n\\n${keyboardShortcutsHelp}\\n`,\n);\n\nprogram\n .command(\"dev\")\n .description(\"Start Pinpatch bridge + proxy runtime\")\n .option(\"--target <port>\", \"Target app localhost port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--provider <name>\", \"Provider name (codex|claude)\")\n .option(\"--model <model>\", \"Provider model\")\n .option(\"--bridge-port <port>\", \"Bridge server port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--proxy-port <port>\", \"Proxy server port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--debug\", \"Enable debug logs\", false)\n .action(async (options: DevCommandOptions) => {\n await runDev(options);\n });\n\nprogram\n .command(\"implement\")\n .description(\"Execute a saved task through provider adapter\")\n .argument(\"<taskId>\", \"Task id\")\n .option(\"--provider <name>\", \"Provider name\")\n .option(\"--model <model>\", \"Provider model\")\n .option(\"--dry-run\", \"Do not apply provider edits\", false)\n .option(\"--debug\", \"Enable debug logs\", false)\n .action(async (taskId: string, options: ImplementCommandOptions) => {\n await runImplement(taskId, options);\n });\n\nprogram\n .command(\"tasks\")\n .description(\"List or prune task/session artifacts\")\n .option(\"--prune\", \"Prune expired logs and orphan sessions\", false)\n .option(\"--debug\", \"Enable debug logs\", false)\n .action(async (options: TasksCommandOptions) => {\n await runTasks(options);\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n"],"mappings":"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","names":["path","http"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport http from \"node:http\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n ArtifactStore,\n createBridgeServer,\n createLogger,\n generateSessionId,\n resolveConfig,\n TaskEventBus,\n TaskRunner,\n type ProviderName,\n} from \"@pinpatch/core\";\nimport { createProviderRegistry } from \"@pinpatch/providers\";\nimport { createReverseProxy } from \"@pinpatch/proxy\";\n\nconst cliEntrypointDir = process.argv[1]\n ? path.dirname(path.resolve(process.argv[1]))\n : process.cwd();\nconst packageRootFromCli = [\"bin\", \"dist\", \"src\"].includes(\n path.basename(cliEntrypointDir),\n)\n ? path.resolve(cliEntrypointDir, \"..\")\n : cliEntrypointDir;\nconst workspaceRootFromCli = path.resolve(packageRootFromCli, \"../..\");\n\nconst resolveRuntimeCwd = (): string => {\n const initCwd = process.env.INIT_CWD?.trim();\n if (initCwd) {\n const resolved = path.resolve(initCwd);\n if (existsSync(resolved)) {\n return resolved;\n }\n }\n\n const cwd = process.cwd();\n\n const workspaceRootFromCwd = path.resolve(cwd, \"../..\");\n const workspaceMarkerFromCwd = path.join(\n workspaceRootFromCwd,\n \"pnpm-workspace.yaml\",\n );\n const appearsToBeCliPackage =\n path.basename(cwd) === \"cli\" &&\n path.basename(path.dirname(cwd)) === \"packages\";\n if (appearsToBeCliPackage && existsSync(workspaceMarkerFromCwd)) {\n return workspaceRootFromCwd;\n }\n\n const workspaceMarker = path.join(\n workspaceRootFromCli,\n \"pnpm-workspace.yaml\",\n );\n if (cwd === packageRootFromCli && existsSync(workspaceMarker)) {\n return workspaceRootFromCli;\n }\n\n return cwd;\n};\n\ntype DevCommandOptions = {\n target?: number;\n provider?: ProviderName;\n model?: string;\n debug?: boolean;\n bridgePort?: number;\n proxyPort?: number;\n};\n\ntype ImplementCommandOptions = {\n provider?: ProviderName;\n model?: string;\n dryRun?: boolean;\n debug?: boolean;\n};\n\ntype TasksCommandOptions = {\n prune?: boolean;\n debug?: boolean;\n};\n\nconst keyboardShortcutsHelp = [\n \"Keyboard shortcuts (when using `pinpatch dev` in the proxied app):\",\n \" c Toggle pin mode\",\n \" Escape Exit pin mode and close the composer\",\n \" Cmd+Delete/Backspace Clear all pins (macOS)\",\n \" Ctrl+Delete/Backspace Clear all pins (Windows/Linux)\",\n \" Enter Submit from composer/follow-up textarea\",\n \" Shift+Enter Insert a newline in composer/follow-up textarea\",\n].join(\"\\n\");\n\nconst commandOptionsHelp = [\n \"Command options:\",\n \" pinpatch dev [options]\",\n \" --target <port> Target app localhost port (default: 3000)\",\n \" --provider <name> Provider (codex|claude, default: codex)\",\n \" --model <model> Model override (provider-aware default when omitted)\",\n \" --bridge-port <port> Bridge API port (default: 7331)\",\n \" --proxy-port <port> Reverse proxy port (default: 3030)\",\n \" --debug Enable verbose logging\",\n \"\",\n \" pinpatch implement <taskId> [options]\",\n \" --provider <name> Provider override for this run\",\n \" --model <model> Model override for this run\",\n \" --dry-run Run provider in dry-run mode\",\n \" --debug Enable verbose logging\",\n \"\",\n \" pinpatch tasks [options]\",\n \" --prune Prune expired logs and orphan sessions\",\n \" --debug Enable verbose logging\",\n].join(\"\\n\");\n\nconst defaultsAndConfigHelp = [\n \"Defaults and config precedence:\",\n \" CLI flags > .pinpatch/config.json > built-in defaults\",\n \" Provider default: codex\",\n \" Model defaults: gpt-5.3-codex-spark (codex), sonnet (claude)\",\n].join(\"\\n\");\n\nconst examplesHelp = [\n \"Examples:\",\n \" pinpatch dev --target 3000\",\n \" pinpatch dev --target 3000 --provider claude --model sonnet\",\n \" pinpatch implement <taskId> --dry-run --provider codex\",\n \" pinpatch tasks\",\n \" pinpatch tasks --prune\",\n].join(\"\\n\");\n\nconst waitForSignal = async (): Promise<void> => {\n await new Promise<void>((resolve) => {\n const onSignal = () => {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n };\n\n process.on(\"SIGINT\", onSignal);\n process.on(\"SIGTERM\", onSignal);\n });\n};\n\nconst targetReachable = async (port: number): Promise<boolean> => {\n return await new Promise<boolean>((resolve) => {\n const request = http.get(\n {\n host: \"localhost\",\n port,\n path: \"/\",\n timeout: 1500,\n },\n () => {\n request.destroy();\n resolve(true);\n },\n );\n\n request.on(\"error\", () => resolve(false));\n request.on(\"timeout\", () => {\n request.destroy();\n resolve(false);\n });\n });\n};\n\nconst resolveOverlayBundlePath = (cwd: string): string | undefined => {\n const candidates = [\n process.env.PINPATCH_OVERLAY_SCRIPT_PATH,\n path.join(cwd, \"apps\", \"overlay\", \"dist\", \"pinpatch-overlay.iife.js\"),\n path.join(\n cwd,\n \"node_modules\",\n \"@pinpatch\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n packageRootFromCli,\n \"node_modules\",\n \"@pinpatch\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n workspaceRootFromCli,\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n resolveRuntimeCwd(),\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n ].filter((value): value is string => Boolean(value));\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n const maybeBuildOverlay = (workspaceRoot: string): string | undefined => {\n const overlayWorkspace = path.join(\n workspaceRoot,\n \"apps\",\n \"overlay\",\n \"package.json\",\n );\n if (!existsSync(overlayWorkspace)) {\n return undefined;\n }\n\n const output = spawnSync(\n \"pnpm\",\n [\"--filter\", \"@pinpatch/overlay\", \"build\"],\n {\n cwd: workspaceRoot,\n stdio: \"inherit\",\n },\n );\n\n if (output.status === 0) {\n const builtPath = path.join(\n workspaceRoot,\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n );\n if (existsSync(builtPath)) {\n return builtPath;\n }\n }\n\n return undefined;\n };\n\n const buildRoots = Array.from(new Set([cwd, workspaceRootFromCli]));\n for (const buildRoot of buildRoots) {\n const built = maybeBuildOverlay(buildRoot);\n if (built) {\n return built;\n }\n }\n\n return undefined;\n};\n\nconst runDev = async (options: DevCommandOptions): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n await store.ensureGitignoreEntry();\n\n const config = await resolveConfig(cwd, {\n provider: options.provider,\n model: options.model,\n target: options.target,\n debug: options.debug,\n bridgePort: options.bridgePort,\n proxyPort: options.proxyPort,\n });\n\n const logger = createLogger({\n store,\n component: \"cli\",\n debugEnabled: config.debug,\n });\n\n const reachable = await targetReachable(config.target);\n if (!reachable) {\n throw new Error(\n `Target localhost:${config.target} is unreachable. Start your app first and retry. Hint: lsof -i :${config.target}`,\n );\n }\n\n const overlayScriptPath = resolveOverlayBundlePath(cwd);\n\n const providerRegistry = createProviderRegistry([\"codex\", \"claude\"]);\n const bridge = createBridgeServer({\n cwd,\n port: config.bridgePort,\n store,\n logger,\n overlayScriptPath,\n getProviderAdapter: (provider) => providerRegistry.getAdapter(provider),\n });\n\n const proxy = createReverseProxy({\n targetPort: config.target,\n proxyPort: config.proxyPort,\n bridgePort: config.bridgePort,\n provider: config.provider,\n model: config.model,\n logger,\n });\n\n try {\n await bridge.start();\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EADDRINUSE\") {\n throw new Error(\n `Bridge port ${config.bridgePort} is already in use. Hint: lsof -i :${config.bridgePort}`,\n );\n }\n\n throw error;\n }\n\n try {\n await proxy.start();\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EADDRINUSE\") {\n await bridge.stop();\n throw new Error(\n `Proxy port ${config.proxyPort} is already in use. Hint: lsof -i :${config.proxyPort}`,\n );\n }\n\n await bridge.stop();\n throw error;\n }\n\n console.log(`Pinpatch dev ready`);\n console.log(`Target app: http://localhost:${config.target}`);\n console.log(`Proxied app: http://localhost:${config.proxyPort}`);\n console.log(`Bridge API: http://localhost:${config.bridgePort}`);\n\n await waitForSignal();\n\n await proxy.stop();\n await bridge.stop();\n};\n\nconst runImplement = async (\n taskId: string,\n options: ImplementCommandOptions,\n): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n await store.ensureGitignoreEntry();\n\n const config = await resolveConfig(cwd, {\n provider: options.provider,\n model: options.model,\n debug: options.debug,\n });\n\n const logger = createLogger({\n store,\n component: \"cli\",\n debugEnabled: config.debug,\n });\n\n const task = await store.getTask(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} was not found under .pinpatch/tasks`);\n }\n\n const providerRegistry = createProviderRegistry([\"codex\", \"claude\"]);\n const eventBus = new TaskEventBus();\n const runner = new TaskRunner({\n cwd,\n store,\n logger,\n eventBus,\n getProviderAdapter: (provider) => providerRegistry.getAdapter(provider),\n });\n\n const sessionId = generateSessionId();\n const result = await runner.runTask({\n taskId,\n sessionId,\n provider: config.provider,\n model: config.model,\n dryRun: Boolean(options.dryRun),\n debug: config.debug,\n });\n\n console.log(`Task ${taskId} -> ${result.status}`);\n console.log(result.summary);\n if (result.changedFiles.length > 0) {\n console.log(\"Changed files:\");\n for (const changedFile of result.changedFiles) {\n console.log(` - ${changedFile}`);\n }\n }\n\n if (result.status !== \"completed\") {\n process.exitCode = 1;\n }\n};\n\nconst runTasks = async (options: TasksCommandOptions): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n\n if (options.prune) {\n const result = await store.prune();\n console.log(`Pruned logs: ${result.removedLogs}`);\n console.log(`Pruned orphan sessions: ${result.removedSessions}`);\n return;\n }\n\n const tasks = await store.listTasks();\n tasks.sort(\n (left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt),\n );\n\n if (tasks.length === 0) {\n console.log(\"No tasks found in .pinpatch/tasks\");\n return;\n }\n\n console.table(\n tasks.map((task) => ({\n taskId: task.taskId,\n status: task.status,\n updatedAt: task.updatedAt,\n provider: task.provider ?? \"-\",\n model: task.model ?? \"-\",\n latestSessionId: task.latestSessionId ?? \"-\",\n })),\n );\n};\n\nconst program = new Command();\nprogram.name(\"pinpatch\").description(\"Pinpatch CLI\").version(\"0.1.0\");\nprogram.addHelpText(\n \"after\",\n `\\n${commandOptionsHelp}\\n\\n${defaultsAndConfigHelp}\\n\\n${examplesHelp}\\n\\n${keyboardShortcutsHelp}\\n`,\n);\n\nprogram\n .command(\"dev\")\n .description(\"Start Pinpatch bridge + proxy runtime\")\n .option(\"--target <port>\", \"Target app localhost port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--provider <name>\", \"Provider name (codex|claude)\")\n .option(\"--model <model>\", \"Provider model\")\n .option(\"--bridge-port <port>\", \"Bridge server port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--proxy-port <port>\", \"Proxy server port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--debug\", \"Enable debug logs\", false)\n .addHelpText(\n \"after\",\n \"\\nProvider/model can be set via flags or .pinpatch/config.json. Flags take precedence.\",\n )\n .action(async (options: DevCommandOptions) => {\n await runDev(options);\n });\n\nprogram\n .command(\"implement\")\n .description(\"Execute a saved task through provider adapter\")\n .argument(\"<taskId>\", \"Task id\")\n .option(\"--provider <name>\", \"Provider name\")\n .option(\"--model <model>\", \"Provider model\")\n .option(\"--dry-run\", \"Do not apply provider edits\", false)\n .option(\"--debug\", \"Enable debug logs\", false)\n .addHelpText(\n \"after\",\n \"\\nExample:\\n pinpatch implement <taskId> --provider claude --model sonnet --dry-run\",\n )\n .action(async (taskId: string, options: ImplementCommandOptions) => {\n await runImplement(taskId, options);\n });\n\nprogram\n .command(\"tasks\")\n .description(\"List or prune task/session artifacts\")\n .option(\"--prune\", \"Prune expired logs and orphan sessions\", false)\n .option(\"--debug\", \"Enable debug logs\", false)\n .addHelpText(\"after\", \"\\nExample:\\n pinpatch tasks --prune\")\n .action(async (options: TasksCommandOptions) => {\n await runTasks(options);\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n"],"mappings":"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","names":["path","http"]}
package/dist/index.js CHANGED
@@ -56,6 +56,40 @@ var keyboardShortcutsHelp = [
56
56
  " Enter Submit from composer/follow-up textarea",
57
57
  " Shift+Enter Insert a newline in composer/follow-up textarea"
58
58
  ].join("\n");
59
+ var commandOptionsHelp = [
60
+ "Command options:",
61
+ " pinpatch dev [options]",
62
+ " --target <port> Target app localhost port (default: 3000)",
63
+ " --provider <name> Provider (codex|claude, default: codex)",
64
+ " --model <model> Model override (provider-aware default when omitted)",
65
+ " --bridge-port <port> Bridge API port (default: 7331)",
66
+ " --proxy-port <port> Reverse proxy port (default: 3030)",
67
+ " --debug Enable verbose logging",
68
+ "",
69
+ " pinpatch implement <taskId> [options]",
70
+ " --provider <name> Provider override for this run",
71
+ " --model <model> Model override for this run",
72
+ " --dry-run Run provider in dry-run mode",
73
+ " --debug Enable verbose logging",
74
+ "",
75
+ " pinpatch tasks [options]",
76
+ " --prune Prune expired logs and orphan sessions",
77
+ " --debug Enable verbose logging"
78
+ ].join("\n");
79
+ var defaultsAndConfigHelp = [
80
+ "Defaults and config precedence:",
81
+ " CLI flags > .pinpatch/config.json > built-in defaults",
82
+ " Provider default: codex",
83
+ " Model defaults: gpt-5.3-codex-spark (codex), sonnet (claude)"
84
+ ].join("\n");
85
+ var examplesHelp = [
86
+ "Examples:",
87
+ " pinpatch dev --target 3000",
88
+ " pinpatch dev --target 3000 --provider claude --model sonnet",
89
+ " pinpatch implement <taskId> --dry-run --provider codex",
90
+ " pinpatch tasks",
91
+ " pinpatch tasks --prune"
92
+ ].join("\n");
59
93
  var waitForSignal = async () => {
60
94
  await new Promise((resolve) => {
61
95
  const onSignal = () => {
@@ -326,11 +360,11 @@ program.name("pinpatch").description("Pinpatch CLI").version("0.1.0");
326
360
  program.addHelpText(
327
361
  "after",
328
362
  `
329
- Quick reference:
330
- pinpatch dev --target <port>
331
- pinpatch implement <taskId>
332
- pinpatch tasks
333
- pinpatch tasks --prune
363
+ ${commandOptionsHelp}
364
+
365
+ ${defaultsAndConfigHelp}
366
+
367
+ ${examplesHelp}
334
368
 
335
369
  ${keyboardShortcutsHelp}
336
370
  `
@@ -347,13 +381,19 @@ program.command("dev").description("Start Pinpatch bridge + proxy runtime").opti
347
381
  "--proxy-port <port>",
348
382
  "Proxy server port",
349
383
  (value) => Number.parseInt(value, 10)
350
- ).option("--debug", "Enable debug logs", false).action(async (options) => {
384
+ ).option("--debug", "Enable debug logs", false).addHelpText(
385
+ "after",
386
+ "\nProvider/model can be set via flags or .pinpatch/config.json. Flags take precedence."
387
+ ).action(async (options) => {
351
388
  await runDev(options);
352
389
  });
353
- program.command("implement").description("Execute a saved task through provider adapter").argument("<taskId>", "Task id").option("--provider <name>", "Provider name").option("--model <model>", "Provider model").option("--dry-run", "Do not apply provider edits", false).option("--debug", "Enable debug logs", false).action(async (taskId, options) => {
390
+ program.command("implement").description("Execute a saved task through provider adapter").argument("<taskId>", "Task id").option("--provider <name>", "Provider name").option("--model <model>", "Provider model").option("--dry-run", "Do not apply provider edits", false).option("--debug", "Enable debug logs", false).addHelpText(
391
+ "after",
392
+ "\nExample:\n pinpatch implement <taskId> --provider claude --model sonnet --dry-run"
393
+ ).action(async (taskId, options) => {
354
394
  await runImplement(taskId, options);
355
395
  });
356
- program.command("tasks").description("List or prune task/session artifacts").option("--prune", "Prune expired logs and orphan sessions", false).option("--debug", "Enable debug logs", false).action(async (options) => {
396
+ program.command("tasks").description("List or prune task/session artifacts").option("--prune", "Prune expired logs and orphan sessions", false).option("--debug", "Enable debug logs", false).addHelpText("after", "\nExample:\n pinpatch tasks --prune").action(async (options) => {
357
397
  await runTasks(options);
358
398
  });
359
399
  program.parseAsync(process.argv).catch((error) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport http from \"node:http\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n ArtifactStore,\n createBridgeServer,\n createLogger,\n generateSessionId,\n resolveConfig,\n TaskEventBus,\n TaskRunner,\n type ProviderName,\n} from \"@pinpatch/core\";\nimport { createProviderRegistry } from \"@pinpatch/providers\";\nimport { createReverseProxy } from \"@pinpatch/proxy\";\n\nconst cliEntrypointDir = process.argv[1]\n ? path.dirname(path.resolve(process.argv[1]))\n : process.cwd();\nconst packageRootFromCli = [\"bin\", \"dist\", \"src\"].includes(\n path.basename(cliEntrypointDir),\n)\n ? path.resolve(cliEntrypointDir, \"..\")\n : cliEntrypointDir;\nconst workspaceRootFromCli = path.resolve(packageRootFromCli, \"../..\");\n\nconst resolveRuntimeCwd = (): string => {\n const initCwd = process.env.INIT_CWD?.trim();\n if (initCwd) {\n const resolved = path.resolve(initCwd);\n if (existsSync(resolved)) {\n return resolved;\n }\n }\n\n const cwd = process.cwd();\n\n const workspaceRootFromCwd = path.resolve(cwd, \"../..\");\n const workspaceMarkerFromCwd = path.join(\n workspaceRootFromCwd,\n \"pnpm-workspace.yaml\",\n );\n const appearsToBeCliPackage =\n path.basename(cwd) === \"cli\" &&\n path.basename(path.dirname(cwd)) === \"packages\";\n if (appearsToBeCliPackage && existsSync(workspaceMarkerFromCwd)) {\n return workspaceRootFromCwd;\n }\n\n const workspaceMarker = path.join(\n workspaceRootFromCli,\n \"pnpm-workspace.yaml\",\n );\n if (cwd === packageRootFromCli && existsSync(workspaceMarker)) {\n return workspaceRootFromCli;\n }\n\n return cwd;\n};\n\ntype DevCommandOptions = {\n target?: number;\n provider?: ProviderName;\n model?: string;\n debug?: boolean;\n bridgePort?: number;\n proxyPort?: number;\n};\n\ntype ImplementCommandOptions = {\n provider?: ProviderName;\n model?: string;\n dryRun?: boolean;\n debug?: boolean;\n};\n\ntype TasksCommandOptions = {\n prune?: boolean;\n debug?: boolean;\n};\n\nconst keyboardShortcutsHelp = [\n \"Keyboard shortcuts (when using `pinpatch dev` in the proxied app):\",\n \" c Toggle pin mode\",\n \" Escape Exit pin mode and close the composer\",\n \" Cmd+Delete/Backspace Clear all pins (macOS)\",\n \" Ctrl+Delete/Backspace Clear all pins (Windows/Linux)\",\n \" Enter Submit from composer/follow-up textarea\",\n \" Shift+Enter Insert a newline in composer/follow-up textarea\",\n].join(\"\\n\");\n\nconst waitForSignal = async (): Promise<void> => {\n await new Promise<void>((resolve) => {\n const onSignal = () => {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n };\n\n process.on(\"SIGINT\", onSignal);\n process.on(\"SIGTERM\", onSignal);\n });\n};\n\nconst targetReachable = async (port: number): Promise<boolean> => {\n return await new Promise<boolean>((resolve) => {\n const request = http.get(\n {\n host: \"localhost\",\n port,\n path: \"/\",\n timeout: 1500,\n },\n () => {\n request.destroy();\n resolve(true);\n },\n );\n\n request.on(\"error\", () => resolve(false));\n request.on(\"timeout\", () => {\n request.destroy();\n resolve(false);\n });\n });\n};\n\nconst resolveOverlayBundlePath = (cwd: string): string | undefined => {\n const candidates = [\n process.env.PINPATCH_OVERLAY_SCRIPT_PATH,\n path.join(cwd, \"apps\", \"overlay\", \"dist\", \"pinpatch-overlay.iife.js\"),\n path.join(\n cwd,\n \"node_modules\",\n \"@pinpatch\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n packageRootFromCli,\n \"node_modules\",\n \"@pinpatch\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n workspaceRootFromCli,\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n resolveRuntimeCwd(),\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n ].filter((value): value is string => Boolean(value));\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n const maybeBuildOverlay = (workspaceRoot: string): string | undefined => {\n const overlayWorkspace = path.join(\n workspaceRoot,\n \"apps\",\n \"overlay\",\n \"package.json\",\n );\n if (!existsSync(overlayWorkspace)) {\n return undefined;\n }\n\n const output = spawnSync(\n \"pnpm\",\n [\"--filter\", \"@pinpatch/overlay\", \"build\"],\n {\n cwd: workspaceRoot,\n stdio: \"inherit\",\n },\n );\n\n if (output.status === 0) {\n const builtPath = path.join(\n workspaceRoot,\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n );\n if (existsSync(builtPath)) {\n return builtPath;\n }\n }\n\n return undefined;\n };\n\n const buildRoots = Array.from(new Set([cwd, workspaceRootFromCli]));\n for (const buildRoot of buildRoots) {\n const built = maybeBuildOverlay(buildRoot);\n if (built) {\n return built;\n }\n }\n\n return undefined;\n};\n\nconst runDev = async (options: DevCommandOptions): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n await store.ensureGitignoreEntry();\n\n const config = await resolveConfig(cwd, {\n provider: options.provider,\n model: options.model,\n target: options.target,\n debug: options.debug,\n bridgePort: options.bridgePort,\n proxyPort: options.proxyPort,\n });\n\n const logger = createLogger({\n store,\n component: \"cli\",\n debugEnabled: config.debug,\n });\n\n const reachable = await targetReachable(config.target);\n if (!reachable) {\n throw new Error(\n `Target localhost:${config.target} is unreachable. Start your app first and retry. Hint: lsof -i :${config.target}`,\n );\n }\n\n const overlayScriptPath = resolveOverlayBundlePath(cwd);\n\n const providerRegistry = createProviderRegistry([\"codex\", \"claude\"]);\n const bridge = createBridgeServer({\n cwd,\n port: config.bridgePort,\n store,\n logger,\n overlayScriptPath,\n getProviderAdapter: (provider) => providerRegistry.getAdapter(provider),\n });\n\n const proxy = createReverseProxy({\n targetPort: config.target,\n proxyPort: config.proxyPort,\n bridgePort: config.bridgePort,\n provider: config.provider,\n model: config.model,\n logger,\n });\n\n try {\n await bridge.start();\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EADDRINUSE\") {\n throw new Error(\n `Bridge port ${config.bridgePort} is already in use. Hint: lsof -i :${config.bridgePort}`,\n );\n }\n\n throw error;\n }\n\n try {\n await proxy.start();\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EADDRINUSE\") {\n await bridge.stop();\n throw new Error(\n `Proxy port ${config.proxyPort} is already in use. Hint: lsof -i :${config.proxyPort}`,\n );\n }\n\n await bridge.stop();\n throw error;\n }\n\n console.log(`Pinpatch dev ready`);\n console.log(`Target app: http://localhost:${config.target}`);\n console.log(`Proxied app: http://localhost:${config.proxyPort}`);\n console.log(`Bridge API: http://localhost:${config.bridgePort}`);\n\n await waitForSignal();\n\n await proxy.stop();\n await bridge.stop();\n};\n\nconst runImplement = async (\n taskId: string,\n options: ImplementCommandOptions,\n): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n await store.ensureGitignoreEntry();\n\n const config = await resolveConfig(cwd, {\n provider: options.provider,\n model: options.model,\n debug: options.debug,\n });\n\n const logger = createLogger({\n store,\n component: \"cli\",\n debugEnabled: config.debug,\n });\n\n const task = await store.getTask(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} was not found under .pinpatch/tasks`);\n }\n\n const providerRegistry = createProviderRegistry([\"codex\", \"claude\"]);\n const eventBus = new TaskEventBus();\n const runner = new TaskRunner({\n cwd,\n store,\n logger,\n eventBus,\n getProviderAdapter: (provider) => providerRegistry.getAdapter(provider),\n });\n\n const sessionId = generateSessionId();\n const result = await runner.runTask({\n taskId,\n sessionId,\n provider: config.provider,\n model: config.model,\n dryRun: Boolean(options.dryRun),\n debug: config.debug,\n });\n\n console.log(`Task ${taskId} -> ${result.status}`);\n console.log(result.summary);\n if (result.changedFiles.length > 0) {\n console.log(\"Changed files:\");\n for (const changedFile of result.changedFiles) {\n console.log(` - ${changedFile}`);\n }\n }\n\n if (result.status !== \"completed\") {\n process.exitCode = 1;\n }\n};\n\nconst runTasks = async (options: TasksCommandOptions): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n\n if (options.prune) {\n const result = await store.prune();\n console.log(`Pruned logs: ${result.removedLogs}`);\n console.log(`Pruned orphan sessions: ${result.removedSessions}`);\n return;\n }\n\n const tasks = await store.listTasks();\n tasks.sort(\n (left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt),\n );\n\n if (tasks.length === 0) {\n console.log(\"No tasks found in .pinpatch/tasks\");\n return;\n }\n\n console.table(\n tasks.map((task) => ({\n taskId: task.taskId,\n status: task.status,\n updatedAt: task.updatedAt,\n provider: task.provider ?? \"-\",\n model: task.model ?? \"-\",\n latestSessionId: task.latestSessionId ?? \"-\",\n })),\n );\n};\n\nconst program = new Command();\nprogram.name(\"pinpatch\").description(\"Pinpatch CLI\").version(\"0.1.0\");\nprogram.addHelpText(\n \"after\",\n `\\nQuick reference:\\n pinpatch dev --target <port>\\n pinpatch implement <taskId>\\n pinpatch tasks\\n pinpatch tasks --prune\\n\\n${keyboardShortcutsHelp}\\n`,\n);\n\nprogram\n .command(\"dev\")\n .description(\"Start Pinpatch bridge + proxy runtime\")\n .option(\"--target <port>\", \"Target app localhost port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--provider <name>\", \"Provider name (codex|claude)\")\n .option(\"--model <model>\", \"Provider model\")\n .option(\"--bridge-port <port>\", \"Bridge server port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--proxy-port <port>\", \"Proxy server port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--debug\", \"Enable debug logs\", false)\n .action(async (options: DevCommandOptions) => {\n await runDev(options);\n });\n\nprogram\n .command(\"implement\")\n .description(\"Execute a saved task through provider adapter\")\n .argument(\"<taskId>\", \"Task id\")\n .option(\"--provider <name>\", \"Provider name\")\n .option(\"--model <model>\", \"Provider model\")\n .option(\"--dry-run\", \"Do not apply provider edits\", false)\n .option(\"--debug\", \"Enable debug logs\", false)\n .action(async (taskId: string, options: ImplementCommandOptions) => {\n await runImplement(taskId, options);\n });\n\nprogram\n .command(\"tasks\")\n .description(\"List or prune task/session artifacts\")\n .option(\"--prune\", \"Prune expired logs and orphan sessions\", false)\n .option(\"--debug\", \"Enable debug logs\", false)\n .action(async (options: TasksCommandOptions) => {\n await runTasks(options);\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport http from \"node:http\";\nimport { spawnSync } from \"node:child_process\";\nimport { Command } from \"commander\";\nimport {\n ArtifactStore,\n createBridgeServer,\n createLogger,\n generateSessionId,\n resolveConfig,\n TaskEventBus,\n TaskRunner,\n type ProviderName,\n} from \"@pinpatch/core\";\nimport { createProviderRegistry } from \"@pinpatch/providers\";\nimport { createReverseProxy } from \"@pinpatch/proxy\";\n\nconst cliEntrypointDir = process.argv[1]\n ? path.dirname(path.resolve(process.argv[1]))\n : process.cwd();\nconst packageRootFromCli = [\"bin\", \"dist\", \"src\"].includes(\n path.basename(cliEntrypointDir),\n)\n ? path.resolve(cliEntrypointDir, \"..\")\n : cliEntrypointDir;\nconst workspaceRootFromCli = path.resolve(packageRootFromCli, \"../..\");\n\nconst resolveRuntimeCwd = (): string => {\n const initCwd = process.env.INIT_CWD?.trim();\n if (initCwd) {\n const resolved = path.resolve(initCwd);\n if (existsSync(resolved)) {\n return resolved;\n }\n }\n\n const cwd = process.cwd();\n\n const workspaceRootFromCwd = path.resolve(cwd, \"../..\");\n const workspaceMarkerFromCwd = path.join(\n workspaceRootFromCwd,\n \"pnpm-workspace.yaml\",\n );\n const appearsToBeCliPackage =\n path.basename(cwd) === \"cli\" &&\n path.basename(path.dirname(cwd)) === \"packages\";\n if (appearsToBeCliPackage && existsSync(workspaceMarkerFromCwd)) {\n return workspaceRootFromCwd;\n }\n\n const workspaceMarker = path.join(\n workspaceRootFromCli,\n \"pnpm-workspace.yaml\",\n );\n if (cwd === packageRootFromCli && existsSync(workspaceMarker)) {\n return workspaceRootFromCli;\n }\n\n return cwd;\n};\n\ntype DevCommandOptions = {\n target?: number;\n provider?: ProviderName;\n model?: string;\n debug?: boolean;\n bridgePort?: number;\n proxyPort?: number;\n};\n\ntype ImplementCommandOptions = {\n provider?: ProviderName;\n model?: string;\n dryRun?: boolean;\n debug?: boolean;\n};\n\ntype TasksCommandOptions = {\n prune?: boolean;\n debug?: boolean;\n};\n\nconst keyboardShortcutsHelp = [\n \"Keyboard shortcuts (when using `pinpatch dev` in the proxied app):\",\n \" c Toggle pin mode\",\n \" Escape Exit pin mode and close the composer\",\n \" Cmd+Delete/Backspace Clear all pins (macOS)\",\n \" Ctrl+Delete/Backspace Clear all pins (Windows/Linux)\",\n \" Enter Submit from composer/follow-up textarea\",\n \" Shift+Enter Insert a newline in composer/follow-up textarea\",\n].join(\"\\n\");\n\nconst commandOptionsHelp = [\n \"Command options:\",\n \" pinpatch dev [options]\",\n \" --target <port> Target app localhost port (default: 3000)\",\n \" --provider <name> Provider (codex|claude, default: codex)\",\n \" --model <model> Model override (provider-aware default when omitted)\",\n \" --bridge-port <port> Bridge API port (default: 7331)\",\n \" --proxy-port <port> Reverse proxy port (default: 3030)\",\n \" --debug Enable verbose logging\",\n \"\",\n \" pinpatch implement <taskId> [options]\",\n \" --provider <name> Provider override for this run\",\n \" --model <model> Model override for this run\",\n \" --dry-run Run provider in dry-run mode\",\n \" --debug Enable verbose logging\",\n \"\",\n \" pinpatch tasks [options]\",\n \" --prune Prune expired logs and orphan sessions\",\n \" --debug Enable verbose logging\",\n].join(\"\\n\");\n\nconst defaultsAndConfigHelp = [\n \"Defaults and config precedence:\",\n \" CLI flags > .pinpatch/config.json > built-in defaults\",\n \" Provider default: codex\",\n \" Model defaults: gpt-5.3-codex-spark (codex), sonnet (claude)\",\n].join(\"\\n\");\n\nconst examplesHelp = [\n \"Examples:\",\n \" pinpatch dev --target 3000\",\n \" pinpatch dev --target 3000 --provider claude --model sonnet\",\n \" pinpatch implement <taskId> --dry-run --provider codex\",\n \" pinpatch tasks\",\n \" pinpatch tasks --prune\",\n].join(\"\\n\");\n\nconst waitForSignal = async (): Promise<void> => {\n await new Promise<void>((resolve) => {\n const onSignal = () => {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n };\n\n process.on(\"SIGINT\", onSignal);\n process.on(\"SIGTERM\", onSignal);\n });\n};\n\nconst targetReachable = async (port: number): Promise<boolean> => {\n return await new Promise<boolean>((resolve) => {\n const request = http.get(\n {\n host: \"localhost\",\n port,\n path: \"/\",\n timeout: 1500,\n },\n () => {\n request.destroy();\n resolve(true);\n },\n );\n\n request.on(\"error\", () => resolve(false));\n request.on(\"timeout\", () => {\n request.destroy();\n resolve(false);\n });\n });\n};\n\nconst resolveOverlayBundlePath = (cwd: string): string | undefined => {\n const candidates = [\n process.env.PINPATCH_OVERLAY_SCRIPT_PATH,\n path.join(cwd, \"apps\", \"overlay\", \"dist\", \"pinpatch-overlay.iife.js\"),\n path.join(\n cwd,\n \"node_modules\",\n \"@pinpatch\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n packageRootFromCli,\n \"node_modules\",\n \"@pinpatch\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n workspaceRootFromCli,\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n path.join(\n resolveRuntimeCwd(),\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n ),\n ].filter((value): value is string => Boolean(value));\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n const maybeBuildOverlay = (workspaceRoot: string): string | undefined => {\n const overlayWorkspace = path.join(\n workspaceRoot,\n \"apps\",\n \"overlay\",\n \"package.json\",\n );\n if (!existsSync(overlayWorkspace)) {\n return undefined;\n }\n\n const output = spawnSync(\n \"pnpm\",\n [\"--filter\", \"@pinpatch/overlay\", \"build\"],\n {\n cwd: workspaceRoot,\n stdio: \"inherit\",\n },\n );\n\n if (output.status === 0) {\n const builtPath = path.join(\n workspaceRoot,\n \"apps\",\n \"overlay\",\n \"dist\",\n \"pinpatch-overlay.iife.js\",\n );\n if (existsSync(builtPath)) {\n return builtPath;\n }\n }\n\n return undefined;\n };\n\n const buildRoots = Array.from(new Set([cwd, workspaceRootFromCli]));\n for (const buildRoot of buildRoots) {\n const built = maybeBuildOverlay(buildRoot);\n if (built) {\n return built;\n }\n }\n\n return undefined;\n};\n\nconst runDev = async (options: DevCommandOptions): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n await store.ensureGitignoreEntry();\n\n const config = await resolveConfig(cwd, {\n provider: options.provider,\n model: options.model,\n target: options.target,\n debug: options.debug,\n bridgePort: options.bridgePort,\n proxyPort: options.proxyPort,\n });\n\n const logger = createLogger({\n store,\n component: \"cli\",\n debugEnabled: config.debug,\n });\n\n const reachable = await targetReachable(config.target);\n if (!reachable) {\n throw new Error(\n `Target localhost:${config.target} is unreachable. Start your app first and retry. Hint: lsof -i :${config.target}`,\n );\n }\n\n const overlayScriptPath = resolveOverlayBundlePath(cwd);\n\n const providerRegistry = createProviderRegistry([\"codex\", \"claude\"]);\n const bridge = createBridgeServer({\n cwd,\n port: config.bridgePort,\n store,\n logger,\n overlayScriptPath,\n getProviderAdapter: (provider) => providerRegistry.getAdapter(provider),\n });\n\n const proxy = createReverseProxy({\n targetPort: config.target,\n proxyPort: config.proxyPort,\n bridgePort: config.bridgePort,\n provider: config.provider,\n model: config.model,\n logger,\n });\n\n try {\n await bridge.start();\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EADDRINUSE\") {\n throw new Error(\n `Bridge port ${config.bridgePort} is already in use. Hint: lsof -i :${config.bridgePort}`,\n );\n }\n\n throw error;\n }\n\n try {\n await proxy.start();\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EADDRINUSE\") {\n await bridge.stop();\n throw new Error(\n `Proxy port ${config.proxyPort} is already in use. Hint: lsof -i :${config.proxyPort}`,\n );\n }\n\n await bridge.stop();\n throw error;\n }\n\n console.log(`Pinpatch dev ready`);\n console.log(`Target app: http://localhost:${config.target}`);\n console.log(`Proxied app: http://localhost:${config.proxyPort}`);\n console.log(`Bridge API: http://localhost:${config.bridgePort}`);\n\n await waitForSignal();\n\n await proxy.stop();\n await bridge.stop();\n};\n\nconst runImplement = async (\n taskId: string,\n options: ImplementCommandOptions,\n): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n await store.ensureGitignoreEntry();\n\n const config = await resolveConfig(cwd, {\n provider: options.provider,\n model: options.model,\n debug: options.debug,\n });\n\n const logger = createLogger({\n store,\n component: \"cli\",\n debugEnabled: config.debug,\n });\n\n const task = await store.getTask(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} was not found under .pinpatch/tasks`);\n }\n\n const providerRegistry = createProviderRegistry([\"codex\", \"claude\"]);\n const eventBus = new TaskEventBus();\n const runner = new TaskRunner({\n cwd,\n store,\n logger,\n eventBus,\n getProviderAdapter: (provider) => providerRegistry.getAdapter(provider),\n });\n\n const sessionId = generateSessionId();\n const result = await runner.runTask({\n taskId,\n sessionId,\n provider: config.provider,\n model: config.model,\n dryRun: Boolean(options.dryRun),\n debug: config.debug,\n });\n\n console.log(`Task ${taskId} -> ${result.status}`);\n console.log(result.summary);\n if (result.changedFiles.length > 0) {\n console.log(\"Changed files:\");\n for (const changedFile of result.changedFiles) {\n console.log(` - ${changedFile}`);\n }\n }\n\n if (result.status !== \"completed\") {\n process.exitCode = 1;\n }\n};\n\nconst runTasks = async (options: TasksCommandOptions): Promise<void> => {\n const cwd = resolveRuntimeCwd();\n const store = new ArtifactStore(cwd);\n await store.ensureStructure();\n\n if (options.prune) {\n const result = await store.prune();\n console.log(`Pruned logs: ${result.removedLogs}`);\n console.log(`Pruned orphan sessions: ${result.removedSessions}`);\n return;\n }\n\n const tasks = await store.listTasks();\n tasks.sort(\n (left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt),\n );\n\n if (tasks.length === 0) {\n console.log(\"No tasks found in .pinpatch/tasks\");\n return;\n }\n\n console.table(\n tasks.map((task) => ({\n taskId: task.taskId,\n status: task.status,\n updatedAt: task.updatedAt,\n provider: task.provider ?? \"-\",\n model: task.model ?? \"-\",\n latestSessionId: task.latestSessionId ?? \"-\",\n })),\n );\n};\n\nconst program = new Command();\nprogram.name(\"pinpatch\").description(\"Pinpatch CLI\").version(\"0.1.0\");\nprogram.addHelpText(\n \"after\",\n `\\n${commandOptionsHelp}\\n\\n${defaultsAndConfigHelp}\\n\\n${examplesHelp}\\n\\n${keyboardShortcutsHelp}\\n`,\n);\n\nprogram\n .command(\"dev\")\n .description(\"Start Pinpatch bridge + proxy runtime\")\n .option(\"--target <port>\", \"Target app localhost port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--provider <name>\", \"Provider name (codex|claude)\")\n .option(\"--model <model>\", \"Provider model\")\n .option(\"--bridge-port <port>\", \"Bridge server port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--proxy-port <port>\", \"Proxy server port\", (value) =>\n Number.parseInt(value, 10),\n )\n .option(\"--debug\", \"Enable debug logs\", false)\n .addHelpText(\n \"after\",\n \"\\nProvider/model can be set via flags or .pinpatch/config.json. Flags take precedence.\",\n )\n .action(async (options: DevCommandOptions) => {\n await runDev(options);\n });\n\nprogram\n .command(\"implement\")\n .description(\"Execute a saved task through provider adapter\")\n .argument(\"<taskId>\", \"Task id\")\n .option(\"--provider <name>\", \"Provider name\")\n .option(\"--model <model>\", \"Provider model\")\n .option(\"--dry-run\", \"Do not apply provider edits\", false)\n .option(\"--debug\", \"Enable debug logs\", false)\n .addHelpText(\n \"after\",\n \"\\nExample:\\n pinpatch implement <taskId> --provider claude --model sonnet --dry-run\",\n )\n .action(async (taskId: string, options: ImplementCommandOptions) => {\n await runImplement(taskId, options);\n });\n\nprogram\n .command(\"tasks\")\n .description(\"List or prune task/session artifacts\")\n .option(\"--prune\", \"Prune expired logs and orphan sessions\", false)\n .option(\"--debug\", \"Enable debug logs\", false)\n .addHelpText(\"after\", \"\\nExample:\\n pinpatch tasks --prune\")\n .action(async (options: TasksCommandOptions) => {\n await runTasks(options);\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinpatch",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "CLI for Pinpatch pin-to-code workflow with local proxy and overlay runtime.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,10 +33,10 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "commander": "^13.1.0",
36
- "@pinpatch/core": "0.1.0",
37
- "@pinpatch/proxy": "0.1.0",
38
- "@pinpatch/providers": "0.1.0",
39
- "@pinpatch/overlay": "0.1.0"
36
+ "@pinpatch/core": "0.1.2",
37
+ "@pinpatch/overlay": "0.1.2",
38
+ "@pinpatch/providers": "0.1.2",
39
+ "@pinpatch/proxy": "0.1.2"
40
40
  },
41
41
  "devDependencies": {
42
42
  "tsup": "^8.3.5",