pinpatch 0.1.1 → 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 +2 -1
- package/dist/index.cjs +48 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +48 -8
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
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.
|
|
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
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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).
|
|
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).
|
|
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) => {
|
package/dist/index.cjs.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":["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
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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).
|
|
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).
|
|
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.
|
|
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.
|
|
37
|
-
"@pinpatch/overlay": "0.1.
|
|
38
|
-
"@pinpatch/providers": "0.1.
|
|
39
|
-
"@pinpatch/proxy": "0.1.
|
|
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",
|