@curdx/flow 2.1.0 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.claude-plugin/marketplace.json +25 -2
  2. package/.claude-plugin/plugin.json +27 -1
  3. package/CHANGELOG.md +32 -0
  4. package/README.md +18 -8
  5. package/README.zh.md +8 -3
  6. package/agent-preamble/preamble.md +35 -2
  7. package/agents/flow-adversary.md +1 -1
  8. package/agents/flow-architect.md +2 -1
  9. package/agents/flow-brownfield-analyst.md +153 -0
  10. package/agents/flow-debugger.md +6 -11
  11. package/agents/flow-edge-hunter.md +1 -1
  12. package/agents/flow-executor.md +30 -8
  13. package/agents/flow-planner.md +38 -5
  14. package/agents/flow-product-designer.md +2 -1
  15. package/agents/flow-qa-engineer.md +25 -20
  16. package/agents/flow-researcher.md +2 -1
  17. package/agents/flow-reviewer.md +23 -5
  18. package/agents/flow-security-auditor.md +5 -3
  19. package/agents/flow-triage-analyst.md +5 -24
  20. package/agents/flow-ui-researcher.md +6 -5
  21. package/agents/flow-ux-designer.md +12 -39
  22. package/agents/flow-verifier.md +38 -6
  23. package/bin/curdx-flow +5 -0
  24. package/cli/README.md +13 -10
  25. package/cli/doctor-workflow.js +1074 -2
  26. package/cli/doctor.js +8 -0
  27. package/cli/help.js +2 -0
  28. package/cli/install-companions.js +4 -1
  29. package/cli/install-required-plugins.js +18 -5
  30. package/cli/install-self-update.js +2 -91
  31. package/cli/install.js +12 -1
  32. package/cli/lib/claude.js +42 -11
  33. package/cli/lib/doctor-report.js +303 -9
  34. package/cli/lib/frontmatter.js +44 -0
  35. package/cli/lib/json-schema.js +57 -0
  36. package/cli/lib/runtime.js +20 -2
  37. package/cli/lib/semver.js +95 -0
  38. package/cli/utils.js +7 -1
  39. package/gates/adversarial-review-gate.md +1 -1
  40. package/gates/security-gate.md +2 -2
  41. package/gates/test-quality-gate.md +59 -0
  42. package/hooks/hooks.json +16 -2
  43. package/hooks/scripts/common.sh +4 -0
  44. package/hooks/scripts/quick-mode-guard.sh +6 -7
  45. package/hooks/scripts/session-start.sh +17 -2
  46. package/hooks/scripts/stop-watcher.sh +69 -18
  47. package/hooks/scripts/subagent-artifact-guard.sh +159 -0
  48. package/hooks/scripts/subagent-statusline.sh +105 -0
  49. package/knowledge/atomic-commits.md +1 -1
  50. package/knowledge/claude-code-runtime-contracts.md +203 -0
  51. package/knowledge/epic-decomposition.md +1 -1
  52. package/knowledge/execution-strategies.md +28 -6
  53. package/knowledge/planning-reviews.md +4 -4
  54. package/knowledge/poc-first-workflow.md +8 -8
  55. package/knowledge/review-feedback-intake.md +57 -0
  56. package/knowledge/two-stage-review.md +19 -6
  57. package/knowledge/wave-execution.md +33 -18
  58. package/output-styles/curdx-evidence-first.md +34 -0
  59. package/package.json +9 -2
  60. package/schemas/agent-frontmatter.schema.json +59 -0
  61. package/schemas/config.schema.json +37 -3
  62. package/schemas/gate-frontmatter.schema.json +30 -0
  63. package/schemas/hooks.schema.json +115 -0
  64. package/schemas/output-style-frontmatter.schema.json +22 -0
  65. package/schemas/plugin-manifest.schema.json +436 -0
  66. package/schemas/plugin-settings.schema.json +29 -0
  67. package/schemas/skill-frontmatter.schema.json +177 -0
  68. package/schemas/spec-state.schema.json +35 -5
  69. package/settings.json +6 -0
  70. package/skills/brownfield-index/SKILL.md +33 -36
  71. package/skills/browser-qa/SKILL.md +16 -7
  72. package/skills/cancel/SKILL.md +82 -0
  73. package/skills/debug/SKILL.md +7 -2
  74. package/skills/epic/SKILL.md +7 -4
  75. package/skills/fast/SKILL.md +3 -1
  76. package/skills/help/SKILL.md +18 -7
  77. package/skills/implement/SKILL.md +44 -12
  78. package/skills/implement/references/wave-execution.md +9 -9
  79. package/skills/init/SKILL.md +3 -1
  80. package/skills/review/SKILL.md +6 -2
  81. package/skills/security-audit/SKILL.md +19 -4
  82. package/skills/spec/SKILL.md +6 -4
  83. package/skills/start/SKILL.md +20 -19
  84. package/skills/status/SKILL.md +85 -0
  85. package/skills/ui-sketch/SKILL.md +13 -4
  86. package/skills/verify/SKILL.md +15 -2
  87. package/templates/CONTEXT.md.tmpl +1 -1
  88. package/templates/PROJECT.md.tmpl +1 -1
  89. package/templates/config.json.tmpl +9 -6
  90. package/templates/progress.md.tmpl +21 -2
  91. package/templates/tasks.md.tmpl +26 -3
