patchwork-os 0.2.0-alpha.9 → 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. package/README.bridge.md +6 -0
  2. package/README.md +318 -35
  3. package/deploy/bootstrap-new-vps.sh +12 -12
  4. package/deploy/bootstrap-vps.sh +187 -0
  5. package/deploy/deploy-dashboard.sh +174 -0
  6. package/deploy/deploy-landing.sh +136 -0
  7. package/dist/activationMetrics.d.ts +67 -0
  8. package/dist/activationMetrics.js +255 -0
  9. package/dist/activationMetrics.js.map +1 -0
  10. package/dist/activityLog.d.ts +49 -0
  11. package/dist/activityLog.js +78 -0
  12. package/dist/activityLog.js.map +1 -1
  13. package/dist/analyticsAggregator.d.ts +5 -1
  14. package/dist/analyticsAggregator.js +15 -4
  15. package/dist/analyticsAggregator.js.map +1 -1
  16. package/dist/analyticsPrefs.d.ts +11 -0
  17. package/dist/analyticsPrefs.js +33 -0
  18. package/dist/analyticsPrefs.js.map +1 -1
  19. package/dist/approvalHttp.d.ts +49 -2
  20. package/dist/approvalHttp.js +217 -21
  21. package/dist/approvalHttp.js.map +1 -1
  22. package/dist/approvalInsights.d.ts +49 -0
  23. package/dist/approvalInsights.js +97 -0
  24. package/dist/approvalInsights.js.map +1 -0
  25. package/dist/approvalQueue.d.ts +27 -1
  26. package/dist/approvalQueue.js +123 -3
  27. package/dist/approvalQueue.js.map +1 -1
  28. package/dist/approvalSignals.d.ts +124 -0
  29. package/dist/approvalSignals.js +512 -0
  30. package/dist/approvalSignals.js.map +1 -0
  31. package/dist/automation.d.ts +57 -0
  32. package/dist/automation.js +156 -59
  33. package/dist/automation.js.map +1 -1
  34. package/dist/automationSuggestions.d.ts +79 -0
  35. package/dist/automationSuggestions.js +150 -0
  36. package/dist/automationSuggestions.js.map +1 -0
  37. package/dist/bridge.d.ts +3 -0
  38. package/dist/bridge.js +194 -153
  39. package/dist/bridge.js.map +1 -1
  40. package/dist/bridgeToken.js +57 -19
  41. package/dist/bridgeToken.js.map +1 -1
  42. package/dist/ccPermissions.d.ts +15 -0
  43. package/dist/ccPermissions.js +21 -4
  44. package/dist/ccPermissions.js.map +1 -1
  45. package/dist/claudeDriver.d.ts +0 -16
  46. package/dist/claudeDriver.js +93 -36
  47. package/dist/claudeDriver.js.map +1 -1
  48. package/dist/claudeMdPatch.d.ts +9 -3
  49. package/dist/claudeMdPatch.js +79 -13
  50. package/dist/claudeMdPatch.js.map +1 -1
  51. package/dist/claudeOrchestrator.d.ts +13 -1
  52. package/dist/claudeOrchestrator.js +16 -8
  53. package/dist/claudeOrchestrator.js.map +1 -1
  54. package/dist/commands/dashboard.js +1 -1
  55. package/dist/commands/dashboard.js.map +1 -1
  56. package/dist/commands/launchd.d.ts +2 -0
  57. package/dist/commands/launchd.js +94 -0
  58. package/dist/commands/launchd.js.map +1 -0
  59. package/dist/commands/marketplace.d.ts +15 -10
  60. package/dist/commands/marketplace.js +27 -115
  61. package/dist/commands/marketplace.js.map +1 -1
  62. package/dist/commands/patchworkInit.d.ts +8 -0
  63. package/dist/commands/patchworkInit.js +77 -11
  64. package/dist/commands/patchworkInit.js.map +1 -1
  65. package/dist/commands/recipe.d.ts +289 -0
  66. package/dist/commands/recipe.js +1359 -0
  67. package/dist/commands/recipe.js.map +1 -0
  68. package/dist/commands/recipeInstall.d.ts +150 -0
  69. package/dist/commands/recipeInstall.js +647 -0
  70. package/dist/commands/recipeInstall.js.map +1 -0
  71. package/dist/commands/tracesExport.d.ts +83 -0
  72. package/dist/commands/tracesExport.js +269 -0
  73. package/dist/commands/tracesExport.js.map +1 -0
  74. package/dist/commands/tracesImport.d.ts +56 -0
  75. package/dist/commands/tracesImport.js +161 -0
  76. package/dist/commands/tracesImport.js.map +1 -0
  77. package/dist/commitIssueLinkLog.d.ts +8 -0
  78. package/dist/commitIssueLinkLog.js +53 -1
  79. package/dist/commitIssueLinkLog.js.map +1 -1
  80. package/dist/config.d.ts +23 -2
  81. package/dist/config.js +119 -9
  82. package/dist/config.js.map +1 -1
  83. package/dist/connectorRoutes.d.ts +43 -0
  84. package/dist/connectorRoutes.js +1300 -0
  85. package/dist/connectorRoutes.js.map +1 -0
  86. package/dist/connectors/asana.d.ts +198 -0
  87. package/dist/connectors/asana.js +679 -0
  88. package/dist/connectors/asana.js.map +1 -0
  89. package/dist/connectors/baseConnector.d.ts +153 -0
  90. package/dist/connectors/baseConnector.js +336 -0
  91. package/dist/connectors/baseConnector.js.map +1 -0
  92. package/dist/connectors/confluence.d.ts +111 -0
  93. package/dist/connectors/confluence.js +406 -0
  94. package/dist/connectors/confluence.js.map +1 -0
  95. package/dist/connectors/datadog.d.ts +116 -0
  96. package/dist/connectors/datadog.js +385 -0
  97. package/dist/connectors/datadog.js.map +1 -0
  98. package/dist/connectors/discord.d.ts +150 -0
  99. package/dist/connectors/discord.js +543 -0
  100. package/dist/connectors/discord.js.map +1 -0
  101. package/dist/connectors/fixtureLibrary.d.ts +21 -0
  102. package/dist/connectors/fixtureLibrary.js +70 -0
  103. package/dist/connectors/fixtureLibrary.js.map +1 -0
  104. package/dist/connectors/fixtureRecorder.d.ts +1 -0
  105. package/dist/connectors/fixtureRecorder.js +35 -0
  106. package/dist/connectors/fixtureRecorder.js.map +1 -0
  107. package/dist/connectors/github.js +17 -18
  108. package/dist/connectors/github.js.map +1 -1
  109. package/dist/connectors/gitlab.d.ts +180 -0
  110. package/dist/connectors/gitlab.js +582 -0
  111. package/dist/connectors/gitlab.js.map +1 -0
  112. package/dist/connectors/gmail.d.ts +4 -1
  113. package/dist/connectors/gmail.js +149 -27
  114. package/dist/connectors/gmail.js.map +1 -1
  115. package/dist/connectors/googleCalendar.d.ts +4 -1
  116. package/dist/connectors/googleCalendar.js +88 -25
  117. package/dist/connectors/googleCalendar.js.map +1 -1
  118. package/dist/connectors/googleDrive.d.ts +34 -0
  119. package/dist/connectors/googleDrive.js +321 -0
  120. package/dist/connectors/googleDrive.js.map +1 -0
  121. package/dist/connectors/htmlEscape.d.ts +5 -0
  122. package/dist/connectors/htmlEscape.js +13 -0
  123. package/dist/connectors/htmlEscape.js.map +1 -0
  124. package/dist/connectors/hubspot.d.ts +112 -0
  125. package/dist/connectors/hubspot.js +408 -0
  126. package/dist/connectors/hubspot.js.map +1 -0
  127. package/dist/connectors/intercom.d.ts +102 -0
  128. package/dist/connectors/intercom.js +402 -0
  129. package/dist/connectors/intercom.js.map +1 -0
  130. package/dist/connectors/jira.d.ts +98 -0
  131. package/dist/connectors/jira.js +396 -0
  132. package/dist/connectors/jira.js.map +1 -0
  133. package/dist/connectors/linear.js +30 -19
  134. package/dist/connectors/linear.js.map +1 -1
  135. package/dist/connectors/mcpOAuth.d.ts +3 -0
  136. package/dist/connectors/mcpOAuth.js +64 -10
  137. package/dist/connectors/mcpOAuth.js.map +1 -1
  138. package/dist/connectors/mockConnector.d.ts +28 -0
  139. package/dist/connectors/mockConnector.js +81 -0
  140. package/dist/connectors/mockConnector.js.map +1 -0
  141. package/dist/connectors/notion.d.ts +143 -0
  142. package/dist/connectors/notion.js +424 -0
  143. package/dist/connectors/notion.js.map +1 -0
  144. package/dist/connectors/oauthStateStore.d.ts +31 -0
  145. package/dist/connectors/oauthStateStore.js +52 -0
  146. package/dist/connectors/oauthStateStore.js.map +1 -0
  147. package/dist/connectors/pagerduty.d.ts +160 -0
  148. package/dist/connectors/pagerduty.js +464 -0
  149. package/dist/connectors/pagerduty.js.map +1 -0
  150. package/dist/connectors/sentry.js +5 -13
  151. package/dist/connectors/sentry.js.map +1 -1
  152. package/dist/connectors/slack.d.ts +16 -1
  153. package/dist/connectors/slack.js +155 -32
  154. package/dist/connectors/slack.js.map +1 -1
  155. package/dist/connectors/stripe.d.ts +116 -0
  156. package/dist/connectors/stripe.js +379 -0
  157. package/dist/connectors/stripe.js.map +1 -0
  158. package/dist/connectors/tokenStorage.d.ts +35 -0
  159. package/dist/connectors/tokenStorage.js +484 -0
  160. package/dist/connectors/tokenStorage.js.map +1 -0
  161. package/dist/connectors/zendesk.d.ts +104 -0
  162. package/dist/connectors/zendesk.js +442 -0
  163. package/dist/connectors/zendesk.js.map +1 -0
  164. package/dist/cors.d.ts +10 -0
  165. package/dist/cors.js +29 -0
  166. package/dist/cors.js.map +1 -0
  167. package/dist/decisionReplay.d.ts +72 -0
  168. package/dist/decisionReplay.js +92 -0
  169. package/dist/decisionReplay.js.map +1 -0
  170. package/dist/decisionTraceLog.d.ts +6 -0
  171. package/dist/decisionTraceLog.js +54 -2
  172. package/dist/decisionTraceLog.js.map +1 -1
  173. package/dist/drivers/claude/subprocess.d.ts +12 -2
  174. package/dist/drivers/claude/subprocess.js +79 -6
  175. package/dist/drivers/claude/subprocess.js.map +1 -1
  176. package/dist/drivers/gemini/api.d.ts +18 -0
  177. package/dist/drivers/gemini/api.js +29 -0
  178. package/dist/drivers/gemini/api.js.map +1 -0
  179. package/dist/drivers/gemini/index.d.ts +5 -1
  180. package/dist/drivers/gemini/index.js +39 -5
  181. package/dist/drivers/gemini/index.js.map +1 -1
  182. package/dist/drivers/index.d.ts +8 -1
  183. package/dist/drivers/index.js +10 -2
  184. package/dist/drivers/index.js.map +1 -1
  185. package/dist/drivers/local/index.d.ts +26 -0
  186. package/dist/drivers/local/index.js +41 -0
  187. package/dist/drivers/local/index.js.map +1 -0
  188. package/dist/featureFlags.d.ts +79 -0
  189. package/dist/featureFlags.js +208 -0
  190. package/dist/featureFlags.js.map +1 -0
  191. package/dist/fp/automationInterpreter.js +26 -21
  192. package/dist/fp/automationInterpreter.js.map +1 -1
  193. package/dist/fp/automationProgram.d.ts +1 -1
  194. package/dist/fp/automationProgram.js.map +1 -1
  195. package/dist/fp/automationState.js +4 -1
  196. package/dist/fp/automationState.js.map +1 -1
  197. package/dist/fp/policyParser.js +21 -1
  198. package/dist/fp/policyParser.js.map +1 -1
  199. package/dist/httpErrorResponse.d.ts +36 -0
  200. package/dist/httpErrorResponse.js +46 -0
  201. package/dist/httpErrorResponse.js.map +1 -0
  202. package/dist/inboxRoutes.d.ts +22 -0
  203. package/dist/inboxRoutes.js +193 -0
  204. package/dist/inboxRoutes.js.map +1 -0
  205. package/dist/index.d.ts +1 -1
  206. package/dist/index.js +1403 -203
  207. package/dist/index.js.map +1 -1
  208. package/dist/installGuard.d.ts +25 -0
  209. package/dist/installGuard.js +48 -0
  210. package/dist/installGuard.js.map +1 -0
  211. package/dist/mcpRoutes.d.ts +37 -0
  212. package/dist/mcpRoutes.js +76 -0
  213. package/dist/mcpRoutes.js.map +1 -0
  214. package/dist/oauth.d.ts +20 -1
  215. package/dist/oauth.js +214 -39
  216. package/dist/oauth.js.map +1 -1
  217. package/dist/oauthRoutes.d.ts +32 -0
  218. package/dist/oauthRoutes.js +119 -0
  219. package/dist/oauthRoutes.js.map +1 -0
  220. package/dist/orchestrator/orchestratorBridge.js +2 -2
  221. package/dist/orchestrator/orchestratorBridge.js.map +1 -1
  222. package/dist/patchworkConfig.d.ts +29 -0
  223. package/dist/patchworkConfig.js +100 -5
  224. package/dist/patchworkConfig.js.map +1 -1
  225. package/dist/pluginLoader.d.ts +28 -0
  226. package/dist/pluginLoader.js +77 -11
  227. package/dist/pluginLoader.js.map +1 -1
  228. package/dist/pluginWatcher.js +8 -3
  229. package/dist/pluginWatcher.js.map +1 -1
  230. package/dist/preToolUseHook.d.ts +12 -0
  231. package/dist/preToolUseHook.js +30 -1
  232. package/dist/preToolUseHook.js.map +1 -1
  233. package/dist/prompts.js +4 -0
  234. package/dist/prompts.js.map +1 -1
  235. package/dist/recipeOrchestration.d.ts +121 -0
  236. package/dist/recipeOrchestration.js +965 -0
  237. package/dist/recipeOrchestration.js.map +1 -0
  238. package/dist/recipeRoutes.d.ts +185 -0
  239. package/dist/recipeRoutes.js +1369 -0
  240. package/dist/recipeRoutes.js.map +1 -0
  241. package/dist/recipes/RecipeOrchestrator.d.ts +40 -0
  242. package/dist/recipes/RecipeOrchestrator.js +51 -0
  243. package/dist/recipes/RecipeOrchestrator.js.map +1 -0
  244. package/dist/recipes/agentExecutor.d.ts +38 -0
  245. package/dist/recipes/agentExecutor.js +50 -0
  246. package/dist/recipes/agentExecutor.js.map +1 -0
  247. package/dist/recipes/chainedRunner.d.ts +191 -0
  248. package/dist/recipes/chainedRunner.js +759 -0
  249. package/dist/recipes/chainedRunner.js.map +1 -0
  250. package/dist/recipes/compiler.js +3 -3
  251. package/dist/recipes/compiler.js.map +1 -1
  252. package/dist/recipes/dependencyGraph.d.ts +39 -0
  253. package/dist/recipes/dependencyGraph.js +199 -0
  254. package/dist/recipes/dependencyGraph.js.map +1 -0
  255. package/dist/recipes/disabledMarkers.d.ts +48 -0
  256. package/dist/recipes/disabledMarkers.js +52 -0
  257. package/dist/recipes/disabledMarkers.js.map +1 -0
  258. package/dist/recipes/installer.js +3 -3
  259. package/dist/recipes/installer.js.map +1 -1
  260. package/dist/recipes/legacyRecipeCompat.d.ts +10 -0
  261. package/dist/recipes/legacyRecipeCompat.js +131 -0
  262. package/dist/recipes/legacyRecipeCompat.js.map +1 -0
  263. package/dist/recipes/manifest.d.ts +47 -0
  264. package/dist/recipes/manifest.js +156 -0
  265. package/dist/recipes/manifest.js.map +1 -0
  266. package/dist/recipes/migrationWarnings.d.ts +12 -0
  267. package/dist/recipes/migrationWarnings.js +44 -0
  268. package/dist/recipes/migrationWarnings.js.map +1 -0
  269. package/dist/recipes/migrations/index.d.ts +24 -0
  270. package/dist/recipes/migrations/index.js +55 -0
  271. package/dist/recipes/migrations/index.js.map +1 -0
  272. package/dist/recipes/migrations/types.d.ts +28 -0
  273. package/dist/recipes/migrations/types.js +2 -0
  274. package/dist/recipes/migrations/types.js.map +1 -0
  275. package/dist/recipes/migrations/v1.d.ts +11 -0
  276. package/dist/recipes/migrations/v1.js +18 -0
  277. package/dist/recipes/migrations/v1.js.map +1 -0
  278. package/dist/recipes/names.d.ts +40 -0
  279. package/dist/recipes/names.js +66 -0
  280. package/dist/recipes/names.js.map +1 -0
  281. package/dist/recipes/nestedRecipeStep.d.ts +58 -0
  282. package/dist/recipes/nestedRecipeStep.js +95 -0
  283. package/dist/recipes/nestedRecipeStep.js.map +1 -0
  284. package/dist/recipes/outputRegistry.d.ts +28 -0
  285. package/dist/recipes/outputRegistry.js +52 -0
  286. package/dist/recipes/outputRegistry.js.map +1 -0
  287. package/dist/recipes/parser.js +4 -1
  288. package/dist/recipes/parser.js.map +1 -1
  289. package/dist/recipes/replayRun.d.ts +62 -0
  290. package/dist/recipes/replayRun.js +97 -0
  291. package/dist/recipes/replayRun.js.map +1 -0
  292. package/dist/recipes/resolveRecipePath.d.ts +69 -0
  293. package/dist/recipes/resolveRecipePath.js +202 -0
  294. package/dist/recipes/resolveRecipePath.js.map +1 -0
  295. package/dist/recipes/scheduler.d.ts +23 -7
  296. package/dist/recipes/scheduler.js +225 -45
  297. package/dist/recipes/scheduler.js.map +1 -1
  298. package/dist/recipes/schema.d.ts +17 -2
  299. package/dist/recipes/schemaGenerator.d.ts +28 -0
  300. package/dist/recipes/schemaGenerator.js +565 -0
  301. package/dist/recipes/schemaGenerator.js.map +1 -0
  302. package/dist/recipes/stepObservation.d.ts +44 -0
  303. package/dist/recipes/stepObservation.js +232 -0
  304. package/dist/recipes/stepObservation.js.map +1 -0
  305. package/dist/recipes/templateEngine.d.ts +62 -0
  306. package/dist/recipes/templateEngine.js +201 -0
  307. package/dist/recipes/templateEngine.js.map +1 -0
  308. package/dist/recipes/toolRegistry.d.ts +186 -0
  309. package/dist/recipes/toolRegistry.js +309 -0
  310. package/dist/recipes/toolRegistry.js.map +1 -0
  311. package/dist/recipes/tools/asana.d.ts +16 -0
  312. package/dist/recipes/tools/asana.js +524 -0
  313. package/dist/recipes/tools/asana.js.map +1 -0
  314. package/dist/recipes/tools/calendar.d.ts +6 -0
  315. package/dist/recipes/tools/calendar.js +61 -0
  316. package/dist/recipes/tools/calendar.js.map +1 -0
  317. package/dist/recipes/tools/confluence.d.ts +6 -0
  318. package/dist/recipes/tools/confluence.js +254 -0
  319. package/dist/recipes/tools/confluence.js.map +1 -0
  320. package/dist/recipes/tools/datadog.d.ts +6 -0
  321. package/dist/recipes/tools/datadog.js +239 -0
  322. package/dist/recipes/tools/datadog.js.map +1 -0
  323. package/dist/recipes/tools/diagnostics.d.ts +6 -0
  324. package/dist/recipes/tools/diagnostics.js +36 -0
  325. package/dist/recipes/tools/diagnostics.js.map +1 -0
  326. package/dist/recipes/tools/discord.d.ts +18 -0
  327. package/dist/recipes/tools/discord.js +254 -0
  328. package/dist/recipes/tools/discord.js.map +1 -0
  329. package/dist/recipes/tools/file.d.ts +12 -0
  330. package/dist/recipes/tools/file.js +174 -0
  331. package/dist/recipes/tools/file.js.map +1 -0
  332. package/dist/recipes/tools/git.d.ts +6 -0
  333. package/dist/recipes/tools/git.js +63 -0
  334. package/dist/recipes/tools/git.js.map +1 -0
  335. package/dist/recipes/tools/github.d.ts +6 -0
  336. package/dist/recipes/tools/github.js +116 -0
  337. package/dist/recipes/tools/github.js.map +1 -0
  338. package/dist/recipes/tools/gitlab.d.ts +11 -0
  339. package/dist/recipes/tools/gitlab.js +285 -0
  340. package/dist/recipes/tools/gitlab.js.map +1 -0
  341. package/dist/recipes/tools/gmail.d.ts +6 -0
  342. package/dist/recipes/tools/gmail.js +451 -0
  343. package/dist/recipes/tools/gmail.js.map +1 -0
  344. package/dist/recipes/tools/googleDrive.d.ts +1 -0
  345. package/dist/recipes/tools/googleDrive.js +55 -0
  346. package/dist/recipes/tools/googleDrive.js.map +1 -0
  347. package/dist/recipes/tools/hubspot.d.ts +6 -0
  348. package/dist/recipes/tools/hubspot.js +232 -0
  349. package/dist/recipes/tools/hubspot.js.map +1 -0
  350. package/dist/recipes/tools/index.d.ts +30 -0
  351. package/dist/recipes/tools/index.js +33 -0
  352. package/dist/recipes/tools/index.js.map +1 -0
  353. package/dist/recipes/tools/intercom.d.ts +6 -0
  354. package/dist/recipes/tools/intercom.js +226 -0
  355. package/dist/recipes/tools/intercom.js.map +1 -0
  356. package/dist/recipes/tools/jira.d.ts +14 -0
  357. package/dist/recipes/tools/jira.js +369 -0
  358. package/dist/recipes/tools/jira.js.map +1 -0
  359. package/dist/recipes/tools/linear.d.ts +7 -0
  360. package/dist/recipes/tools/linear.js +307 -0
  361. package/dist/recipes/tools/linear.js.map +1 -0
  362. package/dist/recipes/tools/meetingNotes.d.ts +21 -0
  363. package/dist/recipes/tools/meetingNotes.js +701 -0
  364. package/dist/recipes/tools/meetingNotes.js.map +1 -0
  365. package/dist/recipes/tools/notion.d.ts +6 -0
  366. package/dist/recipes/tools/notion.js +278 -0
  367. package/dist/recipes/tools/notion.js.map +1 -0
  368. package/dist/recipes/tools/pagerduty.d.ts +15 -0
  369. package/dist/recipes/tools/pagerduty.js +451 -0
  370. package/dist/recipes/tools/pagerduty.js.map +1 -0
  371. package/dist/recipes/tools/sentry.d.ts +12 -0
  372. package/dist/recipes/tools/sentry.js +73 -0
  373. package/dist/recipes/tools/sentry.js.map +1 -0
  374. package/dist/recipes/tools/slack.d.ts +6 -0
  375. package/dist/recipes/tools/slack.js +82 -0
  376. package/dist/recipes/tools/slack.js.map +1 -0
  377. package/dist/recipes/tools/stripe.d.ts +6 -0
  378. package/dist/recipes/tools/stripe.js +265 -0
  379. package/dist/recipes/tools/stripe.js.map +1 -0
  380. package/dist/recipes/tools/zendesk.d.ts +6 -0
  381. package/dist/recipes/tools/zendesk.js +245 -0
  382. package/dist/recipes/tools/zendesk.js.map +1 -0
  383. package/dist/recipes/validation.d.ts +13 -0
  384. package/dist/recipes/validation.js +617 -0
  385. package/dist/recipes/validation.js.map +1 -0
  386. package/dist/recipes/yamlRunner.d.ts +130 -2
  387. package/dist/recipes/yamlRunner.js +1009 -402
  388. package/dist/recipes/yamlRunner.js.map +1 -1
  389. package/dist/recipesHttp.d.ts +151 -6
  390. package/dist/recipesHttp.js +999 -29
  391. package/dist/recipesHttp.js.map +1 -1
  392. package/dist/riskTier.js +7 -1
  393. package/dist/riskTier.js.map +1 -1
  394. package/dist/runLog.d.ts +100 -1
  395. package/dist/runLog.js +258 -5
  396. package/dist/runLog.js.map +1 -1
  397. package/dist/schemas/dry-run-plan.v1.json +139 -0
  398. package/dist/schemas/recipe.v1.json +684 -0
  399. package/dist/server.d.ts +127 -8
  400. package/dist/server.js +740 -933
  401. package/dist/server.js.map +1 -1
  402. package/dist/ssrfGuard.d.ts +54 -0
  403. package/dist/ssrfGuard.js +122 -0
  404. package/dist/ssrfGuard.js.map +1 -0
  405. package/dist/streamableHttp.d.ts +39 -1
  406. package/dist/streamableHttp.js +128 -17
  407. package/dist/streamableHttp.js.map +1 -1
  408. package/dist/tokenUsageTracker.d.ts +33 -0
  409. package/dist/tokenUsageTracker.js +146 -0
  410. package/dist/tokenUsageTracker.js.map +1 -0
  411. package/dist/tools/activityLog.d.ts +2 -0
  412. package/dist/tools/addLinearComment.d.ts +1 -0
  413. package/dist/tools/addLinearComment.js +4 -2
  414. package/dist/tools/addLinearComment.js.map +1 -1
  415. package/dist/tools/batchLsp.d.ts +3 -0
  416. package/dist/tools/bridgeDoctor.d.ts +1 -0
  417. package/dist/tools/bridgeDoctor.js +2 -2
  418. package/dist/tools/bridgeDoctor.js.map +1 -1
  419. package/dist/tools/bridgeStatus.d.ts +1 -0
  420. package/dist/tools/cancelClaudeTask.d.ts +2 -0
  421. package/dist/tools/cancelClaudeTask.js +1 -0
  422. package/dist/tools/cancelClaudeTask.js.map +1 -1
  423. package/dist/tools/checkDocumentDirty.d.ts +1 -0
  424. package/dist/tools/clipboard.d.ts +2 -0
  425. package/dist/tools/closeTabs.d.ts +2 -0
  426. package/dist/tools/codeLens.d.ts +1 -0
  427. package/dist/tools/contextBundle.d.ts +1 -0
  428. package/dist/tools/createIssueFromAIComment.d.ts +1 -0
  429. package/dist/tools/createLinearIssue.d.ts +1 -0
  430. package/dist/tools/ctxGetTaskContext.d.ts +1 -0
  431. package/dist/tools/ctxQueryTraces.d.ts +1 -0
  432. package/dist/tools/ctxSaveTrace.d.ts +1 -0
  433. package/dist/tools/debug.d.ts +4 -0
  434. package/dist/tools/decorations.d.ts +2 -0
  435. package/dist/tools/documentLinks.d.ts +1 -0
  436. package/dist/tools/editText.d.ts +1 -0
  437. package/dist/tools/enrichCommit.d.ts +1 -0
  438. package/dist/tools/enrichStackTrace.d.ts +1 -0
  439. package/dist/tools/explainDiagnostic.d.ts +1 -0
  440. package/dist/tools/explainSymbol.d.ts +1 -0
  441. package/dist/tools/fetchCalendarEvents.d.ts +1 -0
  442. package/dist/tools/fetchGithubIssue.d.ts +1 -0
  443. package/dist/tools/fetchGithubPR.d.ts +1 -0
  444. package/dist/tools/fetchLinearIssue.d.ts +1 -0
  445. package/dist/tools/fetchSentryIssue.d.ts +1 -0
  446. package/dist/tools/fetchSlackProfile.d.ts +1 -0
  447. package/dist/tools/fetchSlackProfile.js +4 -1
  448. package/dist/tools/fetchSlackProfile.js.map +1 -1
  449. package/dist/tools/fileOperations.d.ts +3 -0
  450. package/dist/tools/fileWatcher.d.ts +2 -0
  451. package/dist/tools/findFiles.d.ts +1 -0
  452. package/dist/tools/findRelatedTests.d.ts +1 -0
  453. package/dist/tools/fixAllLintErrors.d.ts +1 -0
  454. package/dist/tools/foldingRanges.d.ts +1 -0
  455. package/dist/tools/formatDocument.d.ts +1 -0
  456. package/dist/tools/generateTests.d.ts +1 -0
  457. package/dist/tools/getAIComments.d.ts +1 -0
  458. package/dist/tools/getAnalyticsReport.d.ts +1 -0
  459. package/dist/tools/getArchitectureContext.d.ts +1 -0
  460. package/dist/tools/getBufferContent.d.ts +1 -0
  461. package/dist/tools/getChangeImpact.d.ts +1 -0
  462. package/dist/tools/getClaudeTaskStatus.d.ts +2 -0
  463. package/dist/tools/getClaudeTaskStatus.js +1 -0
  464. package/dist/tools/getClaudeTaskStatus.js.map +1 -1
  465. package/dist/tools/getCodeCoverage.d.ts +1 -0
  466. package/dist/tools/getCommitsForIssue.d.ts +1 -0
  467. package/dist/tools/getConnectorStatus.d.ts +1 -0
  468. package/dist/tools/getCurrentSelection.d.ts +2 -0
  469. package/dist/tools/getDebugState.d.ts +1 -0
  470. package/dist/tools/getDependencyTree.d.ts +1 -0
  471. package/dist/tools/getDiagnostics.d.ts +1 -0
  472. package/dist/tools/getDiffFromHandoff.d.ts +1 -0
  473. package/dist/tools/getDocumentSymbols.d.ts +25 -0
  474. package/dist/tools/getDocumentSymbols.js +74 -8
  475. package/dist/tools/getDocumentSymbols.js.map +1 -1
  476. package/dist/tools/getFileTree.d.ts +1 -0
  477. package/dist/tools/getGitDiff.d.ts +1 -0
  478. package/dist/tools/getGitHotspots.d.ts +1 -0
  479. package/dist/tools/getGitLog.d.ts +1 -0
  480. package/dist/tools/getGitStatus.d.ts +1 -0
  481. package/dist/tools/getImportTree.d.ts +1 -0
  482. package/dist/tools/getImportedSignatures.d.ts +1 -0
  483. package/dist/tools/getOpenEditors.d.ts +1 -0
  484. package/dist/tools/getPRTemplate.d.ts +1 -0
  485. package/dist/tools/getProjectContext.d.ts +1 -0
  486. package/dist/tools/getProjectInfo.d.ts +1 -0
  487. package/dist/tools/getSecurityAdvisories.d.ts +1 -0
  488. package/dist/tools/getSecurityAdvisories.js +10 -1
  489. package/dist/tools/getSecurityAdvisories.js.map +1 -1
  490. package/dist/tools/getSessionUsage.d.ts +4 -0
  491. package/dist/tools/getSessionUsage.js +3 -0
  492. package/dist/tools/getSessionUsage.js.map +1 -1
  493. package/dist/tools/getSymbolHistory.d.ts +1 -0
  494. package/dist/tools/getToolCapabilities.d.ts +1 -0
  495. package/dist/tools/getTypeSignature.d.ts +1 -0
  496. package/dist/tools/getWorkspaceFolders.d.ts +1 -0
  497. package/dist/tools/getWorkspaceSettings.d.ts +1 -0
  498. package/dist/tools/gitHistory.d.ts +2 -0
  499. package/dist/tools/gitWrite.d.ts +11 -0
  500. package/dist/tools/github/actions.d.ts +2 -0
  501. package/dist/tools/github/actions.js +4 -2
  502. package/dist/tools/github/actions.js.map +1 -1
  503. package/dist/tools/github/composite.d.ts +342 -0
  504. package/dist/tools/github/composite.js +343 -0
  505. package/dist/tools/github/composite.js.map +1 -0
  506. package/dist/tools/github/index.d.ts +1 -0
  507. package/dist/tools/github/index.js +1 -0
  508. package/dist/tools/github/index.js.map +1 -1
  509. package/dist/tools/github/issues.d.ts +4 -0
  510. package/dist/tools/github/issues.js +8 -4
  511. package/dist/tools/github/issues.js.map +1 -1
  512. package/dist/tools/github/pr.d.ts +7 -0
  513. package/dist/tools/github/pr.js +50 -12
  514. package/dist/tools/github/pr.js.map +1 -1
  515. package/dist/tools/handoffNote.d.ts +4 -0
  516. package/dist/tools/handoffNote.js +2 -0
  517. package/dist/tools/handoffNote.js.map +1 -1
  518. package/dist/tools/hoverAtCursor.d.ts +1 -0
  519. package/dist/tools/httpClient.d.ts +2 -0
  520. package/dist/tools/index.d.ts +8 -0
  521. package/dist/tools/index.js +47 -8
  522. package/dist/tools/index.js.map +1 -1
  523. package/dist/tools/inlayHints.d.ts +1 -0
  524. package/dist/tools/launchQuickTask.d.ts +2 -0
  525. package/dist/tools/launchQuickTask.js +1 -0
  526. package/dist/tools/launchQuickTask.js.map +1 -1
  527. package/dist/tools/listClaudeTasks.d.ts +2 -0
  528. package/dist/tools/listClaudeTasks.js +1 -0
  529. package/dist/tools/listClaudeTasks.js.map +1 -1
  530. package/dist/tools/listTerminals.d.ts +1 -0
  531. package/dist/tools/lsp.d.ts +14 -0
  532. package/dist/tools/navigateToSymbolByName.d.ts +1 -0
  533. package/dist/tools/openDiff.d.ts +1 -0
  534. package/dist/tools/openFile.d.ts +1 -0
  535. package/dist/tools/openInBrowser.d.ts +1 -0
  536. package/dist/tools/organizeImports.d.ts +1 -0
  537. package/dist/tools/performanceReport.d.ts +1 -0
  538. package/dist/tools/planPersistence.d.ts +5 -0
  539. package/dist/tools/previewEdit.d.ts +1 -0
  540. package/dist/tools/refactorAnalyze.d.ts +1 -0
  541. package/dist/tools/refactorPreview.d.ts +2 -0
  542. package/dist/tools/refactorPreview.js +1 -0
  543. package/dist/tools/refactorPreview.js.map +1 -1
  544. package/dist/tools/replaceBlock.d.ts +1 -0
  545. package/dist/tools/resumeClaudeTask.d.ts +2 -0
  546. package/dist/tools/resumeClaudeTask.js +1 -0
  547. package/dist/tools/resumeClaudeTask.js.map +1 -1
  548. package/dist/tools/runClaudeTask.d.ts +2 -0
  549. package/dist/tools/runClaudeTask.js +1 -0
  550. package/dist/tools/runClaudeTask.js.map +1 -1
  551. package/dist/tools/runCommand.d.ts +1 -0
  552. package/dist/tools/runCommand.js +5 -0
  553. package/dist/tools/runCommand.js.map +1 -1
  554. package/dist/tools/runTests.d.ts +1 -0
  555. package/dist/tools/saveDocument.d.ts +1 -0
  556. package/dist/tools/screenshotAndAnnotate.d.ts +1 -0
  557. package/dist/tools/searchAndReplace.d.ts +1 -0
  558. package/dist/tools/searchTools.d.ts +1 -0
  559. package/dist/tools/searchTools.js +1 -1
  560. package/dist/tools/searchTools.js.map +1 -1
  561. package/dist/tools/searchWorkspace.d.ts +1 -0
  562. package/dist/tools/selectionRanges.d.ts +1 -0
  563. package/dist/tools/semanticTokens.d.ts +1 -0
  564. package/dist/tools/setActiveWorkspaceFolder.d.ts +1 -0
  565. package/dist/tools/signatureHelp.d.ts +1 -0
  566. package/dist/tools/slackListChannels.d.ts +1 -0
  567. package/dist/tools/slackListChannels.js.map +1 -1
  568. package/dist/tools/slackPostMessage.d.ts +1 -0
  569. package/dist/tools/slackPostMessage.js +11 -6
  570. package/dist/tools/slackPostMessage.js.map +1 -1
  571. package/dist/tools/terminal.d.ts +6 -0
  572. package/dist/tools/terminal.js +4 -0
  573. package/dist/tools/terminal.js.map +1 -1
  574. package/dist/tools/testTraceToSource.d.ts +1 -0
  575. package/dist/tools/testTraceToSource.js +2 -2
  576. package/dist/tools/testTraceToSource.js.map +1 -1
  577. package/dist/tools/transaction.d.ts +23 -0
  578. package/dist/tools/transaction.js +29 -0
  579. package/dist/tools/transaction.js.map +1 -1
  580. package/dist/tools/typeHierarchy.d.ts +1 -0
  581. package/dist/tools/updateLinearIssue.d.ts +1 -0
  582. package/dist/tools/updateLinearIssue.js +20 -6
  583. package/dist/tools/updateLinearIssue.js.map +1 -1
  584. package/dist/tools/utils.d.ts +6 -0
  585. package/dist/tools/utils.js +59 -0
  586. package/dist/tools/utils.js.map +1 -1
  587. package/dist/tools/vscodeCommands.d.ts +2 -0
  588. package/dist/tools/vscodeTasks.d.ts +2 -0
  589. package/dist/tools/workspaceSettings.d.ts +1 -0
  590. package/dist/traceEncryption.d.ts +46 -0
  591. package/dist/traceEncryption.js +124 -0
  592. package/dist/traceEncryption.js.map +1 -0
  593. package/dist/transport.d.ts +46 -1
  594. package/dist/transport.js +173 -19
  595. package/dist/transport.js.map +1 -1
  596. package/package.json +30 -8
  597. package/scripts/mcp-stdio-shim.cjs +19 -3
  598. package/scripts/start-all.sh +34 -3
  599. package/templates/automation-policies/recipe-authoring.json +25 -0
  600. package/templates/automation-policy.example.json +6 -0
  601. package/templates/co.patchwork-os.bridge.plist +34 -0
  602. package/templates/policies/README.md +72 -0
  603. package/templates/policies/conservative.json +14 -0
  604. package/templates/policies/developer.json +14 -0
  605. package/templates/policies/headless-ci.json +24 -0
  606. package/templates/policies/personal-assistant.json +15 -0
  607. package/templates/policies/regulated-industry.json +18 -0
  608. package/templates/recipes/approval-queue-ui-test.yaml +205 -0
  609. package/templates/recipes/lint-on-save.yaml +1 -2
  610. package/templates/recipes/morning-brief-slack.yaml +57 -0
  611. package/templates/recipes/morning-brief.yaml +2 -2
  612. package/templates/recipes/project-health-check.yaml +50 -0
  613. package/templates/recipes/webhook/README.md +70 -0
  614. package/templates/recipes/webhook/capture-thought.yaml +26 -0
  615. package/templates/recipes/webhook/customer-escalation.yaml +49 -0
  616. package/templates/recipes/webhook/incident-intake.yaml +46 -0
  617. package/templates/recipes/webhook/meeting-prep.yaml +48 -0
  618. package/templates/recipes/webhook/morning-brief.yaml +57 -0
