@crewx/workflow 0.3.22-rc.5 → 0.3.22-rc.7

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.
@@ -2,6 +2,7 @@ export interface WorkflowMeta {
2
2
  name: string;
3
3
  description?: string;
4
4
  version?: string;
5
+ shell_task_allowed?: boolean;
5
6
  }
6
7
  export interface RetryConfig {
7
8
  max: number;
@@ -13,13 +14,18 @@ export interface OnError {
13
14
  handler?: string;
14
15
  fallback_node?: string;
15
16
  }
16
- export type NodeType = 'agent_task' | 'parallel' | 'join' | 'branch' | 'approval' | 'expression' | 'end';
17
+ export type NodeType = 'agent_task' | 'skill_task' | 'shell_task' | 'parallel' | 'join' | 'branch' | 'approval' | 'expression' | 'end';
17
18
  export type JsonSchema = Record<string, unknown>;
18
19
  export interface WorkflowNode {
19
20
  type: NodeType;
20
21
  agent?: string;
21
22
  mode?: 'query' | 'execute';
22
23
  input?: string;
24
+ skill?: string;
25
+ args?: string[];
26
+ command?: string[];
27
+ cwd?: string;
28
+ env?: Record<string, string>;
23
29
  output?: string;
24
30
  output_format?: 'json';
25
31
  output_schema?: JsonSchema;
@@ -68,6 +74,18 @@ export interface ValidationResult {
68
74
  valid: boolean;
69
75
  errors: ValidationError[];
70
76
  }
77
+ export interface AuditEntry {
78
+ exec_id: string;
79
+ node_id: string;
80
+ type: NodeType | string;
81
+ summary: string;
82
+ started_at: string;
83
+ ended_at: string;
84
+ duration_ms: number;
85
+ exit_code: number | null;
86
+ error?: string;
87
+ trigger: 'manual' | 'auto';
88
+ }
71
89
  export interface RunExecution {
72
90
  id: string;
73
91
  workflow_id: string;
@@ -80,5 +98,13 @@ export interface RunExecution {
80
98
  initial_state: Record<string, unknown>;
81
99
  status?: 'running' | 'completed' | 'failed';
82
100
  tasks?: Record<string, string>;
101
+ error?: string;
102
+ audit?: AuditEntry[];
103
+ }
104
+ export interface AutoRunResult {
105
+ run: RunExecution;
106
+ outcome: 'completed' | 'failed' | 'paused';
107
+ reason?: string;
108
+ executed: string[];
83
109
  }
84
110
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,MAAM,GACN,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,KAAK,CAAC;AAGV,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAGD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IAExB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAGD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,YAAY,CAAC;IAElB,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
@@ -0,0 +1,18 @@
1
+ export declare const SKILL_NAME_RE: RegExp;
2
+ export declare const SHELL_DENYLIST: Set<string>;
3
+ export declare const INLINE_CODE_INTERPRETERS: Set<string>;
4
+ export declare const DANGEROUS_ENV_KEYS: Set<string>;
5
+ export interface CommandCheck {
6
+ ok: boolean;
7
+ error?: string;
8
+ }
9
+ export declare function validateShellCommand(command: unknown): CommandCheck;
10
+ export declare function validateEnvKeys(env: Record<string, string> | undefined): CommandCheck;
11
+ export interface CwdCheck {
12
+ ok: boolean;
13
+ resolved?: string;
14
+ error?: string;
15
+ }
16
+ export declare function normalizeCwd(cwd: string | undefined, projectRoot: string): CwdCheck;
17
+ export declare function buildShellEnv(nodeEnv: Record<string, string> | undefined, parentEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
18
+ //# sourceMappingURL=shell-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-security.d.ts","sourceRoot":"","sources":["../../../src/utils/shell-security.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa,QAAyB,CAAC;AAGpD,eAAO,MAAM,cAAc,aAGzB,CAAC;AAGH,eAAO,MAAM,wBAAwB,aAEnC,CAAC;AAMH,eAAO,MAAM,kBAAkB,aAI7B,CAAC;AAOH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CA+BnE;AAGD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,YAAY,CAQrF;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,CAUnF;AAOD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,SAAS,GAAE,MAAM,CAAC,UAAwB,GACzC,MAAM,CAAC,UAAU,CAenB"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DANGEROUS_ENV_KEYS = exports.INLINE_CODE_INTERPRETERS = exports.SHELL_DENYLIST = exports.SKILL_NAME_RE = void 0;
37
+ exports.validateShellCommand = validateShellCommand;
38
+ exports.validateEnvKeys = validateEnvKeys;
39
+ exports.normalizeCwd = normalizeCwd;
40
+ exports.buildShellEnv = buildShellEnv;
41
+ const path = __importStar(require("path"));
42
+ exports.SKILL_NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
43
+ exports.SHELL_DENYLIST = new Set([
44
+ 'bash', 'sh', 'zsh', 'dash', 'fish',
45
+ 'cmd', 'cmd.exe', 'powershell', 'powershell.exe', 'pwsh', 'pwsh.exe',
46
+ ]);
47
+ exports.INLINE_CODE_INTERPRETERS = new Set([
48
+ 'python', 'python3', 'node', 'nodejs', 'deno', 'perl', 'ruby', 'php',
49
+ ]);
50
+ const INLINE_CODE_FLAGS = new Set(['-c', '-e', '--eval', '--exec']);
51
+ exports.DANGEROUS_ENV_KEYS = new Set([
52
+ 'LD_PRELOAD', 'LD_LIBRARY_PATH', 'LD_AUDIT',
53
+ 'DYLD_INSERT_LIBRARIES', 'DYLD_LIBRARY_PATH', 'DYLD_FRAMEWORK_PATH',
54
+ 'NODE_OPTIONS',
55
+ ]);
56
+ function baseName(cmd) {
57
+ return path.basename(cmd).toLowerCase();
58
+ }
59
+ function validateShellCommand(command) {
60
+ if (!Array.isArray(command)) {
61
+ return { ok: false, error: 'shell_task.command must be an array of strings (argv), not a string' };
62
+ }
63
+ if (command.length === 0) {
64
+ return { ok: false, error: 'shell_task.command must not be empty' };
65
+ }
66
+ if (!command.every((c) => typeof c === 'string')) {
67
+ return { ok: false, error: 'shell_task.command must contain only strings' };
68
+ }
69
+ const bin = baseName(command[0]);
70
+ const binNoExt = bin.replace(/\.exe$/, '');
71
+ if (exports.SHELL_DENYLIST.has(bin) || exports.SHELL_DENYLIST.has(binNoExt)) {
72
+ return { ok: false, error: `shell_task.command[0] "${command[0]}" is a blocked shell interpreter` };
73
+ }
74
+ if (exports.INLINE_CODE_INTERPRETERS.has(binNoExt)) {
75
+ const hasInlineFlag = command
76
+ .slice(1)
77
+ .some((arg) => INLINE_CODE_FLAGS.has(String(arg)));
78
+ if (hasInlineFlag) {
79
+ return {
80
+ ok: false,
81
+ error: `shell_task.command "${binNoExt} ${command[1]}" uses an inline-code flag (escape vector blocked)`,
82
+ };
83
+ }
84
+ }
85
+ return { ok: true };
86
+ }
87
+ function validateEnvKeys(env) {
88
+ if (!env)
89
+ return { ok: true };
90
+ for (const key of Object.keys(env)) {
91
+ if (exports.DANGEROUS_ENV_KEYS.has(key)) {
92
+ return { ok: false, error: `shell_task.env key "${key}" is not allowed` };
93
+ }
94
+ }
95
+ return { ok: true };
96
+ }
97
+ function normalizeCwd(cwd, projectRoot) {
98
+ const root = path.resolve(projectRoot);
99
+ if (cwd === undefined || cwd === '') {
100
+ return { ok: true, resolved: root };
101
+ }
102
+ const resolved = path.resolve(root, cwd);
103
+ if (resolved !== root && !resolved.startsWith(root + path.sep)) {
104
+ return { ok: false, error: `cwd "${cwd}" resolves outside the project root` };
105
+ }
106
+ return { ok: true, resolved };
107
+ }
108
+ function buildShellEnv(nodeEnv, parentEnv = process.env) {
109
+ const allowlist = process.platform === 'win32'
110
+ ? ['PATH', 'Path', 'SystemRoot', 'COMSPEC', 'TEMP', 'TMP']
111
+ : ['PATH', 'HOME', 'LANG', 'TMPDIR'];
112
+ const env = {};
113
+ for (const key of allowlist) {
114
+ if (parentEnv[key] !== undefined)
115
+ env[key] = parentEnv[key];
116
+ }
117
+ if (nodeEnv) {
118
+ for (const [key, value] of Object.entries(nodeEnv)) {
119
+ env[key] = value;
120
+ }
121
+ }
122
+ return env;
123
+ }
124
+ //# sourceMappingURL=shell-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-security.js","sourceRoot":"","sources":["../../../src/utils/shell-security.ts"],"names":[],"mappings":"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"}
@@ -43,6 +43,10 @@
43
43
  },
44
44
  "version": {
45
45
  "type": "string"
46
+ },
47
+ "shell_task_allowed": {
48
+ "type": "boolean",
49
+ "description": "Opt-in gate (2nd factor) required to execute shell_task nodes. Combined with env CREWX_WORKFLOW_SHELL=1."
46
50
  }
47
51
  }
48
52
  },
@@ -52,11 +56,40 @@
52
56
  "properties": {
53
57
  "type": {
54
58
  "type": "string",
55
- "enum": ["agent_task", "parallel", "join", "branch", "approval", "expression", "end"]
59
+ "enum": ["agent_task", "skill_task", "shell_task", "parallel", "join", "branch", "approval", "expression", "end"]
56
60
  },
57
61
  "agent": {
58
62
  "type": "string"
59
63
  },
64
+ "skill": {
65
+ "type": "string",
66
+ "description": "skill_task: built-in/registered skill name. Must match ^[a-z0-9][a-z0-9-]*$ (no path traversal)."
67
+ },
68
+ "args": {
69
+ "type": "array",
70
+ "items": {
71
+ "type": "string"
72
+ },
73
+ "description": "skill_task: extra CLI args appended after the skill name. Supports {{template}} interpolation."
74
+ },
75
+ "command": {
76
+ "type": "array",
77
+ "items": {
78
+ "type": "string"
79
+ },
80
+ "description": "shell_task: argv array (never a plain string). command[0] is the program. Interpolated."
81
+ },
82
+ "cwd": {
83
+ "type": "string",
84
+ "description": "skill_task/shell_task: working directory, normalized and constrained under the project root."
85
+ },
86
+ "env": {
87
+ "type": "object",
88
+ "additionalProperties": {
89
+ "type": "string"
90
+ },
91
+ "description": "shell_task: explicit env pass-through. Dangerous keys (LD_PRELOAD, etc.) are rejected."
92
+ },
60
93
  "mode": {
61
94
  "type": "string",
62
95
  "enum": ["query", "execute"]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/workflow",
3
- "version": "0.3.22-rc.5",
3
+ "version": "0.3.22-rc.7",
4
4
  "description": "Workflow engine for CrewX - list, show, validate workflows with Mermaid visualization",
5
5
  "type": "commonjs",
6
6
  "main": "dist/src/engine.js",
@@ -12,6 +12,18 @@
12
12
  "require": "./dist/src/engine.js",
13
13
  "default": "./dist/src/engine.js"
14
14
  },
15
+ "./run-manager": {
16
+ "types": "./dist/src/run-manager.d.ts",
17
+ "import": "./dist/src/run-manager.js",
18
+ "require": "./dist/src/run-manager.js",
19
+ "default": "./dist/src/run-manager.js"
20
+ },
21
+ "./types": {
22
+ "types": "./dist/src/types.d.ts",
23
+ "import": "./dist/src/types.js",
24
+ "require": "./dist/src/types.js",
25
+ "default": "./dist/src/types.js"
26
+ },
15
27
  "./cli": {
16
28
  "import": "./dist/cli.js",
17
29
  "require": "./dist/cli.js",
@@ -37,8 +49,8 @@
37
49
  "@hyperjump/json-schema": "^1.9.4",
38
50
  "js-yaml": "^4.1.0",
39
51
  "@crewx/knowledge-core": "0.1.17",
40
- "@crewx/sdk": "0.8.8-rc.25",
41
- "@crewx/shared": "0.0.5"
52
+ "@crewx/shared": "0.0.5",
53
+ "@crewx/sdk": "0.8.8-rc.27"
42
54
  },
43
55
  "devDependencies": {
44
56
  "@types/js-yaml": "^4.0.9",
@@ -43,6 +43,10 @@
43
43
  },
44
44
  "version": {
45
45
  "type": "string"
46
+ },
47
+ "shell_task_allowed": {
48
+ "type": "boolean",
49
+ "description": "Opt-in gate (2nd factor) required to execute shell_task nodes. Combined with env CREWX_WORKFLOW_SHELL=1."
46
50
  }
47
51
  }
48
52
  },
