patchwork-os 0.2.0-alpha.21 → 0.2.0-alpha.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -12
- package/deploy/bootstrap-vps.sh +184 -0
- package/dist/approvalHttp.js +6 -1
- package/dist/approvalHttp.js.map +1 -1
- package/dist/automation.d.ts +20 -0
- package/dist/automation.js +35 -0
- package/dist/automation.js.map +1 -1
- package/dist/bridge.js +22 -4
- package/dist/bridge.js.map +1 -1
- package/dist/bridgeToken.js +57 -19
- package/dist/bridgeToken.js.map +1 -1
- package/dist/commands/recipe.d.ts +256 -0
- package/dist/commands/recipe.js +1313 -0
- package/dist/commands/recipe.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/connectors/baseConnector.d.ts +117 -0
- package/dist/connectors/baseConnector.js +213 -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/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 +2 -11
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gmail.js +23 -7
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.js +23 -7
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/jira.d.ts +98 -0
- package/dist/connectors/jira.js +379 -0
- package/dist/connectors/jira.js.map +1 -0
- package/dist/connectors/linear.js +2 -11
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpOAuth.d.ts +1 -0
- package/dist/connectors/mcpOAuth.js +30 -4
- 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/sentry.js +2 -11
- package/dist/connectors/sentry.js.map +1 -1
- package/dist/connectors/slack.js +50 -15
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/tokenStorage.d.ts +35 -0
- package/dist/connectors/tokenStorage.js +394 -0
- package/dist/connectors/tokenStorage.js.map +1 -0
- package/dist/connectors/zendesk.d.ts +104 -0
- package/dist/connectors/zendesk.js +424 -0
- package/dist/connectors/zendesk.js.map +1 -0
- package/dist/featureFlags.d.ts +73 -0
- package/dist/featureFlags.js +203 -0
- package/dist/featureFlags.js.map +1 -0
- package/dist/fp/automationInterpreter.js +1 -0
- 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/policyParser.js +17 -0
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/index.js +508 -36
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +4 -1
- package/dist/oauth.js +50 -14
- package/dist/oauth.js.map +1 -1
- package/dist/recipes/chainedRunner.d.ts +104 -0
- package/dist/recipes/chainedRunner.js +359 -0
- package/dist/recipes/chainedRunner.js.map +1 -0
- 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/legacyRecipeCompat.d.ts +1 -0
- package/dist/recipes/legacyRecipeCompat.js +97 -0
- package/dist/recipes/legacyRecipeCompat.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/schemaGenerator.d.ts +28 -0
- package/dist/recipes/schemaGenerator.js +484 -0
- package/dist/recipes/schemaGenerator.js.map +1 -0
- package/dist/recipes/templateEngine.d.ts +62 -0
- package/dist/recipes/templateEngine.js +182 -0
- package/dist/recipes/templateEngine.js.map +1 -0
- package/dist/recipes/toolRegistry.d.ts +181 -0
- package/dist/recipes/toolRegistry.js +300 -0
- package/dist/recipes/toolRegistry.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/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/file.d.ts +6 -0
- package/dist/recipes/tools/file.js +170 -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 +91 -0
- package/dist/recipes/tools/github.js.map +1 -0
- package/dist/recipes/tools/gmail.d.ts +6 -0
- package/dist/recipes/tools/gmail.js +210 -0
- package/dist/recipes/tools/gmail.js.map +1 -0
- package/dist/recipes/tools/index.d.ts +18 -0
- package/dist/recipes/tools/index.js +21 -0
- package/dist/recipes/tools/index.js.map +1 -0
- package/dist/recipes/tools/linear.d.ts +6 -0
- package/dist/recipes/tools/linear.js +83 -0
- package/dist/recipes/tools/linear.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/slack.d.ts +6 -0
- package/dist/recipes/tools/slack.js +72 -0
- package/dist/recipes/tools/slack.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/yamlRunner.d.ts +71 -7
- package/dist/recipes/yamlRunner.js +406 -439
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/riskTier.js +1 -0
- package/dist/riskTier.js.map +1 -1
- package/dist/runLog.d.ts +18 -0
- package/dist/runLog.js +5 -0
- package/dist/runLog.js.map +1 -1
- package/dist/server.d.ts +4 -0
- package/dist/server.js +224 -0
- package/dist/server.js.map +1 -1
- package/dist/streamableHttp.js +2 -0
- package/dist/streamableHttp.js.map +1 -1
- package/dist/tools/github/actions.js +4 -2
- package/dist/tools/github/actions.js.map +1 -1
- package/dist/tools/github/composite.d.ts +339 -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.js +8 -4
- package/dist/tools/github/issues.js.map +1 -1
- package/dist/tools/github/pr.js +14 -7
- package/dist/tools/github/pr.js.map +1 -1
- package/dist/tools/index.js +10 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/searchTools.js +1 -1
- package/dist/tools/searchTools.js.map +1 -1
- package/dist/transport.d.ts +7 -1
- package/dist/transport.js +85 -11
- package/dist/transport.js.map +1 -1
- package/package.json +1 -1
- package/templates/automation-policies/recipe-authoring.json +25 -0
- package/templates/automation-policy.example.json +6 -0
- package/templates/recipes/lint-on-save.yaml +1 -2
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
* manual, cron — both run immediately via CLI
|
|
21
21
|
* git_hook, on_file_save — also runnable manually; trigger context injected
|
|
22
22
|
*/
|
|
23
|
+
import "./tools/index.js";
|
|
23
24
|
export interface YamlStep {
|
|
24
25
|
tool?: string;
|
|
25
26
|
agent?: {
|
|
@@ -30,6 +31,7 @@ export interface YamlStep {
|
|
|
30
31
|
};
|
|
31
32
|
into?: string;
|
|
32
33
|
optional?: boolean;
|
|
34
|
+
transform?: string;
|
|
33
35
|
[key: string]: unknown;
|
|
34
36
|
}
|
|
35
37
|
export interface YamlTrigger {
|
|
@@ -39,14 +41,30 @@ export interface YamlTrigger {
|
|
|
39
41
|
on?: string;
|
|
40
42
|
filter?: string;
|
|
41
43
|
}
|
|
44
|
+
export interface YamlRecipeExpect {
|
|
45
|
+
stepsRun?: number;
|
|
46
|
+
outputs?: string[];
|
|
47
|
+
errorMessage?: string | null;
|
|
48
|
+
context?: Record<string, string>;
|
|
49
|
+
}
|
|
50
|
+
export interface AssertionFailure {
|
|
51
|
+
assertion: string;
|
|
52
|
+
expected: unknown;
|
|
53
|
+
actual: unknown;
|
|
54
|
+
message: string;
|
|
55
|
+
}
|
|
56
|
+
export declare function evaluateExpect(result: Pick<RunResult, "stepsRun" | "outputs" | "context" | "errorMessage">, expect: YamlRecipeExpect): AssertionFailure[];
|
|
42
57
|
export interface YamlRecipe {
|
|
43
58
|
name: string;
|
|
44
59
|
description?: string;
|
|
45
60
|
trigger: YamlTrigger;
|
|
46
61
|
steps: YamlStep[];
|
|
62
|
+
expect?: YamlRecipeExpect;
|
|
47
63
|
output?: {
|
|
48
64
|
path: string;
|
|
49
65
|
};
|
|
66
|
+
/** Plugin specs (npm package name or local path) to load before running steps. */
|
|
67
|
+
servers?: string[];
|
|
50
68
|
}
|
|
51
69
|
export type RunContext = Record<string, string>;
|
|
52
70
|
export type FetchFn = (url: string, init?: {
|
|
@@ -55,6 +73,9 @@ export type FetchFn = (url: string, init?: {
|
|
|
55
73
|
ok: boolean;
|
|
56
74
|
json(): Promise<unknown>;
|
|
57
75
|
}>;
|
|
76
|
+
export interface MockToolConnector {
|
|
77
|
+
invoke<TOutput = unknown>(operation: string, input?: unknown): Promise<TOutput>;
|
|
78
|
+
}
|
|
58
79
|
export interface RunnerDeps {
|
|
59
80
|
now?: () => Date;
|
|
60
81
|
readFile?: (p: string) => string;
|
|
@@ -71,6 +92,8 @@ export interface RunnerDeps {
|
|
|
71
92
|
fetchFn?: FetchFn;
|
|
72
93
|
/** Optional token resolver for Gmail. Defaults to getValidAccessToken(). */
|
|
73
94
|
getGmailToken?: () => Promise<string>;
|
|
95
|
+
/** Override the ~/.patchwork dir used by RecipeRunLog. Useful for tests. */
|
|
96
|
+
logDir?: string;
|
|
74
97
|
/** Optional Anthropic API caller for agent steps. Defaults to fetch-based impl. */
|
|
75
98
|
claudeFn?: (prompt: string, model: string) => Promise<string>;
|
|
76
99
|
/** Optional Claude Code CLI caller for agent steps with driver: claude-code. */
|
|
@@ -81,13 +104,12 @@ export interface RunnerDeps {
|
|
|
81
104
|
* lazily construct a driver via createDriver() from drivers/index.js.
|
|
82
105
|
*/
|
|
83
106
|
providerDriverFn?: (driverName: "openai" | "grok" | "gemini", prompt: string, model: string | undefined) => Promise<string>;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
durationMs: number;
|
|
107
|
+
/** Mock connector replays used by `patchwork recipe test`. */
|
|
108
|
+
mockConnectors?: Partial<Record<string, MockToolConnector>>;
|
|
109
|
+
/** Directory to store recorded connector fixtures for `patchwork recipe record`. */
|
|
110
|
+
recordFixturesDir?: string;
|
|
111
|
+
/** Suppress run logs / notifications for mocked recipe test execution. */
|
|
112
|
+
testMode?: boolean;
|
|
91
113
|
}
|
|
92
114
|
export interface RunResult {
|
|
93
115
|
recipe: string;
|
|
@@ -96,12 +118,54 @@ export interface RunResult {
|
|
|
96
118
|
context: RunContext;
|
|
97
119
|
stepResults: StepResult[];
|
|
98
120
|
errorMessage?: string;
|
|
121
|
+
assertionFailures?: AssertionFailure[];
|
|
99
122
|
}
|
|
123
|
+
export type StepResult = {
|
|
124
|
+
id: string;
|
|
125
|
+
tool?: string;
|
|
126
|
+
status: "ok" | "skipped" | "error";
|
|
127
|
+
error?: string;
|
|
128
|
+
durationMs: number;
|
|
129
|
+
};
|
|
130
|
+
export type StepDeps = Required<Omit<RunnerDeps, "now" | "logDir" | "recordFixturesDir">> & {
|
|
131
|
+
workdir: string;
|
|
132
|
+
logDir?: string;
|
|
133
|
+
recordFixturesDir?: string;
|
|
134
|
+
testMode: boolean;
|
|
135
|
+
};
|
|
100
136
|
export declare function loadYamlRecipe(filePath: string): YamlRecipe;
|
|
101
137
|
export declare function validateYamlRecipe(raw: unknown): YamlRecipe;
|
|
138
|
+
/**
|
|
139
|
+
* Load plugin specs declared in `recipe.servers` and register their tools into
|
|
140
|
+
* the recipe tool registry. Errors per-spec are logged as warnings — never fatal.
|
|
141
|
+
*/
|
|
142
|
+
export declare function loadRecipeServers(specs: string[]): Promise<void>;
|
|
102
143
|
export declare function runYamlRecipe(recipe: YamlRecipe, deps?: RunnerDeps, seedContext?: RunContext): Promise<RunResult>;
|
|
144
|
+
export declare function executeStep(step: YamlStep, ctx: RunContext, deps: StepDeps): Promise<string | null>;
|
|
103
145
|
/** Minimal `{{ expr }}` renderer — replaces against flat context map. */
|
|
104
146
|
export declare function render(template: string, ctx: RunContext): string;
|
|
147
|
+
/**
|
|
148
|
+
* Build ExecutionDeps for ChainedRecipeRunner backed by the yamlRunner step
|
|
149
|
+
* handlers. This lets chained recipes use the same tool set (file.*, git.*,
|
|
150
|
+
* gmail.*, github.*, linear.*, diagnostics.*) as simple YAML recipes.
|
|
151
|
+
*
|
|
152
|
+
* Pass the result as `chainedDeps` when calling `dispatchRecipe` or
|
|
153
|
+
* `runChainedRecipe` so that `executeTool` is properly wired.
|
|
154
|
+
*/
|
|
155
|
+
export declare function buildChainedDeps(runnerDeps: RunnerDeps, claudeCodeFnOverride?: (prompt: string) => Promise<string>): import("./chainedRunner.js").ExecutionDeps;
|
|
156
|
+
/**
|
|
157
|
+
* Dispatch a loaded recipe to the appropriate runner.
|
|
158
|
+
*
|
|
159
|
+
* Recipes with `trigger.type: "chained"` are routed to the ChainedRecipeRunner
|
|
160
|
+
* (parallel execution, template variables, nested recipes, dry-run).
|
|
161
|
+
* All other recipes use the existing synchronous yamlRunner path.
|
|
162
|
+
*
|
|
163
|
+
* `chainedDeps` is only required when the recipe is chained; omit for simple recipes.
|
|
164
|
+
*/
|
|
165
|
+
export declare function dispatchRecipe(recipe: YamlRecipe, deps: RunnerDeps & {
|
|
166
|
+
chainedDeps?: import("./chainedRunner.js").ExecutionDeps;
|
|
167
|
+
chainedOptions?: Partial<import("./chainedRunner.js").RunOptions>;
|
|
168
|
+
}, seedContext?: RunContext): Promise<RunResult | import("./chainedRunner.js").ChainedRunResult>;
|
|
105
169
|
/** List all YAML recipes in a directory. Returns names. */
|
|
106
170
|
export declare function listYamlRecipes(recipesDir: string): Array<{
|
|
107
171
|
name: string;
|