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.
- package/README.bridge.md +6 -0
- package/README.md +318 -35
- package/deploy/bootstrap-new-vps.sh +12 -12
- package/deploy/bootstrap-vps.sh +187 -0
- package/deploy/deploy-dashboard.sh +174 -0
- package/deploy/deploy-landing.sh +136 -0
- package/dist/activationMetrics.d.ts +67 -0
- package/dist/activationMetrics.js +255 -0
- package/dist/activationMetrics.js.map +1 -0
- package/dist/activityLog.d.ts +49 -0
- package/dist/activityLog.js +78 -0
- package/dist/activityLog.js.map +1 -1
- package/dist/analyticsAggregator.d.ts +5 -1
- package/dist/analyticsAggregator.js +15 -4
- package/dist/analyticsAggregator.js.map +1 -1
- package/dist/analyticsPrefs.d.ts +11 -0
- package/dist/analyticsPrefs.js +33 -0
- package/dist/analyticsPrefs.js.map +1 -1
- package/dist/approvalHttp.d.ts +49 -2
- package/dist/approvalHttp.js +217 -21
- package/dist/approvalHttp.js.map +1 -1
- package/dist/approvalInsights.d.ts +49 -0
- package/dist/approvalInsights.js +97 -0
- package/dist/approvalInsights.js.map +1 -0
- package/dist/approvalQueue.d.ts +27 -1
- package/dist/approvalQueue.js +123 -3
- package/dist/approvalQueue.js.map +1 -1
- package/dist/approvalSignals.d.ts +124 -0
- package/dist/approvalSignals.js +512 -0
- package/dist/approvalSignals.js.map +1 -0
- package/dist/automation.d.ts +57 -0
- package/dist/automation.js +156 -59
- package/dist/automation.js.map +1 -1
- package/dist/automationSuggestions.d.ts +79 -0
- package/dist/automationSuggestions.js +150 -0
- package/dist/automationSuggestions.js.map +1 -0
- package/dist/bridge.d.ts +3 -0
- package/dist/bridge.js +194 -153
- package/dist/bridge.js.map +1 -1
- package/dist/bridgeToken.js +57 -19
- package/dist/bridgeToken.js.map +1 -1
- package/dist/ccPermissions.d.ts +15 -0
- package/dist/ccPermissions.js +21 -4
- package/dist/ccPermissions.js.map +1 -1
- package/dist/claudeDriver.d.ts +0 -16
- package/dist/claudeDriver.js +93 -36
- package/dist/claudeDriver.js.map +1 -1
- package/dist/claudeMdPatch.d.ts +9 -3
- package/dist/claudeMdPatch.js +79 -13
- package/dist/claudeMdPatch.js.map +1 -1
- package/dist/claudeOrchestrator.d.ts +13 -1
- package/dist/claudeOrchestrator.js +16 -8
- package/dist/claudeOrchestrator.js.map +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/launchd.d.ts +2 -0
- package/dist/commands/launchd.js +94 -0
- package/dist/commands/launchd.js.map +1 -0
- package/dist/commands/marketplace.d.ts +15 -10
- package/dist/commands/marketplace.js +27 -115
- package/dist/commands/marketplace.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +8 -0
- package/dist/commands/patchworkInit.js +77 -11
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +289 -0
- package/dist/commands/recipe.js +1359 -0
- package/dist/commands/recipe.js.map +1 -0
- package/dist/commands/recipeInstall.d.ts +150 -0
- package/dist/commands/recipeInstall.js +647 -0
- package/dist/commands/recipeInstall.js.map +1 -0
- package/dist/commands/tracesExport.d.ts +83 -0
- package/dist/commands/tracesExport.js +269 -0
- package/dist/commands/tracesExport.js.map +1 -0
- package/dist/commands/tracesImport.d.ts +56 -0
- package/dist/commands/tracesImport.js +161 -0
- package/dist/commands/tracesImport.js.map +1 -0
- package/dist/commitIssueLinkLog.d.ts +8 -0
- package/dist/commitIssueLinkLog.js +53 -1
- package/dist/commitIssueLinkLog.js.map +1 -1
- package/dist/config.d.ts +23 -2
- package/dist/config.js +119 -9
- package/dist/config.js.map +1 -1
- package/dist/connectorRoutes.d.ts +43 -0
- package/dist/connectorRoutes.js +1300 -0
- package/dist/connectorRoutes.js.map +1 -0
- package/dist/connectors/asana.d.ts +198 -0
- package/dist/connectors/asana.js +679 -0
- package/dist/connectors/asana.js.map +1 -0
- package/dist/connectors/baseConnector.d.ts +153 -0
- package/dist/connectors/baseConnector.js +336 -0
- package/dist/connectors/baseConnector.js.map +1 -0
- package/dist/connectors/confluence.d.ts +111 -0
- package/dist/connectors/confluence.js +406 -0
- package/dist/connectors/confluence.js.map +1 -0
- package/dist/connectors/datadog.d.ts +116 -0
- package/dist/connectors/datadog.js +385 -0
- package/dist/connectors/datadog.js.map +1 -0
- package/dist/connectors/discord.d.ts +150 -0
- package/dist/connectors/discord.js +543 -0
- package/dist/connectors/discord.js.map +1 -0
- package/dist/connectors/fixtureLibrary.d.ts +21 -0
- package/dist/connectors/fixtureLibrary.js +70 -0
- package/dist/connectors/fixtureLibrary.js.map +1 -0
- package/dist/connectors/fixtureRecorder.d.ts +1 -0
- package/dist/connectors/fixtureRecorder.js +35 -0
- package/dist/connectors/fixtureRecorder.js.map +1 -0
- package/dist/connectors/github.js +17 -18
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gitlab.d.ts +180 -0
- package/dist/connectors/gitlab.js +582 -0
- package/dist/connectors/gitlab.js.map +1 -0
- package/dist/connectors/gmail.d.ts +4 -1
- package/dist/connectors/gmail.js +149 -27
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.d.ts +4 -1
- package/dist/connectors/googleCalendar.js +88 -25
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/googleDrive.d.ts +34 -0
- package/dist/connectors/googleDrive.js +321 -0
- package/dist/connectors/googleDrive.js.map +1 -0
- package/dist/connectors/htmlEscape.d.ts +5 -0
- package/dist/connectors/htmlEscape.js +13 -0
- package/dist/connectors/htmlEscape.js.map +1 -0
- package/dist/connectors/hubspot.d.ts +112 -0
- package/dist/connectors/hubspot.js +408 -0
- package/dist/connectors/hubspot.js.map +1 -0
- package/dist/connectors/intercom.d.ts +102 -0
- package/dist/connectors/intercom.js +402 -0
- package/dist/connectors/intercom.js.map +1 -0
- package/dist/connectors/jira.d.ts +98 -0
- package/dist/connectors/jira.js +396 -0
- package/dist/connectors/jira.js.map +1 -0
- package/dist/connectors/linear.js +30 -19
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpOAuth.d.ts +3 -0
- package/dist/connectors/mcpOAuth.js +64 -10
- package/dist/connectors/mcpOAuth.js.map +1 -1
- package/dist/connectors/mockConnector.d.ts +28 -0
- package/dist/connectors/mockConnector.js +81 -0
- package/dist/connectors/mockConnector.js.map +1 -0
- package/dist/connectors/notion.d.ts +143 -0
- package/dist/connectors/notion.js +424 -0
- package/dist/connectors/notion.js.map +1 -0
- package/dist/connectors/oauthStateStore.d.ts +31 -0
- package/dist/connectors/oauthStateStore.js +52 -0
- package/dist/connectors/oauthStateStore.js.map +1 -0
- package/dist/connectors/pagerduty.d.ts +160 -0
- package/dist/connectors/pagerduty.js +464 -0
- package/dist/connectors/pagerduty.js.map +1 -0
- package/dist/connectors/sentry.js +5 -13
- package/dist/connectors/sentry.js.map +1 -1
- package/dist/connectors/slack.d.ts +16 -1
- package/dist/connectors/slack.js +155 -32
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/stripe.d.ts +116 -0
- package/dist/connectors/stripe.js +379 -0
- package/dist/connectors/stripe.js.map +1 -0
- package/dist/connectors/tokenStorage.d.ts +35 -0
- package/dist/connectors/tokenStorage.js +484 -0
- package/dist/connectors/tokenStorage.js.map +1 -0
- package/dist/connectors/zendesk.d.ts +104 -0
- package/dist/connectors/zendesk.js +442 -0
- package/dist/connectors/zendesk.js.map +1 -0
- package/dist/cors.d.ts +10 -0
- package/dist/cors.js +29 -0
- package/dist/cors.js.map +1 -0
- package/dist/decisionReplay.d.ts +72 -0
- package/dist/decisionReplay.js +92 -0
- package/dist/decisionReplay.js.map +1 -0
- package/dist/decisionTraceLog.d.ts +6 -0
- package/dist/decisionTraceLog.js +54 -2
- package/dist/decisionTraceLog.js.map +1 -1
- package/dist/drivers/claude/subprocess.d.ts +12 -2
- package/dist/drivers/claude/subprocess.js +79 -6
- package/dist/drivers/claude/subprocess.js.map +1 -1
- package/dist/drivers/gemini/api.d.ts +18 -0
- package/dist/drivers/gemini/api.js +29 -0
- package/dist/drivers/gemini/api.js.map +1 -0
- package/dist/drivers/gemini/index.d.ts +5 -1
- package/dist/drivers/gemini/index.js +39 -5
- package/dist/drivers/gemini/index.js.map +1 -1
- package/dist/drivers/index.d.ts +8 -1
- package/dist/drivers/index.js +10 -2
- package/dist/drivers/index.js.map +1 -1
- package/dist/drivers/local/index.d.ts +26 -0
- package/dist/drivers/local/index.js +41 -0
- package/dist/drivers/local/index.js.map +1 -0
- package/dist/featureFlags.d.ts +79 -0
- package/dist/featureFlags.js +208 -0
- package/dist/featureFlags.js.map +1 -0
- package/dist/fp/automationInterpreter.js +26 -21
- package/dist/fp/automationInterpreter.js.map +1 -1
- package/dist/fp/automationProgram.d.ts +1 -1
- package/dist/fp/automationProgram.js.map +1 -1
- package/dist/fp/automationState.js +4 -1
- package/dist/fp/automationState.js.map +1 -1
- package/dist/fp/policyParser.js +21 -1
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/httpErrorResponse.d.ts +36 -0
- package/dist/httpErrorResponse.js +46 -0
- package/dist/httpErrorResponse.js.map +1 -0
- package/dist/inboxRoutes.d.ts +22 -0
- package/dist/inboxRoutes.js +193 -0
- package/dist/inboxRoutes.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1403 -203
- package/dist/index.js.map +1 -1
- package/dist/installGuard.d.ts +25 -0
- package/dist/installGuard.js +48 -0
- package/dist/installGuard.js.map +1 -0
- package/dist/mcpRoutes.d.ts +37 -0
- package/dist/mcpRoutes.js +76 -0
- package/dist/mcpRoutes.js.map +1 -0
- package/dist/oauth.d.ts +20 -1
- package/dist/oauth.js +214 -39
- package/dist/oauth.js.map +1 -1
- package/dist/oauthRoutes.d.ts +32 -0
- package/dist/oauthRoutes.js +119 -0
- package/dist/oauthRoutes.js.map +1 -0
- package/dist/orchestrator/orchestratorBridge.js +2 -2
- package/dist/orchestrator/orchestratorBridge.js.map +1 -1
- package/dist/patchworkConfig.d.ts +29 -0
- package/dist/patchworkConfig.js +100 -5
- package/dist/patchworkConfig.js.map +1 -1
- package/dist/pluginLoader.d.ts +28 -0
- package/dist/pluginLoader.js +77 -11
- package/dist/pluginLoader.js.map +1 -1
- package/dist/pluginWatcher.js +8 -3
- package/dist/pluginWatcher.js.map +1 -1
- package/dist/preToolUseHook.d.ts +12 -0
- package/dist/preToolUseHook.js +30 -1
- package/dist/preToolUseHook.js.map +1 -1
- package/dist/prompts.js +4 -0
- package/dist/prompts.js.map +1 -1
- package/dist/recipeOrchestration.d.ts +121 -0
- package/dist/recipeOrchestration.js +965 -0
- package/dist/recipeOrchestration.js.map +1 -0
- package/dist/recipeRoutes.d.ts +185 -0
- package/dist/recipeRoutes.js +1369 -0
- package/dist/recipeRoutes.js.map +1 -0
- package/dist/recipes/RecipeOrchestrator.d.ts +40 -0
- package/dist/recipes/RecipeOrchestrator.js +51 -0
- package/dist/recipes/RecipeOrchestrator.js.map +1 -0
- package/dist/recipes/agentExecutor.d.ts +38 -0
- package/dist/recipes/agentExecutor.js +50 -0
- package/dist/recipes/agentExecutor.js.map +1 -0
- package/dist/recipes/chainedRunner.d.ts +191 -0
- package/dist/recipes/chainedRunner.js +759 -0
- package/dist/recipes/chainedRunner.js.map +1 -0
- package/dist/recipes/compiler.js +3 -3
- package/dist/recipes/compiler.js.map +1 -1
- package/dist/recipes/dependencyGraph.d.ts +39 -0
- package/dist/recipes/dependencyGraph.js +199 -0
- package/dist/recipes/dependencyGraph.js.map +1 -0
- package/dist/recipes/disabledMarkers.d.ts +48 -0
- package/dist/recipes/disabledMarkers.js +52 -0
- package/dist/recipes/disabledMarkers.js.map +1 -0
- package/dist/recipes/installer.js +3 -3
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/legacyRecipeCompat.d.ts +10 -0
- package/dist/recipes/legacyRecipeCompat.js +131 -0
- package/dist/recipes/legacyRecipeCompat.js.map +1 -0
- package/dist/recipes/manifest.d.ts +47 -0
- package/dist/recipes/manifest.js +156 -0
- package/dist/recipes/manifest.js.map +1 -0
- package/dist/recipes/migrationWarnings.d.ts +12 -0
- package/dist/recipes/migrationWarnings.js +44 -0
- package/dist/recipes/migrationWarnings.js.map +1 -0
- package/dist/recipes/migrations/index.d.ts +24 -0
- package/dist/recipes/migrations/index.js +55 -0
- package/dist/recipes/migrations/index.js.map +1 -0
- package/dist/recipes/migrations/types.d.ts +28 -0
- package/dist/recipes/migrations/types.js +2 -0
- package/dist/recipes/migrations/types.js.map +1 -0
- package/dist/recipes/migrations/v1.d.ts +11 -0
- package/dist/recipes/migrations/v1.js +18 -0
- package/dist/recipes/migrations/v1.js.map +1 -0
- package/dist/recipes/names.d.ts +40 -0
- package/dist/recipes/names.js +66 -0
- package/dist/recipes/names.js.map +1 -0
- package/dist/recipes/nestedRecipeStep.d.ts +58 -0
- package/dist/recipes/nestedRecipeStep.js +95 -0
- package/dist/recipes/nestedRecipeStep.js.map +1 -0
- package/dist/recipes/outputRegistry.d.ts +28 -0
- package/dist/recipes/outputRegistry.js +52 -0
- package/dist/recipes/outputRegistry.js.map +1 -0
- package/dist/recipes/parser.js +4 -1
- package/dist/recipes/parser.js.map +1 -1
- package/dist/recipes/replayRun.d.ts +62 -0
- package/dist/recipes/replayRun.js +97 -0
- package/dist/recipes/replayRun.js.map +1 -0
- package/dist/recipes/resolveRecipePath.d.ts +69 -0
- package/dist/recipes/resolveRecipePath.js +202 -0
- package/dist/recipes/resolveRecipePath.js.map +1 -0
- package/dist/recipes/scheduler.d.ts +23 -7
- package/dist/recipes/scheduler.js +225 -45
- package/dist/recipes/scheduler.js.map +1 -1
- package/dist/recipes/schema.d.ts +17 -2
- package/dist/recipes/schemaGenerator.d.ts +28 -0
- package/dist/recipes/schemaGenerator.js +565 -0
- package/dist/recipes/schemaGenerator.js.map +1 -0
- package/dist/recipes/stepObservation.d.ts +44 -0
- package/dist/recipes/stepObservation.js +232 -0
- package/dist/recipes/stepObservation.js.map +1 -0
- package/dist/recipes/templateEngine.d.ts +62 -0
- package/dist/recipes/templateEngine.js +201 -0
- package/dist/recipes/templateEngine.js.map +1 -0
- package/dist/recipes/toolRegistry.d.ts +186 -0
- package/dist/recipes/toolRegistry.js +309 -0
- package/dist/recipes/toolRegistry.js.map +1 -0
- package/dist/recipes/tools/asana.d.ts +16 -0
- package/dist/recipes/tools/asana.js +524 -0
- package/dist/recipes/tools/asana.js.map +1 -0
- package/dist/recipes/tools/calendar.d.ts +6 -0
- package/dist/recipes/tools/calendar.js +61 -0
- package/dist/recipes/tools/calendar.js.map +1 -0
- package/dist/recipes/tools/confluence.d.ts +6 -0
- package/dist/recipes/tools/confluence.js +254 -0
- package/dist/recipes/tools/confluence.js.map +1 -0
- package/dist/recipes/tools/datadog.d.ts +6 -0
- package/dist/recipes/tools/datadog.js +239 -0
- package/dist/recipes/tools/datadog.js.map +1 -0
- package/dist/recipes/tools/diagnostics.d.ts +6 -0
- package/dist/recipes/tools/diagnostics.js +36 -0
- package/dist/recipes/tools/diagnostics.js.map +1 -0
- package/dist/recipes/tools/discord.d.ts +18 -0
- package/dist/recipes/tools/discord.js +254 -0
- package/dist/recipes/tools/discord.js.map +1 -0
- package/dist/recipes/tools/file.d.ts +12 -0
- package/dist/recipes/tools/file.js +174 -0
- package/dist/recipes/tools/file.js.map +1 -0
- package/dist/recipes/tools/git.d.ts +6 -0
- package/dist/recipes/tools/git.js +63 -0
- package/dist/recipes/tools/git.js.map +1 -0
- package/dist/recipes/tools/github.d.ts +6 -0
- package/dist/recipes/tools/github.js +116 -0
- package/dist/recipes/tools/github.js.map +1 -0
- package/dist/recipes/tools/gitlab.d.ts +11 -0
- package/dist/recipes/tools/gitlab.js +285 -0
- package/dist/recipes/tools/gitlab.js.map +1 -0
- package/dist/recipes/tools/gmail.d.ts +6 -0
- package/dist/recipes/tools/gmail.js +451 -0
- package/dist/recipes/tools/gmail.js.map +1 -0
- package/dist/recipes/tools/googleDrive.d.ts +1 -0
- package/dist/recipes/tools/googleDrive.js +55 -0
- package/dist/recipes/tools/googleDrive.js.map +1 -0
- package/dist/recipes/tools/hubspot.d.ts +6 -0
- package/dist/recipes/tools/hubspot.js +232 -0
- package/dist/recipes/tools/hubspot.js.map +1 -0
- package/dist/recipes/tools/index.d.ts +30 -0
- package/dist/recipes/tools/index.js +33 -0
- package/dist/recipes/tools/index.js.map +1 -0
- package/dist/recipes/tools/intercom.d.ts +6 -0
- package/dist/recipes/tools/intercom.js +226 -0
- package/dist/recipes/tools/intercom.js.map +1 -0
- package/dist/recipes/tools/jira.d.ts +14 -0
- package/dist/recipes/tools/jira.js +369 -0
- package/dist/recipes/tools/jira.js.map +1 -0
- package/dist/recipes/tools/linear.d.ts +7 -0
- package/dist/recipes/tools/linear.js +307 -0
- package/dist/recipes/tools/linear.js.map +1 -0
- package/dist/recipes/tools/meetingNotes.d.ts +21 -0
- package/dist/recipes/tools/meetingNotes.js +701 -0
- package/dist/recipes/tools/meetingNotes.js.map +1 -0
- package/dist/recipes/tools/notion.d.ts +6 -0
- package/dist/recipes/tools/notion.js +278 -0
- package/dist/recipes/tools/notion.js.map +1 -0
- package/dist/recipes/tools/pagerduty.d.ts +15 -0
- package/dist/recipes/tools/pagerduty.js +451 -0
- package/dist/recipes/tools/pagerduty.js.map +1 -0
- package/dist/recipes/tools/sentry.d.ts +12 -0
- package/dist/recipes/tools/sentry.js +73 -0
- package/dist/recipes/tools/sentry.js.map +1 -0
- package/dist/recipes/tools/slack.d.ts +6 -0
- package/dist/recipes/tools/slack.js +82 -0
- package/dist/recipes/tools/slack.js.map +1 -0
- package/dist/recipes/tools/stripe.d.ts +6 -0
- package/dist/recipes/tools/stripe.js +265 -0
- package/dist/recipes/tools/stripe.js.map +1 -0
- package/dist/recipes/tools/zendesk.d.ts +6 -0
- package/dist/recipes/tools/zendesk.js +245 -0
- package/dist/recipes/tools/zendesk.js.map +1 -0
- package/dist/recipes/validation.d.ts +13 -0
- package/dist/recipes/validation.js +617 -0
- package/dist/recipes/validation.js.map +1 -0
- package/dist/recipes/yamlRunner.d.ts +130 -2
- package/dist/recipes/yamlRunner.js +1009 -402
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/recipesHttp.d.ts +151 -6
- package/dist/recipesHttp.js +999 -29
- package/dist/recipesHttp.js.map +1 -1
- package/dist/riskTier.js +7 -1
- package/dist/riskTier.js.map +1 -1
- package/dist/runLog.d.ts +100 -1
- package/dist/runLog.js +258 -5
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/dry-run-plan.v1.json +139 -0
- package/dist/schemas/recipe.v1.json +684 -0
- package/dist/server.d.ts +127 -8
- package/dist/server.js +740 -933
- package/dist/server.js.map +1 -1
- package/dist/ssrfGuard.d.ts +54 -0
- package/dist/ssrfGuard.js +122 -0
- package/dist/ssrfGuard.js.map +1 -0
- package/dist/streamableHttp.d.ts +39 -1
- package/dist/streamableHttp.js +128 -17
- package/dist/streamableHttp.js.map +1 -1
- package/dist/tokenUsageTracker.d.ts +33 -0
- package/dist/tokenUsageTracker.js +146 -0
- package/dist/tokenUsageTracker.js.map +1 -0
- package/dist/tools/activityLog.d.ts +2 -0
- package/dist/tools/addLinearComment.d.ts +1 -0
- package/dist/tools/addLinearComment.js +4 -2
- package/dist/tools/addLinearComment.js.map +1 -1
- package/dist/tools/batchLsp.d.ts +3 -0
- package/dist/tools/bridgeDoctor.d.ts +1 -0
- package/dist/tools/bridgeDoctor.js +2 -2
- package/dist/tools/bridgeDoctor.js.map +1 -1
- package/dist/tools/bridgeStatus.d.ts +1 -0
- package/dist/tools/cancelClaudeTask.d.ts +2 -0
- package/dist/tools/cancelClaudeTask.js +1 -0
- package/dist/tools/cancelClaudeTask.js.map +1 -1
- package/dist/tools/checkDocumentDirty.d.ts +1 -0
- package/dist/tools/clipboard.d.ts +2 -0
- package/dist/tools/closeTabs.d.ts +2 -0
- package/dist/tools/codeLens.d.ts +1 -0
- package/dist/tools/contextBundle.d.ts +1 -0
- package/dist/tools/createIssueFromAIComment.d.ts +1 -0
- package/dist/tools/createLinearIssue.d.ts +1 -0
- package/dist/tools/ctxGetTaskContext.d.ts +1 -0
- package/dist/tools/ctxQueryTraces.d.ts +1 -0
- package/dist/tools/ctxSaveTrace.d.ts +1 -0
- package/dist/tools/debug.d.ts +4 -0
- package/dist/tools/decorations.d.ts +2 -0
- package/dist/tools/documentLinks.d.ts +1 -0
- package/dist/tools/editText.d.ts +1 -0
- package/dist/tools/enrichCommit.d.ts +1 -0
- package/dist/tools/enrichStackTrace.d.ts +1 -0
- package/dist/tools/explainDiagnostic.d.ts +1 -0
- package/dist/tools/explainSymbol.d.ts +1 -0
- package/dist/tools/fetchCalendarEvents.d.ts +1 -0
- package/dist/tools/fetchGithubIssue.d.ts +1 -0
- package/dist/tools/fetchGithubPR.d.ts +1 -0
- package/dist/tools/fetchLinearIssue.d.ts +1 -0
- package/dist/tools/fetchSentryIssue.d.ts +1 -0
- package/dist/tools/fetchSlackProfile.d.ts +1 -0
- package/dist/tools/fetchSlackProfile.js +4 -1
- package/dist/tools/fetchSlackProfile.js.map +1 -1
- package/dist/tools/fileOperations.d.ts +3 -0
- package/dist/tools/fileWatcher.d.ts +2 -0
- package/dist/tools/findFiles.d.ts +1 -0
- package/dist/tools/findRelatedTests.d.ts +1 -0
- package/dist/tools/fixAllLintErrors.d.ts +1 -0
- package/dist/tools/foldingRanges.d.ts +1 -0
- package/dist/tools/formatDocument.d.ts +1 -0
- package/dist/tools/generateTests.d.ts +1 -0
- package/dist/tools/getAIComments.d.ts +1 -0
- package/dist/tools/getAnalyticsReport.d.ts +1 -0
- package/dist/tools/getArchitectureContext.d.ts +1 -0
- package/dist/tools/getBufferContent.d.ts +1 -0
- package/dist/tools/getChangeImpact.d.ts +1 -0
- package/dist/tools/getClaudeTaskStatus.d.ts +2 -0
- package/dist/tools/getClaudeTaskStatus.js +1 -0
- package/dist/tools/getClaudeTaskStatus.js.map +1 -1
- package/dist/tools/getCodeCoverage.d.ts +1 -0
- package/dist/tools/getCommitsForIssue.d.ts +1 -0
- package/dist/tools/getConnectorStatus.d.ts +1 -0
- package/dist/tools/getCurrentSelection.d.ts +2 -0
- package/dist/tools/getDebugState.d.ts +1 -0
- package/dist/tools/getDependencyTree.d.ts +1 -0
- package/dist/tools/getDiagnostics.d.ts +1 -0
- package/dist/tools/getDiffFromHandoff.d.ts +1 -0
- package/dist/tools/getDocumentSymbols.d.ts +25 -0
- package/dist/tools/getDocumentSymbols.js +74 -8
- package/dist/tools/getDocumentSymbols.js.map +1 -1
- package/dist/tools/getFileTree.d.ts +1 -0
- package/dist/tools/getGitDiff.d.ts +1 -0
- package/dist/tools/getGitHotspots.d.ts +1 -0
- package/dist/tools/getGitLog.d.ts +1 -0
- package/dist/tools/getGitStatus.d.ts +1 -0
- package/dist/tools/getImportTree.d.ts +1 -0
- package/dist/tools/getImportedSignatures.d.ts +1 -0
- package/dist/tools/getOpenEditors.d.ts +1 -0
- package/dist/tools/getPRTemplate.d.ts +1 -0
- package/dist/tools/getProjectContext.d.ts +1 -0
- package/dist/tools/getProjectInfo.d.ts +1 -0
- package/dist/tools/getSecurityAdvisories.d.ts +1 -0
- package/dist/tools/getSecurityAdvisories.js +10 -1
- package/dist/tools/getSecurityAdvisories.js.map +1 -1
- package/dist/tools/getSessionUsage.d.ts +4 -0
- package/dist/tools/getSessionUsage.js +3 -0
- package/dist/tools/getSessionUsage.js.map +1 -1
- package/dist/tools/getSymbolHistory.d.ts +1 -0
- package/dist/tools/getToolCapabilities.d.ts +1 -0
- package/dist/tools/getTypeSignature.d.ts +1 -0
- package/dist/tools/getWorkspaceFolders.d.ts +1 -0
- package/dist/tools/getWorkspaceSettings.d.ts +1 -0
- package/dist/tools/gitHistory.d.ts +2 -0
- package/dist/tools/gitWrite.d.ts +11 -0
- package/dist/tools/github/actions.d.ts +2 -0
- package/dist/tools/github/actions.js +4 -2
- package/dist/tools/github/actions.js.map +1 -1
- package/dist/tools/github/composite.d.ts +342 -0
- package/dist/tools/github/composite.js +343 -0
- package/dist/tools/github/composite.js.map +1 -0
- package/dist/tools/github/index.d.ts +1 -0
- package/dist/tools/github/index.js +1 -0
- package/dist/tools/github/index.js.map +1 -1
- package/dist/tools/github/issues.d.ts +4 -0
- package/dist/tools/github/issues.js +8 -4
- package/dist/tools/github/issues.js.map +1 -1
- package/dist/tools/github/pr.d.ts +7 -0
- package/dist/tools/github/pr.js +50 -12
- package/dist/tools/github/pr.js.map +1 -1
- package/dist/tools/handoffNote.d.ts +4 -0
- package/dist/tools/handoffNote.js +2 -0
- package/dist/tools/handoffNote.js.map +1 -1
- package/dist/tools/hoverAtCursor.d.ts +1 -0
- package/dist/tools/httpClient.d.ts +2 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.js +47 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inlayHints.d.ts +1 -0
- package/dist/tools/launchQuickTask.d.ts +2 -0
- package/dist/tools/launchQuickTask.js +1 -0
- package/dist/tools/launchQuickTask.js.map +1 -1
- package/dist/tools/listClaudeTasks.d.ts +2 -0
- package/dist/tools/listClaudeTasks.js +1 -0
- package/dist/tools/listClaudeTasks.js.map +1 -1
- package/dist/tools/listTerminals.d.ts +1 -0
- package/dist/tools/lsp.d.ts +14 -0
- package/dist/tools/navigateToSymbolByName.d.ts +1 -0
- package/dist/tools/openDiff.d.ts +1 -0
- package/dist/tools/openFile.d.ts +1 -0
- package/dist/tools/openInBrowser.d.ts +1 -0
- package/dist/tools/organizeImports.d.ts +1 -0
- package/dist/tools/performanceReport.d.ts +1 -0
- package/dist/tools/planPersistence.d.ts +5 -0
- package/dist/tools/previewEdit.d.ts +1 -0
- package/dist/tools/refactorAnalyze.d.ts +1 -0
- package/dist/tools/refactorPreview.d.ts +2 -0
- package/dist/tools/refactorPreview.js +1 -0
- package/dist/tools/refactorPreview.js.map +1 -1
- package/dist/tools/replaceBlock.d.ts +1 -0
- package/dist/tools/resumeClaudeTask.d.ts +2 -0
- package/dist/tools/resumeClaudeTask.js +1 -0
- package/dist/tools/resumeClaudeTask.js.map +1 -1
- package/dist/tools/runClaudeTask.d.ts +2 -0
- package/dist/tools/runClaudeTask.js +1 -0
- package/dist/tools/runClaudeTask.js.map +1 -1
- package/dist/tools/runCommand.d.ts +1 -0
- package/dist/tools/runCommand.js +5 -0
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/runTests.d.ts +1 -0
- package/dist/tools/saveDocument.d.ts +1 -0
- package/dist/tools/screenshotAndAnnotate.d.ts +1 -0
- package/dist/tools/searchAndReplace.d.ts +1 -0
- package/dist/tools/searchTools.d.ts +1 -0
- package/dist/tools/searchTools.js +1 -1
- package/dist/tools/searchTools.js.map +1 -1
- package/dist/tools/searchWorkspace.d.ts +1 -0
- package/dist/tools/selectionRanges.d.ts +1 -0
- package/dist/tools/semanticTokens.d.ts +1 -0
- package/dist/tools/setActiveWorkspaceFolder.d.ts +1 -0
- package/dist/tools/signatureHelp.d.ts +1 -0
- package/dist/tools/slackListChannels.d.ts +1 -0
- package/dist/tools/slackListChannels.js.map +1 -1
- package/dist/tools/slackPostMessage.d.ts +1 -0
- package/dist/tools/slackPostMessage.js +11 -6
- package/dist/tools/slackPostMessage.js.map +1 -1
- package/dist/tools/terminal.d.ts +6 -0
- package/dist/tools/terminal.js +4 -0
- package/dist/tools/terminal.js.map +1 -1
- package/dist/tools/testTraceToSource.d.ts +1 -0
- package/dist/tools/testTraceToSource.js +2 -2
- package/dist/tools/testTraceToSource.js.map +1 -1
- package/dist/tools/transaction.d.ts +23 -0
- package/dist/tools/transaction.js +29 -0
- package/dist/tools/transaction.js.map +1 -1
- package/dist/tools/typeHierarchy.d.ts +1 -0
- package/dist/tools/updateLinearIssue.d.ts +1 -0
- package/dist/tools/updateLinearIssue.js +20 -6
- package/dist/tools/updateLinearIssue.js.map +1 -1
- package/dist/tools/utils.d.ts +6 -0
- package/dist/tools/utils.js +59 -0
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/vscodeCommands.d.ts +2 -0
- package/dist/tools/vscodeTasks.d.ts +2 -0
- package/dist/tools/workspaceSettings.d.ts +1 -0
- package/dist/traceEncryption.d.ts +46 -0
- package/dist/traceEncryption.js +124 -0
- package/dist/traceEncryption.js.map +1 -0
- package/dist/transport.d.ts +46 -1
- package/dist/transport.js +173 -19
- package/dist/transport.js.map +1 -1
- package/package.json +30 -8
- package/scripts/mcp-stdio-shim.cjs +19 -3
- package/scripts/start-all.sh +34 -3
- package/templates/automation-policies/recipe-authoring.json +25 -0
- package/templates/automation-policy.example.json +6 -0
- package/templates/co.patchwork-os.bridge.plist +34 -0
- package/templates/policies/README.md +72 -0
- package/templates/policies/conservative.json +14 -0
- package/templates/policies/developer.json +14 -0
- package/templates/policies/headless-ci.json +24 -0
- package/templates/policies/personal-assistant.json +15 -0
- package/templates/policies/regulated-industry.json +18 -0
- package/templates/recipes/approval-queue-ui-test.yaml +205 -0
- package/templates/recipes/lint-on-save.yaml +1 -2
- package/templates/recipes/morning-brief-slack.yaml +57 -0
- package/templates/recipes/morning-brief.yaml +2 -2
- package/templates/recipes/project-health-check.yaml +50 -0
- package/templates/recipes/webhook/README.md +70 -0
- package/templates/recipes/webhook/capture-thought.yaml +26 -0
- package/templates/recipes/webhook/customer-escalation.yaml +49 -0
- package/templates/recipes/webhook/incident-intake.yaml +46 -0
- package/templates/recipes/webhook/meeting-prep.yaml +48 -0
- package/templates/recipes/webhook/morning-brief.yaml +57 -0
package/scripts/start-all.sh
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
65
|
-
|
|
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]
|