@curdx/flow 2.2.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 (78) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +19 -2
  3. package/README.md +15 -8
  4. package/README.zh.md +5 -3
  5. package/agent-preamble/preamble.md +33 -0
  6. package/agents/flow-adversary.md +1 -1
  7. package/agents/flow-architect.md +2 -1
  8. package/agents/flow-brownfield-analyst.md +153 -0
  9. package/agents/flow-debugger.md +6 -11
  10. package/agents/flow-edge-hunter.md +1 -1
  11. package/agents/flow-executor.md +30 -8
  12. package/agents/flow-planner.md +38 -5
  13. package/agents/flow-product-designer.md +2 -1
  14. package/agents/flow-qa-engineer.md +9 -5
  15. package/agents/flow-researcher.md +2 -1
  16. package/agents/flow-reviewer.md +23 -5
  17. package/agents/flow-security-auditor.md +5 -3
  18. package/agents/flow-triage-analyst.md +5 -24
  19. package/agents/flow-ui-researcher.md +4 -3
  20. package/agents/flow-ux-designer.md +12 -39
  21. package/agents/flow-verifier.md +35 -3
  22. package/cli/README.md +3 -1
  23. package/cli/doctor-workflow.js +1074 -2
  24. package/cli/doctor.js +8 -0
  25. package/cli/help.js +2 -0
  26. package/cli/lib/doctor-report.js +256 -1
  27. package/cli/lib/frontmatter.js +44 -0
  28. package/cli/lib/json-schema.js +57 -0
  29. package/cli/lib/runtime.js +20 -2
  30. package/cli/utils.js +6 -1
  31. package/gates/adversarial-review-gate.md +1 -1
  32. package/gates/security-gate.md +2 -2
  33. package/gates/test-quality-gate.md +59 -0
  34. package/hooks/hooks.json +16 -2
  35. package/hooks/scripts/common.sh +4 -0
  36. package/hooks/scripts/session-start.sh +17 -2
  37. package/hooks/scripts/stop-watcher.sh +69 -18
  38. package/hooks/scripts/subagent-artifact-guard.sh +159 -0
  39. package/hooks/scripts/subagent-statusline.sh +105 -0
  40. package/knowledge/atomic-commits.md +1 -1
  41. package/knowledge/claude-code-runtime-contracts.md +203 -0
  42. package/knowledge/epic-decomposition.md +1 -1
  43. package/knowledge/execution-strategies.md +23 -1
  44. package/knowledge/planning-reviews.md +2 -2
  45. package/knowledge/poc-first-workflow.md +8 -8
  46. package/knowledge/review-feedback-intake.md +57 -0
  47. package/knowledge/two-stage-review.md +19 -6
  48. package/knowledge/wave-execution.md +16 -1
  49. package/output-styles/curdx-evidence-first.md +34 -0
  50. package/package.json +7 -1
  51. package/schemas/agent-frontmatter.schema.json +0 -7
  52. package/schemas/config.schema.json +14 -0
  53. package/schemas/hooks.schema.json +34 -2
  54. package/schemas/output-style-frontmatter.schema.json +22 -0
  55. package/schemas/plugin-manifest.schema.json +387 -17
  56. package/schemas/plugin-settings.schema.json +29 -0
  57. package/schemas/skill-frontmatter.schema.json +109 -4
  58. package/schemas/spec-state.schema.json +29 -4
  59. package/settings.json +6 -0
  60. package/skills/brownfield-index/SKILL.md +31 -35
  61. package/skills/browser-qa/SKILL.md +11 -3
  62. package/skills/cancel/SKILL.md +82 -0
  63. package/skills/debug/SKILL.md +6 -2
  64. package/skills/epic/SKILL.md +5 -3
  65. package/skills/fast/SKILL.md +1 -0
  66. package/skills/help/SKILL.md +17 -7
  67. package/skills/implement/SKILL.md +38 -7
  68. package/skills/init/SKILL.md +2 -1
  69. package/skills/review/SKILL.md +4 -1
  70. package/skills/security-audit/SKILL.md +17 -3
  71. package/skills/spec/SKILL.md +2 -1
  72. package/skills/start/SKILL.md +18 -18
  73. package/skills/status/SKILL.md +85 -0
  74. package/skills/ui-sketch/SKILL.md +11 -3
  75. package/skills/verify/SKILL.md +13 -1
  76. package/templates/config.json.tmpl +4 -1
  77. package/templates/progress.md.tmpl +19 -0
  78. package/templates/tasks.md.tmpl +26 -3
@@ -4,8 +4,8 @@
4
4
  "title": "CurdX-Flow Claude Code Plugin Manifest",
5
5
  "description": "Project-local schema for .claude-plugin/plugin.json.",
6
6
  "type": "object",
7
- "required": ["name", "version", "description"],
8
- "additionalProperties": true,
7
+ "required": ["name"],
8
+ "additionalProperties": false,
9
9
  "properties": {
10
10
  "name": {
11
11
  "type": "string",
@@ -16,35 +16,80 @@
16
16
  "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$"
17
17
  },
18
18
  "description": { "type": "string" },
19
- "author": { "type": "object" },
20
- "homepage": { "type": "string" },
21
- "repository": { "type": "string" },
22
- "license": { "type": "string" },
23
- "keywords": { "type": "array", "items": { "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
+ },
24
27
  "skills": {
25
28
  "oneOf": [
26
- { "type": "string" },
27
- { "type": "array", "items": { "type": "string" } }
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" } }
28
37
  ]
29
38
  },
30
39
  "agents": {
31
40
  "oneOf": [
32
- { "type": "string" },
33
- { "type": "array", "items": { "type": "string" } }
41
+ { "$ref": "#/definitions/pluginRelativePath" },
42
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } }
34
43
  ]
35
44
  },