@@ -53,6 +53,7 @@ VPS=""
53
53
  FULL_MODE=""
54
54
  NO_DASHBOARD=""
55
55
  DASHBOARD_PORT="3200"
56
+ BRIDGE_PORT_FLAG=""
56
57
  AUTOMATION_POLICY=""
57
58
  CLAUDE_DRIVER="subprocess"
58
59
  BRIDGE_READY_TIMEOUT="${BRIDGE_READY_TIMEOUT:-30}"
@@ -71,6 +72,7 @@ while [[ $# -gt 0 ]]; do
71
72
  --full) FULL_MODE="--full"; shift ;;
72
73
  --no-dashboard) NO_DASHBOARD=1; shift ;;
73
74
  --dashboard-port) DASHBOARD_PORT="$2"; shift 2 ;;
75
+ --bridge-port) BRIDGE_PORT_FLAG="--port $2"; shift 2 ;;
74
76
  --automation-policy) AUTOMATION_POLICY="$2"; shift 2 ;;
75
77
  --claude-driver) CLAUDE_DRIVER="$2"; shift 2 ;;
76
78
  *) echo "Unknown option: $1" >&2; exit 1 ;;
@@ -147,7 +149,7 @@ if [[ -z "${TMUX:-}" ]]; then
147
149
  fi