@@ -52,11 +56,40 @@
52
56
  "properties": {
53
57
  "type": {
54
58
  "type": "string",
55
- "enum": ["agent_task", "parallel", "join", "branch", "approval", "expression", "end"]
59
+ "enum": ["agent_task", "skill_task", "shell_task", "parallel", "join", "branch", "approval", "expression", "end"]
56
60
  },
57
61
  "agent": {
58
62
  "type": "string"
59
63
  },
64
+ "skill": {
65
+ "type": "string",
66
+ "description": "skill_task: built-in/registered skill name. Must match ^[a-z0-9][a-z0-9-]*$ (no path traversal)."
67
+ },
68
+ "args": {
69
+ "type": "array",
70
+ "items": {
71
+ "type": "string"
72
+ },
73
+ "description": "skill_task: extra CLI args appended after the skill name. Supports {{template}} interpolation."
74
+ },
75
+ "command": {
76
+ "type": "array",
77
+ "items": {
78
+ "type": "string"
79
+ },
80
+ "description": "shell_task: argv array (never a plain string). command[0] is the program. Interpolated."
81
+ },
82
+ "cwd": {
83
+ "type": "string",
84
+ "description": "skill_task/shell_task: working directory, normalized and constrained under the project root."
85
+ },
86
+ "env": {
87
+ "type": "object",
88
+ "additionalProperties": {
89
+ "type": "string"
90
+ },
91
+ "description": "shell_task: explicit env pass-through. Dangerous keys (LD_PRELOAD, etc.) are rejected."
92
+ },
60
93
  "mode": {
61
94
  "type": "string",
62
95
  "enum": ["query", "execute"]