@@ -0,0 +1,436 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://curdx-flow.dev/schemas/plugin-manifest.schema.json",
4
+ "title": "CurdX-Flow Claude Code Plugin Manifest",
5
+ "description": "Project-local schema for .claude-plugin/plugin.json.",
6
+ "type": "object",
7
+ "required": ["name"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "name": {
11
+ "type": "string",
12
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
13
+ },
14
+ "version": {
15
+ "type": "string",
16
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$"
17
+ },
18
+ "description": { "type": "string" },
19
+ "author": { "$ref": "#/definitions/authorMetadata" },
20
+ "homepage": { "type": "string", "minLength": 1 },
21
+ "repository": { "type": "string", "minLength": 1 },
22
+ "license": { "type": "string", "minLength": 1 },
23
+ "keywords": {
24
+ "type": "array",
25
+ "items": { "type": "string", "minLength": 1 }
26
+ },
27
+ "skills": {
28
+ "oneOf": [
29
+ { "$ref": "#/definitions/pluginRelativePath" },
30
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } }
31
+ ]
32
+ },
33
+ "commands": {
34
+ "oneOf": [
35
+ { "$ref": "#/definitions/pluginRelativePath" },
36
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } }
37
+ ]
38
+ },
39
+ "agents": {
40
+ "oneOf": [
41
+ { "$ref": "#/definitions/pluginRelativePath" },
42
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } }
43
+ ]
44
+ },
45
+ "hooks": {
46
+ "oneOf": [
47
+ { "$ref": "#/definitions/pluginRelativePath" },
48
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } },
49
+ { "$ref": "#/definitions/inlineHooksConfig" }
50
+ ]
51
+ },
52
+ "mcpServers": {
53
+ "oneOf": [
54
+ { "$ref": "#/definitions/pluginRelativePath" },
55
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } },
56
+ { "$ref": "#/definitions/inlineMcpServersConfig" }
57
+ ]
58
+ },
59
+ "outputStyles": {
60
+ "oneOf": [
61
+ { "$ref": "#/definitions/pluginRelativePath" },
62
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } }
63
+ ]
64
+ },
65
+ "themes": {
66
+ "oneOf": [
67
+ { "$ref": "#/definitions/pluginRelativePath" },
68
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } }
69
+ ]
70
+ },
71
+ "lspServers": {
72
+ "oneOf": [
73
+ { "$ref": "#/definitions/pluginRelativePath" },
74
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } },
75
+ { "$ref": "#/definitions/inlineLspServersConfig" }
76
+ ]
77
+ },
78
+ "monitors": {
79
+ "oneOf": [
80
+ { "$ref": "#/definitions/pluginRelativePath" },
81
+ { "type": "array", "items": { "$ref": "#/definitions/monitorEntry" } }
82
+ ]
83
+ },
84
+ "userConfig": {
85
+ "type": "object",
86
+ "propertyNames": { "$ref": "#/definitions/userConfigKey" },
87
+ "additionalProperties": { "$ref": "#/definitions/userConfigOption" }
88
+ },
89
+ "channels": {
90
+ "type": "array",
91
+ "items": { "$ref": "#/definitions/channelEntry" }
92
+ },
93
+ "dependencies": {
94
+ "type": "array",
95
+ "items": {
96
+ "oneOf": [
97
+ { "type": "string" },
98
+ {
99
+ "type": "object",
100
+ "required": ["name"],
101
+ "additionalProperties": false,
102
+ "properties": {
103
+ "name": {
104
+ "type": "string",
105
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
106
+ },
107
+ "version": { "type": "string" },
108
+ "marketplace": {
109
+ "type": "string",
110
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
111
+ }
112
+ }
113
+ }
114
+ ]
115
+ }
116
+ }
117
+ },
118
+ "definitions": {
119
+ "authorMetadata": {
120
+ "type": "object",
121
+ "additionalProperties": false,
122
+ "properties": {
123
+ "name": { "type": "string", "minLength": 1 },
124
+ "email": { "type": "string", "minLength": 1 },
125
+ "url": { "type": "string", "minLength": 1 }
126
+ }
127
+ },
128
+ "inlineHooksConfig": {
129
+ "type": "object",
130
+ "required": ["hooks"],
131
+ "additionalProperties": false,
132
+ "properties": {
133
+ "hooks": {
134
+ "type": "object",
135
+ "propertyNames": {
136
+ "enum": [
137
+ "SessionStart",
138
+ "InstructionsLoaded",
139
+ "UserPromptSubmit",
140
+ "UserPromptExpansion",
141
+ "PreToolUse",
142
+ "PermissionRequest",
143
+ "PostToolUse",
144
+ "PostToolUseFailure",
145
+ "PostToolBatch",
146
+ "PermissionDenied",
147
+ "Notification",
148
+ "SubagentStart",
149
+ "SubagentStop",
150
+ "TaskCreated",
151
+ "TaskCompleted",
152
+ "Stop",
153
+ "StopFailure",
154
+ "TeammateIdle",
155
+ "ConfigChange",
156
+ "CwdChanged",
157
+ "FileChanged",
158
+ "WorktreeCreate",
159
+ "WorktreeRemove",
160
+ "PreCompact",
161
+ "PostCompact",
162
+ "Elicitation",
163
+ "ElicitationResult",
164
+ "SessionEnd"
165
+ ]
166
+ },
167
+ "additionalProperties": {
168
+ "type": "array",
169
+ "items": { "$ref": "#/definitions/hookMatcherGroup" }
170
+ }
171
+ }
172
+ }
173
+ },
174
+ "inlineMcpServersConfig": {
175
+ "type": "object",
176
+ "additionalProperties": { "$ref": "#/definitions/mcpServerEntry" }
177
+ },
178
+ "pluginRelativePath": {
179
+ "type": "string",
180
+ "pattern": "^\\./(?!\\.\\.?(?:/|$))(?!.*(?:^|/)\\.\\.(?:/|$)).+"
181
+ },
182
+ "inlineLspServersConfig": {
183
+ "type": "object",
184
+ "additionalProperties": { "$ref": "#/definitions/lspServerEntry" }
185
+ },
186
+ "hookMatcherGroup": {
187
+ "type": "object",
188
+ "required": ["hooks"],
189
+ "additionalProperties": false,
190
+ "properties": {
191
+ "matcher": { "type": "string" },
192
+ "hooks": {
193
+ "type": "array",
194
+ "items": { "$ref": "#/definitions/hookHandler" }
195
+ }
196
+ }
197
+ },
198
+ "mcpServerEntry": {
199
+ "oneOf": [
200
+ { "$ref": "#/definitions/mcpStdioServerEntry" },
201
+ { "$ref": "#/definitions/mcpHttpServerEntry" },
202
+ { "$ref": "#/definitions/mcpSseServerEntry" }
203
+ ]
204
+ },
205
+ "mcpStdioServerEntry": {
206
+ "type": "object",
207
+ "required": ["command"],
208
+ "additionalProperties": false,
209
+ "properties": {
210
+ "type": {
211
+ "type": "string",
212
+ "enum": ["stdio"]
213
+ },
214
+ "command": { "type": "string", "minLength": 1 },
215
+ "args": {
216
+ "type": "array",
217
+ "items": { "type": "string" }
218
+ },
219
+ "env": {
220
+ "type": "object",
221
+ "additionalProperties": { "type": "string" }
222
+ },
223
+ "cwd": { "type": "string", "minLength": 1 }
224
+ }
225
+ },
226
+ "mcpHttpServerEntry": {
227
+ "type": "object",
228
+ "required": ["type", "url"],
229
+ "additionalProperties": false,
230
+ "properties": {
231
+ "type": { "const": "http" },
232
+ "url": { "type": "string", "minLength": 1 },
233
+ "headers": { "$ref": "#/definitions/mcpHeaders" },
234
+ "oauth": { "$ref": "#/definitions/mcpOauthConfig" },
235
+ "headersHelper": { "type": "string", "minLength": 1 }
236
+ }
237
+ },
238
+ "mcpSseServerEntry": {
239
+ "type": "object",
240
+ "required": ["type", "url"],
241
+ "additionalProperties": false,
242
+ "properties": {
243
+ "type": { "const": "sse" },
244
+ "url": { "type": "string", "minLength": 1 },
245
+ "headers": { "$ref": "#/definitions/mcpHeaders" },
246
+ "oauth": { "$ref": "#/definitions/mcpOauthConfig" },
247
+ "headersHelper": { "type": "string", "minLength": 1 }
248
+ }
249
+ },
250
+ "mcpHeaders": {
251
+ "type": "object",
252
+ "additionalProperties": { "type": "string" }
253
+ },
254
+ "mcpOauthConfig": {
255
+ "type": "object",
256
+ "additionalProperties": false,
257
+ "properties": {
258
+ "authServerMetadataUrl": { "type": "string", "minLength": 1 },
259
+ "scopes": { "type": "string", "minLength": 1 }
260
+ }
261
+ },
262
+ "lspServerEntry": {
263
+ "type": "object",
264
+ "required": ["command", "extensionToLanguage"],
265
+ "additionalProperties": false,
266
+ "properties": {
267
+ "command": { "type": "string", "minLength": 1 },
268
+ "args": {
269
+ "type": "array",
270
+ "items": { "type": "string" }
271
+ },
272
+ "extensionToLanguage": {
273
+ "type": "object",
274
+ "propertyNames": {
275
+ "type": "string",
276
+ "pattern": "^\\."
277
+ },
278
+ "additionalProperties": {
279
+ "type": "string",
280
+ "minLength": 1
281
+ }
282
+ },
283
+ "transport": {
284
+ "type": "string",
285
+ "enum": ["stdio", "socket"]
286
+ },
287
+ "env": { "type": "object" },
288
+ "initializationOptions": { "type": "object" },
289
+ "settings": { "type": "object" },
290
+ "workspaceFolder": { "type": "string", "minLength": 1 },
291
+ "startupTimeout": { "type": "integer", "minimum": 1 },
292
+ "shutdownTimeout": { "type": "integer", "minimum": 1 },
293
+ "restartOnCrash": { "type": "boolean" },
294
+ "maxRestarts": { "type": "integer", "minimum": 0 }
295
+ }
296
+ },
297
+ "hookHandler": {
298
+ "type": "object",
299
+ "required": ["type"],
300
+ "additionalProperties": false,
301
+ "properties": {
302
+ "type": {
303
+ "type": "string",
304
+ "enum": ["command", "http", "mcp_tool", "prompt", "agent"]
305
+ },
306
+ "if": { "type": "string" },
307
+ "timeout": { "type": "integer", "minimum": 1 },
308
+ "statusMessage": { "type": "string" },
309
+ "async": { "type": "boolean" },
310
+ "asyncRewake": { "type": "boolean" },
311
+ "once": { "type": "boolean" },
312
+ "command": { "type": "string" },
313
+ "shell": {
314
+ "type": "string",
315
+ "enum": ["bash", "powershell"]
316
+ },
317
+ "url": { "type": "string" },
318
+ "headers": { "type": "object" },
319
+ "allowedEnvVars": {
320
+ "type": "array",
321
+ "items": { "type": "string" }
322
+ },
323
+ "server": { "type": "string" },
324
+ "tool": { "type": "string" },
325
+ "input": { "type": "object" },
326
+ "prompt": { "type": "string" },
327
+ "model": { "type": "string" }
328
+ },
329
+ "allOf": [
330
+ {
331
+ "if": { "properties": { "type": { "const": "command" } } },
332
+ "then": { "required": ["command"] }
333
+ },
334
+ {
335
+ "if": { "properties": { "type": { "const": "http" } } },
336
+ "then": { "required": ["url"] }
337
+ },
338
+ {
339
+ "if": { "properties": { "type": { "const": "mcp_tool" } } },
340
+ "then": { "required": ["server", "tool"] }
341
+ },
342
+ {
343
+ "if": { "properties": { "type": { "enum": ["prompt", "agent"] } } },
344
+ "then": { "required": ["prompt"] }
345
+ }
346
+ ]
347
+ },
348
+ "monitorEntry": {
349
+ "type": "object",
350
+ "required": ["name", "command", "description"],
351
+ "additionalProperties": false,
352
+ "properties": {
353
+ "name": { "type": "string", "minLength": 1 },
354
+ "command": { "type": "string", "minLength": 1 },
355
+ "description": { "type": "string", "minLength": 1 },
356
+ "when": {
357
+ "type": "string",
358
+ "pattern": "^(always|on-skill-invoke:[A-Za-z0-9][A-Za-z0-9-]{0,63})$"
359
+ }
360
+ }
361
+ },
362
+ "userConfigKey": {
363
+ "type": "string",
364
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
365
+ },
366
+ "userConfigOption": {
367
+ "type": "object",
368
+ "required": ["type", "title", "description"],
369
+ "additionalProperties": false,
370
+ "properties": {
371
+ "type": {
372
+ "type": "string",
373
+ "enum": ["string", "number", "boolean", "directory", "file"]
374
+ },
375
+ "title": { "type": "string", "minLength": 1 },
376
+ "description": { "type": "string", "minLength": 1 },
377
+ "sensitive": { "type": "boolean" },
378
+ "required": { "type": "boolean" },
379
+ "default": {},
380
+ "multiple": { "type": "boolean" },
381
+ "min": { "type": "number" },
382
+ "max": { "type": "number" }
383
+ },
384
+ "allOf": [
385
+ {
386
+ "if": {
387
+ "not": {
388
+ "properties": { "type": { "const": "string" } },
389
+ "required": ["type"]
390
+ }
391
+ },
392
+ "then": {
393
+ "not": { "required": ["multiple"] }
394
+ }
395
+ },
396
+ {
397
+ "if": {
398
+ "not": {
399
+ "properties": { "type": { "const": "number" } },
400
+ "required": ["type"]
401
+ }
402
+ },
403
+ "then": {
404
+ "not": {
405
+ "anyOf": [
406
+ { "required": ["min"] },
407
+ { "required": ["max"] }
408
+ ]
409
+ }
410
+ }
411
+ }
412
+ ]
413
+ },
414
+ "channelEntry": {
415
+ "type": "object",
416
+ "required": ["server"],
417
+ "additionalProperties": false,
418
+ "properties": {
419
+ "name": {
420
+ "type": "string",
421
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
422
+ },
423
+ "server": {
424
+ "type": "string",
425
+ "minLength": 1
426
+ },
427
+ "description": { "type": "string" },
428
+ "userConfig": {
429
+ "type": "object",
430
+ "propertyNames": { "$ref": "#/definitions/userConfigKey" },
431
+ "additionalProperties": { "$ref": "#/definitions/userConfigOption" }
432
+ }
433
+ }
434
+ }
435
+ }
436
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://curdx-flow.dev/schemas/plugin-settings.schema.json",
4
+ "title": "CurdX-Flow Claude Code Plugin Settings",
5
+ "description": "Supported plugin-root settings.json fields. Official plugin settings currently support only agent and subagentStatusLine.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "agent": {
10
+ "type": "string",
11
+ "minLength": 1
12
+ },
13
+ "subagentStatusLine": {
14
+ "type": "object",
15
+ "required": ["type", "command"],
16
+ "additionalProperties": false,
17
+ "properties": {
18
+ "type": {
19
+ "type": "string",
20
+ "const": "command"
21
+ },
22
+ "command": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,177 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://curdx-flow.dev/schemas/skill-frontmatter.schema.json",
4
+ "title": "CurdX-Flow Skill Frontmatter",
5
+ "description": "Supported YAML frontmatter fields for skills/<name>/SKILL.md.",
6
+ "type": "object",
7
+ "required": ["name", "description"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "name": {
11
+ "type": "string",
12
+ "pattern": "^[a-z0-9][a-z0-9-]{0,63}$"
13
+ },
14
+ "description": {
15
+ "type": "string",
16
+ "minLength": 1,
17
+ "description": "Concise trigger summary. Front-load the key use case. Combined description + when_to_use text is truncated at 1536 characters in Claude Code's skill listing."
18
+ },
19
+ "when_to_use": {
20
+ "type": "string",
21
+ "description": "Additional trigger phrases appended to description in the skill listing. Counts toward the same 1536-character listing cap."
22
+ },
23
+ "argument-hint": {
24
+ "type": "string"
25
+ },
26
+ "arguments": {
27
+ "oneOf": [
28
+ { "type": "string" },
29
+ { "type": "array", "items": { "type": "string" } }
30
+ ]
31
+ },
32
+ "disable-model-invocation": {
33
+ "type": "boolean"
34
+ },
35
+ "user-invocable": {
36
+ "type": "boolean",
37
+ "description": "Controls whether the skill appears in the slash menu. Does not block model invocation; use disable-model-invocation for that."
38
+ },
39
+ "allowed-tools": {
40
+ "oneOf": [
41
+ { "type": "string" },
42
+ { "type": "array", "items": { "type": "string" } }
43
+ ]
44
+ },
45
+ "model": {
46
+ "type": "string"
47
+ },
48
+ "effort": {
49
+ "type": "string",
50
+ "enum": ["low", "medium", "high", "xhigh", "max"]
51
+ },
52
+ "context": {
53
+ "type": "string",
54
+ "enum": ["fork"]
55
+ },
56
+ "agent": {
57
+ "type": "string"
58
+ },
59
+ "hooks": {
60
+ "$ref": "#/definitions/skillHooks"
61
+ },
62
+ "paths": {
63
+ "oneOf": [
64
+ { "type": "string" },
65
+ { "type": "array", "items": { "type": "string" } }
66
+ ]
67
+ },
68
+ "shell": {
69
+ "type": "string",
70
+ "enum": ["bash", "powershell"]
71
+ }
72
+ },
73
+ "definitions": {
74
+ "skillHooks": {
75
+ "type": "object",
76
+ "propertyNames": {
77
+ "enum": [
78
+ "SessionStart",
79
+ "InstructionsLoaded",
80
+ "UserPromptSubmit",
81
+ "UserPromptExpansion",
82
+ "PreToolUse",
83
+ "PermissionRequest",
84
+ "PostToolUse",
85
+ "PostToolUseFailure",
86
+ "PostToolBatch",
87
+ "PermissionDenied",
88
+ "Notification",
89
+ "SubagentStart",
90
+ "SubagentStop",
91
+ "TaskCreated",
92
+ "TaskCompleted",
93
+ "Stop",
94
+ "StopFailure",
95
+ "TeammateIdle",
96
+ "ConfigChange",
97
+ "CwdChanged",
98
+ "FileChanged",
99
+ "WorktreeCreate",
100
+ "WorktreeRemove",
101
+ "PreCompact",
102
+ "PostCompact",
103
+ "Elicitation",
104
+ "ElicitationResult",
105
+ "SessionEnd"
106
+ ]
107
+ },
108
+ "additionalProperties": {
109
+ "type": "array",
110
+ "items": { "$ref": "#/definitions/matcherGroup" }
111
+ }
112
+ },
113
+ "matcherGroup": {
114
+ "type": "object",
115
+ "required": ["hooks"],
116
+ "additionalProperties": false,
117
+ "properties": {
118
+ "matcher": { "type": "string" },
119
+ "hooks": {
120
+ "type": "array",
121
+ "items": { "$ref": "#/definitions/hookHandler" }
122
+ }
123
+ }
124
+ },
125
+ "hookHandler": {
126
+ "type": "object",
127
+ "required": ["type"],
128
+ "additionalProperties": false,
129
+ "properties": {
130
+ "type": {
131
+ "type": "string",
132
+ "enum": ["command", "http", "mcp_tool", "prompt", "agent"]
133
+ },
134
+ "if": { "type": "string" },
135
+ "timeout": { "type": "integer", "minimum": 1 },
136
+ "statusMessage": { "type": "string" },
137
+ "async": { "type": "boolean" },
138
+ "asyncRewake": { "type": "boolean" },
139
+ "once": { "type": "boolean" },
140
+ "command": { "type": "string" },
141
+ "shell": {
142
+ "type": "string",
143
+ "enum": ["bash", "powershell"]
144
+ },
145
+ "url": { "type": "string" },
146
+ "headers": { "type": "object" },
147
+ "allowedEnvVars": {
148
+ "type": "array",
149
+ "items": { "type": "string" }
150
+ },
151
+ "server": { "type": "string" },
152
+ "tool": { "type": "string" },
153
+ "input": { "type": "object" },
154
+ "prompt": { "type": "string" },
155
+ "model": { "type": "string" }
156
+ },
157
+ "allOf": [
158
+ {
159
+ "if": { "properties": { "type": { "const": "command" } } },
160
+ "then": { "required": ["command"] }
161
+ },
162
+ {
163
+ "if": { "properties": { "type": { "const": "http" } } },
164
+ "then": { "required": ["url"] }
165
+ },
166
+ {
167
+ "if": { "properties": { "type": { "const": "mcp_tool" } } },
168
+ "then": { "required": ["server", "tool"] }
169
+ },
170
+ {
171
+ "if": { "properties": { "type": { "enum": ["prompt", "agent"] } } },
172
+ "then": { "required": ["prompt"] }
173
+ }
174
+ ]
175
+ }
176
+ }
177
+ }