148
150
  # Create session detached, re-run this script inside it, then attach
149
151
  tmux new-session -d -s "$SESSION" -x 200 -y 50
150
- tmux send-keys -t "$SESSION" "\"$SCRIPT_PATH\" --workspace \"$WORKSPACE\"$([ -n "$NTFY_TOPIC" ] && echo " --notify \"$NTFY_TOPIC\"")$([ -n "$IDE_NAME" ] && echo " --ide \"$IDE_NAME\"")$([ -n "$VPS" ] && echo " --vps \"$VPS\"")$([ -n "$FULL_MODE" ] && echo " --full")" Enter
152
+ tmux send-keys -t "$SESSION" "\"$SCRIPT_PATH\" --workspace \"$WORKSPACE\"$([ -n "$NTFY_TOPIC" ] && echo " --notify \"$NTFY_TOPIC\"")$([ -n "$IDE_NAME" ] && echo " --ide \"$IDE_NAME\"")$([ -n "$VPS" ] && echo " --vps \"$VPS\"")$([ -n "$FULL_MODE" ] && echo " --full")$([ -n "$BRIDGE_PORT_FLAG" ] && echo " ${BRIDGE_PORT_FLAG/--port /--bridge-port }")" Enter
151
153
  exec tmux attach -t "$SESSION"