36
45
  "hooks": {
37
46
  "oneOf": [
38
- { "type": "string" },
39
- { "type": "object" }
47
+ { "$ref": "#/definitions/pluginRelativePath" },
48
+ { "type": "array", "items": { "$ref": "#/definitions/pluginRelativePath" } },
49
+ { "$ref": "#/definitions/inlineHooksConfig" }
40
50
  ]
41
51
  },
42
52
  "mcpServers": {
43
53
  "oneOf": [
44
- { "type": "string" },
45
- { "type": "object" }
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" } }
46
63
  ]
47
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
+ },
48
93
  "dependencies": {
49
94
  "type": "array",
50
95
  "items": {
@@ -53,14 +98,339 @@
53
98
  {
54
99
  "type": "object",
55
100
  "required": ["name"],
101
+ "additionalProperties": false,
56
102
  "properties": {
57
- "name": { "type": "string" },
103
+ "name": {
104
+ "type": "string",
105
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
106
+ },
58
107
  "version": { "type": "string" },
59
- "marketplace": { "type": "string" }
108
+ "marketplace": {
109
+ "type": "string",
110
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
111
+ }
60
112
  }
61
113
  }
62
114
  ]
63
115
  }
64
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
+ }
65
435
  }
66
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
+ }
@@ -14,11 +14,11 @@
14
14
  "description": {
15
15
  "type": "string",
16
16
  "minLength": 1,
17
- "description": "Concise trigger summary. Keep detailed trigger phrases in when_to_use."
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
18
  },
19
19
  "when_to_use": {
20
20
  "type": "string",
21
- "description": "Additional trigger phrases appended to description in the skill listing."
21
+ "description": "Additional trigger phrases appended to description in the skill listing. Counts toward the same 1536-character listing cap."
22
22
  },
23
23
  "argument-hint": {
24
24
  "type": "string"
@@ -33,7 +33,8 @@
33
33
  "type": "boolean"
34
34
  },
35
35
  "user-invocable": {
36
- "type": "boolean"
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."
37
38
  },
38
39
  "allowed-tools": {
39
40
  "oneOf": [
@@ -56,7 +57,7 @@
56
57
  "type": "string"
57
58
  },
58
59
  "hooks": {
59
- "type": "object"
60
+ "$ref": "#/definitions/skillHooks"
60
61
  },
61
62
  "paths": {
62
63
  "oneOf": [
@@ -68,5 +69,109 @@
68
69
  "type": "string",
69
70
  "enum": ["bash", "powershell"]
70
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
+ }
71
176
  }
72
177
  }
@@ -44,7 +44,6 @@
44
44
  "execute",
45
45
  "verify",
46
46
  "review",
47
- "ship",
48
47
  "completed"
49
48
  ]
50
49
  },
@@ -57,8 +56,7 @@
57
56
  "tasks": { "$ref": "#/definitions/phaseStatus" },
58
57
  "execute": { "$ref": "#/definitions/phaseStatus" },
59
58
  "verify": { "$ref": "#/definitions/phaseStatus" },
60
- "review": { "$ref": "#/definitions/phaseStatus" },
61
- "ship": { "$ref": "#/definitions/phaseStatus" }
59
+ "review": { "$ref": "#/definitions/phaseStatus" }
62
60
  }
63
61
  },
64
62
  "execute_state": {
@@ -73,7 +71,34 @@
73
71
  "total_tasks": { "type": "integer", "minimum": 0 },
74
72
  "task_iteration": { "type": "integer", "minimum": 1 },
75
73
  "global_iteration": { "type": "integer", "minimum": 1 },
76
- "failed_attempts": { "type": "integer", "minimum": 0 }
74
+ "failed_attempts": { "type": "integer", "minimum": 0 },
75
+ "recovery_mode": {
76
+ "type": "string",
77
+ "enum": ["manual", "fix-task"],
78
+ "default": "manual"
79
+ },
80
+ "max_fix_tasks_per_original": {
81
+ "type": "integer",
82
+ "minimum": 1,
83
+ "maximum": 5,
84
+ "default": 2
85
+ },
86
+ "fix_task_map": {
87
+ "type": "object",
88
+ "description": "Per-original-task recovery attempts created by fix-task mode.",
89
+ "additionalProperties": {
90
+ "type": "object",
91
+ "required": ["attempts", "fix_task_ids"],
92
+ "properties": {
93
+ "attempts": { "type": "integer", "minimum": 0 },
94
+ "fix_task_ids": {
95
+ "type": "array",
96
+ "items": { "type": "string" }
97
+ },
98
+ "last_error": { "type": "string" }
99
+ }
100
+ }
101
+ }
77
102
  }
78
103
  },
79
104
  "decisions": {
package/settings.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "subagentStatusLine": {
3
+ "type": "command",
4
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/scripts/subagent-statusline.sh"
5
+ }
6
+ }