152
154
  fi
153
155
 
@@ -213,7 +215,7 @@ if [[ -f "$BRIDGE_DIR/src/index.ts" ]]; then
213
215
  else
214
216
  BRIDGE_BIN="node dist/index.js"
215
217
  fi
216
- BRIDGE_CMD="cd $(printf '%q' "$BRIDGE_DIR") && $BRIDGE_BIN --workspace $(printf '%q' "$WORKSPACE")${BRIDGE_IDE_FLAGS:+ $BRIDGE_IDE_FLAGS}${FULL_MODE:+ $FULL_MODE}${BRIDGE_AUTOMATION_FLAGS:+ $BRIDGE_AUTOMATION_FLAGS}"
218
+ BRIDGE_CMD="cd $(printf '%q' "$BRIDGE_DIR") && $BRIDGE_BIN --workspace $(printf '%q' "$WORKSPACE")${BRIDGE_IDE_FLAGS:+ $BRIDGE_IDE_FLAGS}${FULL_MODE:+ $FULL_MODE}${BRIDGE_AUTOMATION_FLAGS:+ $BRIDGE_AUTOMATION_FLAGS}${BRIDGE_PORT_FLAG:+ $BRIDGE_PORT_FLAG}"
217
219
  # Derive a short display name for the Claude session from the workspace directory name.
218
220
  # This appears in Claude Code's session list, making multi-workspace tmux setups identifiable.
219
221
  WS_BASENAME=$(basename "$WORKSPACE")
@@ -379,10 +381,39 @@ tmux send-keys -t "${SESSION}:0.3" "$REMOTE_CMD" Enter
379
381
  # Pane 4: Dashboard (only if not --no-dashboard and dashboard dir exists)
380
382
  DASHBOARD_DIR="$BRIDGE_DIR/dashboard"
381
383
  if [[ -z "$NO_DASHBOARD" ]] && [[ -d "$DASHBOARD_DIR" ]]; then
384
+ # First-run guard: missing node_modules silently breaks `npm run dev` with
385
+ # an unhelpful error in pane 4. Surface a concrete remediation step in the
386
+ # orchestrator pane so the user knows what to do.
387
+ if [[ ! -d "$DASHBOARD_DIR/node_modules" ]]; then
388
+ echo "" >&2
389
+ echo "Error: dashboard/node_modules not found." >&2
390
+ echo "Run: cd $(printf '%q' "$DASHBOARD_DIR") && npm install" >&2
391
+ echo "Then re-run start-all (or pass --no-dashboard to skip)." >&2
392
+ exit 1
393
+ fi
382
394
  BRIDGE_PORT=$(basename "$LOCK_FILE" .lock)
383
- DASHBOARD_CMD="cd $(printf '%q' "$DASHBOARD_DIR") && PATCHWORK_BRIDGE_PORT=${BRIDGE_PORT} npm run dev"
395
+ # Call `next dev -p` directly. `npm run dev` hardcodes `-p 3200`, so
396
+ # `--dashboard-port` previously only changed the printed URL while
397
+ # Next.js stayed on 3200. Bypassing the npm script makes the flag
398
+ # actually configure the dev server end-to-end.
399
+ DASHBOARD_CMD="cd $(printf '%q' "$DASHBOARD_DIR") && PATCHWORK_BRIDGE_PORT=${BRIDGE_PORT} npx next dev -p ${DASHBOARD_PORT}"
384
400
  notify "Starting dashboard on http://localhost:${DASHBOARD_PORT}"
385
401
  tmux send-keys -t "${SESSION}:0.4" "$DASHBOARD_CMD" Enter
402
+ # Poll the dashboard port until Next.js answers, then open the browser.
403
+ # Replaces a fixed 8s sleep that opened a not-yet-ready page on slow
404
+ # machines and added unnecessary delay on fast ones. Times out at 60s.
405
+ (
406
+ for _ in $(seq 1 60); do
407
+ if curl -sS -o /dev/null --max-time 1 \
408
+ "http://localhost:${DASHBOARD_PORT}/" 2>/dev/null; then
409
+ open "http://localhost:${DASHBOARD_PORT}" 2>/dev/null || \
410
+ xdg-open "http://localhost:${DASHBOARD_PORT}" 2>/dev/null || true
411
+ exit 0
412
+ fi
413
+ sleep 1
414
+ done
415
+ notify "Dashboard didn't respond on port ${DASHBOARD_PORT} within 60s — open it manually."
416
+ ) &
386
417
  fi
387
418
 
388
419
  # Pane 5: SSH reverse tunnel (only if --vps was set)
@@ -0,0 +1,25 @@
1
+ {
2
+ "_comment": "recipe-authoring — runs preflight automatically when a .yaml recipe file is saved. Closes the authoring inner loop: edit → save → instant validation feedback via Claude task.",
3
+ "_usage": "Copy to automation-policy.json. Requires --automation --automation-policy <path> --claude-driver subprocess",
4
+
5
+ "automationSystemPrompt": "Recipe lint bot. ≤10 lines. No preamble. List issues with file:line if available. End with 'Recipe OK' when clean.",
6
+
7
+ "onRecipeSave": {
8
+ "enabled": true,
9
+ "cooldownMs": 10000
10
+ },
11
+
12
+ "onFileSave": {
13
+ "enabled": false,
14
+ "_comment": "Disabled — onRecipeSave handles .yaml files. Enable this for non-recipe YAML if needed.",
15
+ "patterns": ["**/*.yaml", "**/*.yml"],
16
+ "cooldownMs": 10000,
17
+ "prompt": "{{file}} saved. getDiagnostics → report issues ≤5 lines."
18
+ },
19
+
20
+ "onGitCommit": {
21
+ "enabled": true,
22
+ "cooldownMs": 15000,
23
+ "prompt": "Committed recipes on {{branch}}: {{files}}\nFor each modified .yaml file: run preflight and report any issues. If all pass, reply 'All recipes OK'."
24
+ }
25
+ }
@@ -20,6 +20,12 @@
20
20
  "cooldownMs": 10000
21
21
  },
22
22
 
23
+ "onRecipeSave": {
24
+ "enabled": false,
25
+ "_comment": "Fires when any .yaml/.yml file is saved. No prompt needed — default runs patchwork recipe preflight and reports issues. Enable when authoring recipes.",
26
+ "cooldownMs": 10000
27
+ },
28
+
23
29
  "onDiagnosticsError": {
24
30
  "enabled": true,
25
31
  "minSeverity": "error",
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
3
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4
+ <plist version="1.0">
5
+ <dict>
6
+ <key>Label</key>
7
+ <string>co.patchwork-os.bridge</string>
8
+ <key>ProgramArguments</key>
9
+ <array>
10
+ <string>__BINARY_PATH__</string>
11
+ <string>--claude-driver</string>
12
+ <string>subprocess</string>
13
+ </array>
14
+ <key>RunAtLoad</key>
15
+ <true/>
16
+ <key>KeepAlive</key>
17
+ <true/>
18
+ <key>StandardOutPath</key>
19
+ <string>__HOME__/Library/Logs/patchwork-os/bridge.log</string>
20
+ <key>StandardErrorPath</key>
21
+ <string>__HOME__/Library/Logs/patchwork-os/bridge.err</string>
22
+ <key>EnvironmentVariables</key>
23
+ <dict>
24
+ <key>HOME</key>
25
+ <string>__HOME__</string>
26
+ <key>PATH</key>
27
+ <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
28
+ </dict>
29
+ <key>WorkingDirectory</key>
30
+ <string>__HOME__</string>
31
+ <key>ThrottleInterval</key>
32
+ <integer>30</integer>
33
+ </dict>
34
+ </plist>
@@ -0,0 +1,72 @@
1
+ # Delegation policy templates
2
+
3
+ Five starter delegation policies for common personas. Each file is a partial
4
+ `~/.patchwork/config.json` you can copy or merge into your own config.
5
+
6
+ > A delegation policy answers three questions: *what may my AI do without
7
+ > asking, what needs approval, and what is forbidden?* See the strategic
8
+ > plan §1.2 for the framing.
9
+
10
+ ## Personas
11
+
12
+ | File | Mode | Push | When to pick |
13
+ |---|---|---|---|
14
+ | [`conservative.json`](conservative.json) | `all` | yes | First-time users, sensitive personal data, learning what your AI actually does. |
15
+ | [`developer.json`](developer.json) | `high` | no | Solo engineer at workstation. Dashboard-only oversight is enough. |
16
+ | [`headless-ci.json`](headless-ci.json) | `off` | no | Build agents, schedulers, CI runners. **No human in the loop** — pair with disabled write recipes. |
17
+ | [`regulated-industry.json`](regulated-industry.json) | `all` | yes | Medicine, law, journalism, finance, gov. Includes managed-settings pointer for compliance-team override. |
18
+ | [`personal-assistant.json`](personal-assistant.json) | `high` | yes | Non-developer life automation. Inbox, calendar, smart home — approve from phone. |
19
+
20
+ ## How to apply
21
+
22
+ ### Fresh install
23
+
24
+ Copy the file into place:
25
+
26
+ ```sh
27
+ cp templates/policies/developer.json ~/.patchwork/config.json
28
+ ```
29
+
30
+ Then add your driver/model (run `patchwork init` for guided setup, or edit
31
+ `config.json` to add `model`, `driver`, `apiKeys`, `localEndpoint`, etc.).
32
+
33
+ ### Already configured
34
+
35
+ Merge with `jq` (drops the `_persona` / `_summary` documentation fields):
36
+
37
+ ```sh
38
+ jq -s '.[0] * (.[1] | with_entries(select(.key | startswith("_") | not)))' \
39
+ ~/.patchwork/config.json templates/policies/developer.json \
40
+ > ~/.patchwork/config.json.new \
41
+ && mv ~/.patchwork/config.json.new ~/.patchwork/config.json
42
+ ```
43
+
44
+ ### Restart
45
+
46
+ ```sh
47
+ patchwork stop
48
+ patchwork start
49
+ ```
50
+
51
+ Restart Claude Code too — the `PreToolUse` hook reads bridge state at session
52
+ start.
53
+
54
+ ## Verify
55
+
56
+ Open the dashboard at `http://localhost:3000/settings`. The **Delegation
57
+ policy** card should reflect your chosen mode. Trigger a tool call and watch
58
+ `/approvals` — the detail page shows *why* a call was gated (matched rule +
59
+ risk tier).
60
+
61
+ ## Key fields
62
+
63
+ - `approvalGate` — `"off" | "high" | "all"`. Coarse gate for `PreToolUse`
64
+ routing.
65
+ - `dashboard.requireApproval` — `["low" | "medium" | "high"]`. Which risk
66
+ tiers require human approval inside the dashboard queue.
67
+ - `dashboard.pushNotifications` — send approval requests to your phone.
68
+ - `enableTimeOfDayAnomaly` — opt-in heuristic 10. Flags calls happening
69
+ outside your typical activity window. Off by default.
70
+ - `managedSettingsPath` — admin-controlled overrides, highest precedence.
71
+ Users cannot override fields set there.
72
+ - `recipes.disabled` — opt out of specific recipes by name.
@@ -0,0 +1,14 @@
1
+ {
2
+ "_persona": "conservative",
3
+ "_summary": "Gate every tool call. Notify on phone. Maximum oversight. Best for first-time users, sensitive personal data, or while learning what your AI actually does.",
4
+ "_usage": "Copy fields into ~/.patchwork/config.json (or merge with `jq`). Restart the bridge and Claude Code.",
5
+
6
+ "approvalGate": "all",
7
+ "enableTimeOfDayAnomaly": true,
8
+
9
+ "dashboard": {
10
+ "port": 3000,
11
+ "requireApproval": ["low", "medium", "high"],
12
+ "pushNotifications": true
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "_persona": "developer",
3
+ "_summary": "Gate high-risk tool calls only. No phone push (dashboard is enough — you're already at your machine). Time-of-day anomaly on. Sensible default for solo engineers running Patchwork on their workstation.",
4
+ "_usage": "Copy fields into ~/.patchwork/config.json (or merge with `jq`). Restart the bridge and Claude Code.",
5
+
6
+ "approvalGate": "high",
7
+ "enableTimeOfDayAnomaly": true,
8
+
9
+ "dashboard": {
10
+ "port": 3000,
11
+ "requireApproval": ["high"],
12
+ "pushNotifications": false
13
+ }
14
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "_persona": "headless-ci",
3
+ "_summary": "No human in the loop. Approval gate off. Disable recipes that touch external systems with side effects. For build agents, scheduled jobs, and CI runners that must not block waiting for a phone tap.",
4
+ "_warning": "Off-mode means *every* tool call passes. Use only when (a) the underlying recipes are auditable and (b) the runner has narrowly-scoped credentials. Pair with managedSettingsPath if running on shared infra.",
5
+ "_usage": "Copy fields into ~/.patchwork/config.json (or merge with `jq`). Restart the bridge.",
6
+
7
+ "approvalGate": "off",
8
+ "enableTimeOfDayAnomaly": false,
9
+
10
+ "dashboard": {
11
+ "port": 3000,
12
+ "requireApproval": [],
13
+ "pushNotifications": false
14
+ },
15
+
16
+ "recipes": {
17
+ "disabled": [
18
+ "send-email",
19
+ "send-slack",
20
+ "github-create-pr",
21
+ "linear-create-issue"
22
+ ]
23
+ }
24
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "_persona": "personal-assistant",
3
+ "_summary": "Friendly default for non-developer use cases — life automation, inbox triage, journal prompts, household ops. Gate high-risk only, push to phone so you can approve while away from your machine.",
4
+ "_targets": "people who want their AI to act on email, calendar, smart home, and notes without watching the dashboard.",
5
+ "_usage": "Copy fields into ~/.patchwork/config.json (or merge with `jq`). Restart the bridge.",
6
+
7
+ "approvalGate": "high",
8
+ "enableTimeOfDayAnomaly": true,
9
+
10
+ "dashboard": {
11
+ "port": 3000,
12
+ "requireApproval": ["high"],
13
+ "pushNotifications": true
14
+ }
15
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "_persona": "regulated-industry",
3
+ "_summary": "Maximum oversight + audit posture. Gate everything, push to phone, time-of-day anomaly on, point at a managed settings file that your compliance team controls (highest precedence — users cannot override).",
4
+ "_targets": "medicine, law, journalism, finance, gov, security work — anywhere you need a paper trail for every AI-initiated action.",
5
+ "_usage": "Copy fields into ~/.patchwork/config.json. Have your compliance team produce the managed settings file at /etc/patchwork/managed-settings.json (or anywhere admin-writable, user-readable). Restart the bridge and Claude Code.",
6
+ "_audit_note": "Decision traces are persisted under ~/.patchwork/traces/ — exportable via `patchwork traces export --encrypt`.",
7
+
8
+ "approvalGate": "all",
9
+ "enableTimeOfDayAnomaly": true,
10
+
11
+ "dashboard": {
12
+ "port": 3000,
13
+ "requireApproval": ["low", "medium", "high"],
14
+ "pushNotifications": true
15
+ },
16
+
17
+ "managedSettingsPath": "/etc/patchwork/managed-settings.json"
18
+ }
@@ -0,0 +1,205 @@
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/patchworkos/recipes/main/schema/recipe.v1.json
2
+ apiVersion: patchwork.sh/v1
3
+ name: approval-queue-ui-test
4
+ description: |
5
+ End-to-end UI test for the dashboard Approval queue page. Drives a real
6
+ browser via the Playwright MCP server to exercise every button on
7
+ /approvals, verifies the expected side effects (network calls, clipboard
8
+ writes, DOM state, keyboard shortcuts), and writes a PASS/FAIL report to
9
+ ~/.patchwork/inbox/.
10
+
11
+ Coverage:
12
+ Header — DecisionsTabs (Pending / Suggested / History), Sync inbox
13
+ Risk filters — All / Low / Medium / High chips
14
+ Card body — params toggle (▸/▾), Copy JSON, Approve (E), Reject (X),
15
+ Edit & approve (clipboard), Open in terminal (clipboard)
16
+ Selection — per-card checkbox, Select all, batch Approve, batch Reject
17
+ Empty state — Clear filter (filtered) and Clear filter (session banner)
18
+ Suggestions card — Copy allow rule, Dismiss (×), Clear all patterns
19
+ Keyboard — J / K (focus), E / X (decide)
20
+
21
+ PREREQUISITES
22
+ 1. Bridge running with --claude-driver subprocess so the agent has MCP
23
+ access to the Playwright server.
24
+ 2. Dashboard reachable at DASHBOARD_URL (defaults to localhost:3000;
25
+ Patchwork's Next.js dev typically mounts under /dashboard, so the
26
+ page at $DASHBOARD_URL/approvals must respond 200).
27
+ 3. approvalGate must be "all" or "high" — if "off", every POST
28
+ /approvals auto-allows ({decision:"allow",reason:"gate_off"}) and
29
+ the queue stays empty. The agent toggles it on at the start of the
30
+ run and restores it at the end.
31
+ 4. Seeded pending approvals — the agent creates them via POST
32
+ /api/bridge/approvals with nohup+disown durability (so the curl
33
+ process survives shell exit; see seeding step). Default TTL is
34
+ 5 min, so all UI work must finish before re-seeding.
35
+ 5. Trigger from the dashboard Recipes page (NOT `patchwork recipe run`)
36
+ — the local subprocess shell has no MCP context.
37
+
38
+ IMPLEMENTATION NOTES (learned from 2026-05-07 dogfood)
39
+ - Click via mcp__playwright__browser_click (real Playwright clicks),
40
+ NOT browser_evaluate(.click()) — Chromium's clipboard.writeText
41
+ requires "transient activation" which programmatic clicks don't
42
+ provide. Edit & approve / Open in terminal silently fail otherwise.
43
+ - Same goes for checkboxes — programmatic input.click() doesn't
44
+ always trigger React's onChange synthetic event reliably.
45
+ - Use the URL ?session= param to force the session-banner branch;
46
+ no need to find a real session.
47
+ - Use the "Low (0)" filter to hit the empty-state branch deterministically
48
+ (without rejecting cards mid-test).
49
+ trigger:
50
+ type: manual
51
+ vars:
52
+ - name: DASHBOARD_URL
53
+ description: "Base URL where the dashboard is reachable from the agent's browser"
54
+ required: false
55
+ default: "http://localhost:3000"
56
+ steps:
57
+ - id: drive_browser
58
+ agent:
59
+ driver: claude-code
60
+ model: claude-haiku-4-5-20251001
61
+ prompt: |
62
+ You are running an end-to-end UI test of the Patchwork Approval
63
+ queue page. Use the Playwright MCP tools (mcp__playwright__*) to
64
+ drive a real browser. Do not skip steps. If a tool call errors,
65
+ record the failure and continue — every checkpoint must be
66
+ attempted so the report is complete.
67
+
68
+ BASE_URL: {{DASHBOARD_URL}}
69
+ TARGET: {{DASHBOARD_URL}}/approvals
70
+
71
+ Use mcp__playwright__browser_snapshot between actions to confirm
72
+ DOM state. Use mcp__playwright__browser_evaluate to read
73
+ navigator.clipboard.readText() (after granting clipboard-read
74
+ permission via browser_evaluate of the appropriate Permissions
75
+ API call) to verify clipboard-writing buttons.
76
+
77
+ ## Checklist — record PASS / FAIL + a one-line note for each
78
+
79
+ ### A. Page load + tabs (DecisionsTabs)
80
+ A1. browser_navigate to TARGET. Snapshot. Confirm h1 contains
81
+ "Approval queue".
82
+ A2. Click the "Suggested" tab. Confirm URL becomes /suggestions.
83
+ A3. browser_navigate_back. Confirm URL returns to /approvals.
84
+ A4. Click the "History" tab. Confirm URL becomes /decisions.
85
+ A5. browser_navigate_back to /approvals.
86
+
87
+ ### B. Header controls
88
+ B1. Click "Sync inbox". Use browser_network_requests to confirm a
89
+ GET request to /api/bridge/approvals fired within 2s.
90
+
91
+ ### C. Risk filter chips (All / Low / Medium / High)
92
+ For each label in [All, Low, Medium, High]:
93
+ C{n}. Click the filter chip with text starting with that label.
94
+ Confirm aria-pressed="true" on the clicked chip and
95
+ aria-pressed="false" on the others. Confirm the URL
96
+ ?risk= param matches (or is absent for "All").
97
+
98
+ ### D. Per-card controls — pick the FIRST visible approval card
99
+ Skip section D with a clear note if the queue is empty.
100
+ D1. Click the card's "Full params" toggle (▸). Confirm it
101
+ switches to ▾ and the params JSON region expands.
102
+ D2. Click "Copy JSON". Read clipboard; confirm it parses as JSON
103
+ and equals the card's params.
104
+ D3. Click "Edit & approve". Read clipboard; confirm it starts
105
+ with "patchwork approve --edit ".
106
+ D4. Click "› Open in terminal". Read clipboard; confirm it
107
+ starts with "patchwork approve " (no --edit).
108
+ D5. Note the card's callId, then click the per-card checkbox.
109
+ Confirm the checkbox is checked and the BatchActionBar
110
+ renders with "1 selected".
111
+ D6. Uncheck the same checkbox. Confirm BatchActionBar disappears.
112
+
113
+ ### E. Select-all + batch (only if filtered.length > 1)
114
+ Skip with a note if there are fewer than 2 cards.
115
+ E1. Click "Select all". Confirm every visible card checkbox is
116
+ checked.
117
+ E2. Confirm BatchActionBar shows "Approve selected (N)" and
118
+ "Reject selected (N)" with N === visible card count.
119
+ E3. Do NOT click batch Approve / Reject in this run — they fire
120
+ real POSTs and would mutate state. Just record that the
121
+ buttons render and are not disabled.
122
+ E4. Uncheck "Select all". Confirm all card checkboxes clear.
123
+
124
+ ### F. Empty-state "Clear filter"
125
+ F1. Click the "High" risk filter. If the resulting list is empty,
126
+ confirm the EmptyState renders with a "Clear filter" button.
127
+ Click it; confirm the filter resets to All.
128
+ If the High filter still has cards, record SKIP with reason.
129
+
130
+ ### G. Keyboard shortcuts
131
+ G1. Press "j" via browser_press_key. Confirm focus advances to
132
+ the next card (outline: 2px solid var(--accent) on the
133
+ second card).
134
+ G2. Press "k". Confirm focus returns to the first card.
135
+ G3. Do NOT press E or X — they fire real decisions. Record only
136
+ that the keyboard hint row renders KeyChip pills for J, K,
137
+ E, X, ⌘K.
138
+
139
+ ### H. Suggestions card (best-effort)
140
+ H1. Scroll to bottom. If "Pattern suggestions" card is visible
141
+ (depends on local approval history, may not exist), click
142
+ "Copy allow rule" on the first row and confirm clipboard
143
+ contains JSON like {"allow":["<toolName>"]}. Otherwise
144
+ record SKIP: "no suggestions in queue".
145
+
146
+ ### I. Session-filter banner
147
+ I1. browser_navigate to {{DASHBOARD_URL}}/approvals?session=test1234.
148
+ Confirm the info banner renders with text containing
149
+ "Showing approvals for session". Click the banner's
150
+ "Clear filter" link; confirm URL becomes /approvals.
151
+
152
+ ## Final step — write the report
153
+ Output ONLY the markdown block below, nothing else:
154
+
155
+ ```
156
+ # approval-queue-ui-test — {{date}} {{time}}
157
+
158
+ Base URL: {{DASHBOARD_URL}}
159
+ Browser: <user-agent from snapshot>
160
+
161
+ ## Result: PASS / FAIL (FAIL if any checkpoint failed)
162
+
163
+ ### A. Page load + tabs
164
+ - A1 ... A5 — PASS / FAIL / SKIP — <note>
165
+
166
+ ### B. Header controls
167
+ - B1 — ...
168
+
169
+ ### C. Risk filters
170
+ - All — ...
171
+ - Low — ...
172
+ - Medium — ...
173
+ - High — ...
174
+
175
+ ### D. Per-card controls
176
+ - D1 ... D6 — ...
177
+
178
+ ### E. Select-all + batch
179
+ - E1 ... E4 — ...
180
+
181
+ ### F. Empty-state Clear filter
182
+ - F1 — ...
183
+
184
+ ### G. Keyboard shortcuts
185
+ - G1 ... G3 — ...
186
+
187
+ ### H. Suggestions card
188
+ - H1 — ...
189
+
190
+ ### I. Session-filter banner
191
+ - I1 — ...
192
+
193
+ ### Failures
194
+ <bullet list of every FAIL with the full error / screenshot ref;
195
+ "none" if clean>
196
+
197
+ ### Verdict
198
+ <one sentence>
199
+ ```
200
+ into: report
201
+
202
+ - id: write_report
203
+ tool: file.write
204
+ path: ~/.patchwork/inbox/approval-queue-ui-test-{{date}}.md
205
+ content: "{{report}}\n"
@@ -9,5 +9,4 @@ steps:
9
9
  into: diags
10
10
  - tool: file.append
11
11
  path: ~/.patchwork/inbox/lint.md
12
- content: "- {{time}} {{file}} — {{diags.errors}} errors, {{diags.warnings}} warnings\n"
13
- when: "{{diags.errors}} > 0 || {{diags.warnings}} > 0"
12
+ content: "- {{time}} {{file}} — {{diags}}\n"
@@ -0,0 +1,57 @@
1
+ name: morning-brief-slack
2
+ description: Daily morning brief combining calendar, GitHub PRs, and Linear issues — posted to Slack.
3
+ trigger:
4
+ type: cron
5
+ at: "0 8 * * 1-5"
6
+ steps:
7
+ - tool: github.list_prs
8
+ author: "@me"
9
+ max: 10
10
+ into: prs
11
+ - tool: linear.list_issues
12
+ assignee: "@me"
13
+ state: "started,unstarted"
14
+ max: 15
15
+ into: linear_issues
16
+ - tool: calendar.list_events
17
+ days_ahead: 1
18
+ max: 10
19
+ into: calendar
20
+ - agent:
21
+ prompt: |
22
+ You are a personal assistant writing a concise morning brief. Use ONLY the data provided below — do not call any tools or fetch additional information.
23
+
24
+ OPEN PULL REQUESTS (authored by me):
25
+ {{prs}}
26
+
27
+ LINEAR ISSUES (assigned to me, in progress or unstarted):
28
+ {{linear_issues}}
29
+
30
+ TODAY'S CALENDAR EVENTS:
31
+ {{calendar}}
32
+
33
+ Write a short morning brief for Slack. Rules:
34
+ - Plain text only. No markdown headers (no # or ## lines). No code blocks.
35
+ - Use emoji to start each section.
36
+ - Do NOT include a title or greeting line like "Morning Brief" or "Good morning" — start directly with the first section.
37
+
38
+ 📅 *Calendar* — list today's meetings with time; write "No meetings today" if empty or error
39
+ 🔀 *Pull Requests* — list open PRs needing attention; omit section entirely if empty
40
+ 📋 *Linear* — list in-progress and unstarted issues by priority; omit section entirely if empty or error
41
+
42
+ Keep it under 15 lines. Be direct. Output only the brief, nothing else.
43
+ driver: claude-code
44
+ model: claude-haiku-4-5-20251001
45
+ into: brief
46
+ - tool: file.write
47
+ path: ~/.patchwork/inbox/morning-brief-{{date}}.md
48
+ content: |
49
+ # Morning brief — {{date}}
50
+
51
+ {{brief}}
52
+ - tool: slack.post_message
53
+ channel: all-massappealdesigns
54
+ text: |
55
+ *Morning Brief — {{date}}*
56
+
57
+ {{brief}}
@@ -61,8 +61,8 @@ steps:
61
61
  6. **Linear** — list in-progress and unstarted issues by priority; omit this section entirely if the list is empty or returned an error
62
62
 
63
63
  Be concise. Skip newsletters and automated notifications.
64
- driver: claude-code
65
- model: claude-haiku-4-5-20251001
64
+ # Use claude (not gemini) — Gemini free tier hits daily quota mid-recipe
65
+ driver: claude
66
66
  into: brief
67
67
  - tool: file.write
68
68
  path: ~/.patchwork/inbox/morning-brief-{{date}}.md
@@ -0,0 +1,50 @@
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/patchworkos/recipes/main/schema/recipe.v1.json
2
+ apiVersion: patchwork.sh/v1
3
+ name: project-health-check
4
+ description: Fetch git activity, open issues, and diagnostics in parallel, then write a health summary.
5
+ trigger:
6
+ type: manual
7
+ maxConcurrency: 4
8
+ steps:
9
+ - id: gather
10
+ parallel:
11
+ - id: commits
12
+ tool: git.log_since
13
+ since: 24h
14
+ - id: issues
15
+ tool: github.list_issues
16
+ assignee: "@me"
17
+ max: 20
18
+ - id: prs
19
+ tool: github.list_prs
20
+ author: "@me"
21
+ max: 10
22
+ - id: summarize
23
+ agent:
24
+ prompt: |
25
+ Write a concise project health summary using ONLY the data below.
26
+
27
+ RECENT COMMITS (last 24h):
28
+ {{commits}}
29
+
30
+ OPEN ISSUES (assigned to me):
31
+ {{issues}}
32
+
33
+ OPEN PULL REQUESTS:
34
+ {{prs}}
35
+
36
+ Sections:
37
+ 1. **Activity** — what shipped or changed in the last 24 hours
38
+ 2. **Issues** — issues needing attention today; omit if empty
39
+ 3. **PRs** — PRs waiting on review or action; omit if empty
40
+ 4. **Health** — one-sentence overall assessment (on track / needs attention / blocked)
41
+ driver: claude
42
+ awaits: [gather]
43
+ - id: write
44
+ tool: file.write
45
+ path: ~/.patchwork/inbox/health-{{date}}.md
46
+ content: |
47
+ # Project health — {{date}}
48
+
49
+ {{summarize}}
50
+ awaits: [summarize]