crewly 1.20.192 → 1.20.193

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 (458) hide show
  1. package/config/constants.ts +11 -0
  2. package/config/hooks/subagent-guard/subagent.sh +113 -0
  3. package/config/roles/architect/prompt.md +1 -1
  4. package/config/roles/auditor/prompt.md +1 -1
  5. package/config/roles/backend-developer/prompt.md +1 -1
  6. package/config/roles/content-strategist/prompt.md +2 -2
  7. package/config/roles/designer/prompt.md +1 -1
  8. package/config/roles/developer/prompt.md +2 -2
  9. package/config/roles/frontend-developer/prompt.md +1 -1
  10. package/config/roles/fullstack-dev/prompt.md +1 -1
  11. package/config/roles/generalist/prompt.md +1 -1
  12. package/config/roles/ops/prompt.md +1 -1
  13. package/config/roles/orchestrator/prompt.md +2 -2
  14. package/config/roles/product-manager/prompt.md +1 -1
  15. package/config/roles/qa/prompt.md +1 -1
  16. package/config/roles/qa-engineer/prompt.md +1 -1
  17. package/config/roles/researcher/prompt.md +1 -1
  18. package/config/roles/sales/prompt.md +1 -1
  19. package/config/roles/support/prompt.md +1 -1
  20. package/config/roles/team-leader/prompt.md +1 -1
  21. package/config/roles/tpm/prompt.md +1 -1
  22. package/config/roles/ux-designer/prompt.md +1 -1
  23. package/config/skills/_common/complete-body-shape.test.sh +17 -0
  24. package/config/skills/agent/core/complete-task/SKILL.md +27 -4
  25. package/config/skills/agent/core/complete-task/execute.sh +23 -3
  26. package/config/skills/agent/core/complete-task/execute.test.sh +34 -0
  27. package/config/skills/agent/core/handoff-task/execute.sh +1 -1
  28. package/config/skills/agent/core/report-status/SKILL.md +27 -4
  29. package/config/skills/agent/core/report-status/execute.sh +104 -4
  30. package/config/skills/agent/core/todo-add/SKILL.md +16 -2
  31. package/config/skills/agent/core/todo-add/execute.sh +21 -5
  32. package/config/skills/agent/core/todo-add/execute.test.sh +14 -0
  33. package/config/skills/agent/core/todo-tasks/SKILL.md +4 -3
  34. package/config/skills/agent/core/todo-update/SKILL.md +13 -2
  35. package/config/skills/agent/core/todo-update/execute.sh +41 -3
  36. package/config/skills/agent/core/todo-update/execute.test.sh +7 -0
  37. package/config/skills/marketplace-registry.ts +4 -4
  38. package/config/skills/orchestrator/complete-task/SKILL.md +13 -6
  39. package/config/skills/orchestrator/complete-task/execute.sh +22 -3
  40. package/config/skills/orchestrator/delegate-task/execute.sh +2 -2
  41. package/config/skills/orchestrator/harness-login/SKILL.md +9 -1
  42. package/config/skills/orchestrator/harness-login/execute.sh +12 -4
  43. package/config/skills/orchestrator/harness-login/execute.test.sh +7 -0
  44. package/config/skills/team-leader/delegate-task/execute.sh +1 -1
  45. package/config/skills/team-leader/verify-output/SKILL.md +18 -1
  46. package/config/skills/team-leader/verify-output/execute.sh +28 -0
  47. package/config/skills/team-leader/verify-output/execute.test.sh +27 -0
  48. package/dist/backend/backend/src/constants.d.ts +135 -2
  49. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  50. package/dist/backend/backend/src/constants.js +136 -1
  51. package/dist/backend/backend/src/constants.js.map +1 -1
  52. package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts +6 -0
  53. package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts.map +1 -1
  54. package/dist/backend/backend/src/controllers/canva/canva.controller.js +13 -2
  55. package/dist/backend/backend/src/controllers/canva/canva.controller.js.map +1 -1
  56. package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
  57. package/dist/backend/backend/src/controllers/canva/canva.routes.js +3 -1
  58. package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
  59. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  60. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +4 -1
  61. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  62. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -0
  63. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
  64. package/dist/backend/backend/src/controllers/connector/connector.controller.js +32 -3
  65. package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
  66. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts +41 -0
  67. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -0
  68. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +75 -0
  69. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -0
  70. package/dist/backend/backend/src/controllers/google/google.controller.d.ts +6 -0
  71. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  72. package/dist/backend/backend/src/controllers/google/google.controller.js +19 -0
  73. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  74. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  75. package/dist/backend/backend/src/controllers/google/google.routes.js +3 -1
  76. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  77. package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts.map +1 -1
  78. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +22 -3
  79. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js.map +1 -1
  80. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +19 -2
  81. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -1
  82. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +37 -4
  83. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -1
  84. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
  85. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +3 -1
  86. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
  87. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +9 -0
  88. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  89. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +26 -0
  90. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  91. package/dist/backend/backend/src/controllers/people/people.routes.d.ts +25 -0
  92. package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -0
  93. package/dist/backend/backend/src/controllers/people/people.routes.js +90 -0
  94. package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -0
  95. package/dist/backend/backend/src/controllers/request-types.d.ts +2 -0
  96. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  97. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +22 -1
  98. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  99. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +143 -3
  100. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  101. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +25 -3
  102. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  103. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +125 -19
  104. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  105. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  106. package/dist/backend/backend/src/controllers/team/team.controller.js +14 -0
  107. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  108. package/dist/backend/backend/src/index.d.ts.map +1 -1
  109. package/dist/backend/backend/src/index.js +44 -1
  110. package/dist/backend/backend/src/index.js.map +1 -1
  111. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  112. package/dist/backend/backend/src/routes/api.routes.js +3 -0
  113. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  114. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +13 -0
  115. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/agent/agent-registration.service.js +28 -3
  117. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  118. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
  119. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +14 -3
  121. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  122. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
  123. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  124. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
  125. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  126. package/dist/backend/backend/src/services/agent/idle-detection.service.js +1 -1
  127. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  128. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
  129. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
  131. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  132. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
  133. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
  135. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  136. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
  137. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  138. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +49 -5
  139. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  140. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  141. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
  142. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  143. package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
  144. package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
  145. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts +17 -4
  146. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts.map +1 -1
  147. package/dist/backend/backend/src/services/canva/canva-token.service.js +49 -17
  148. package/dist/backend/backend/src/services/canva/canva-token.service.js.map +1 -1
  149. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +24 -0
  150. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  151. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +52 -0
  152. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  153. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +17 -2
  154. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -1
  155. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +30 -6
  156. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
  157. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +38 -2
  158. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
  159. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +63 -1
  160. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
  161. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
  162. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  163. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +204 -56
  164. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  165. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
  166. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  167. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  168. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  169. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +3 -0
  170. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  171. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +25 -2
  172. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
  173. package/dist/backend/backend/src/services/google/google-workspace-token.service.js +48 -7
  174. package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
  175. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +207 -0
  176. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
  177. package/dist/backend/backend/src/services/harness/claude-accounts.js +306 -0
  178. package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -0
  179. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
  180. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  181. package/dist/backend/backend/src/services/harness/harness-credentials.store.js +48 -0
  182. package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  183. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
  184. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  185. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +156 -19
  186. package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  187. package/dist/backend/backend/src/services/harness/harness.types.d.ts +2 -0
  188. package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
  190. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +19 -4
  191. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  192. package/dist/backend/backend/src/services/harness/login-broker.service.js +46 -7
  193. package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
  194. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts +18 -2
  195. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
  196. package/dist/backend/backend/src/services/harness/owner-login-request.js +31 -7
  197. package/dist/backend/backend/src/services/harness/owner-login-request.js.map +1 -1
  198. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
  199. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
  201. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  202. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
  203. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  204. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +29 -0
  205. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  206. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
  207. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  208. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
  209. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  210. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +87 -5
  211. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -1
  212. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +151 -12
  213. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -1
  214. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +17 -4
  215. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -1
  216. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +45 -17
  217. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -1
  218. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts +53 -7
  219. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -1
  220. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js +77 -14
  221. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -1
  222. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +53 -1
  223. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
  224. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +130 -29
  225. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
  226. package/dist/backend/backend/src/services/people/acting-for.service.d.ts +151 -0
  227. package/dist/backend/backend/src/services/people/acting-for.service.d.ts.map +1 -0
  228. package/dist/backend/backend/src/services/people/acting-for.service.js +224 -0
  229. package/dist/backend/backend/src/services/people/acting-for.service.js.map +1 -0
  230. package/dist/backend/backend/src/services/people/dedicated-agent.d.ts +89 -0
  231. package/dist/backend/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
  232. package/dist/backend/backend/src/services/people/dedicated-agent.js +113 -0
  233. package/dist/backend/backend/src/services/people/dedicated-agent.js.map +1 -0
  234. package/dist/backend/backend/src/services/people/grant-sharing.d.ts +79 -0
  235. package/dist/backend/backend/src/services/people/grant-sharing.d.ts.map +1 -0
  236. package/dist/backend/backend/src/services/people/grant-sharing.js +135 -0
  237. package/dist/backend/backend/src/services/people/grant-sharing.js.map +1 -0
  238. package/dist/backend/backend/src/services/people/people-directory.service.d.ts +181 -0
  239. package/dist/backend/backend/src/services/people/people-directory.service.d.ts.map +1 -0
  240. package/dist/backend/backend/src/services/people/people-directory.service.js +317 -0
  241. package/dist/backend/backend/src/services/people/people-directory.service.js.map +1 -0
  242. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  243. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
  244. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  245. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
  246. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  247. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -1
  248. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
  249. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +16 -2
  250. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
  251. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +60 -1
  252. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  253. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +140 -8
  254. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  255. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js +1 -1
  256. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js.map +1 -1
  257. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
  258. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  259. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
  260. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  261. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  262. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +12 -2
  263. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  264. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts +7 -1
  265. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts.map +1 -1
  266. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js +18 -3
  267. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js.map +1 -1
  268. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  269. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +3 -0
  270. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  271. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
  272. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  273. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
  274. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  275. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  276. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  277. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +46 -0
  278. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  279. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts +105 -0
  280. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts.map +1 -0
  281. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js +238 -0
  282. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js.map +1 -0
  283. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  284. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +4 -0
  285. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  286. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +39 -12
  287. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -1
  288. package/dist/backend/backend/src/services/usage/usage-stats.service.js +61 -20
  289. package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -1
  290. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -0
  291. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  292. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +9 -0
  293. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  294. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +10 -0
  295. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  296. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +45 -2
  297. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  298. package/dist/backend/backend/src/types/index.d.ts +12 -1
  299. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  300. package/dist/backend/backend/src/types/index.js.map +1 -1
  301. package/dist/backend/backend/src/types/messaging.types.d.ts +5 -0
  302. package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
  303. package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
  304. package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts +77 -0
  305. package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts.map +1 -0
  306. package/dist/backend/backend/src/types/v2/completion-evidence.types.js +119 -0
  307. package/dist/backend/backend/src/types/v2/completion-evidence.types.js.map +1 -0
  308. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +13 -0
  309. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  310. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  311. package/dist/backend/build-info.json +2 -2
  312. package/dist/backend/config/constants.d.ts +11 -0
  313. package/dist/backend/config/constants.d.ts.map +1 -1
  314. package/dist/backend/config/constants.js +11 -0
  315. package/dist/backend/config/constants.js.map +1 -1
  316. package/dist/cli/backend/src/constants.d.ts +135 -2
  317. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  318. package/dist/cli/backend/src/constants.js +136 -1
  319. package/dist/cli/backend/src/constants.js.map +1 -1
  320. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +13 -0
  321. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  322. package/dist/cli/backend/src/services/agent/agent-registration.service.js +28 -3
  323. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  324. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
  325. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  326. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +14 -3
  327. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  328. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
  329. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  330. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
  331. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  332. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
  333. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  334. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
  335. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  336. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
  337. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  338. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
  339. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  340. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
  341. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  342. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +49 -5
  343. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  344. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  345. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
  346. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  347. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
  348. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
  349. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +24 -0
  350. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  351. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +52 -0
  352. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  353. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
  354. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  355. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +204 -56
  356. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  357. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
  358. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  359. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  360. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +207 -0
  361. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
  362. package/dist/cli/backend/src/services/harness/claude-accounts.js +306 -0
  363. package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -0
  364. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
  365. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  366. package/dist/cli/backend/src/services/harness/harness-credentials.store.js +48 -0
  367. package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  368. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
  369. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  370. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +156 -19
  371. package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  372. package/dist/cli/backend/src/services/harness/harness.types.d.ts +2 -0
  373. package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
  374. package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
  375. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +19 -4
  376. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  377. package/dist/cli/backend/src/services/harness/login-broker.service.js +46 -7
  378. package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
  379. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts +18 -2
  380. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
  381. package/dist/cli/backend/src/services/harness/owner-login-request.js +31 -7
  382. package/dist/cli/backend/src/services/harness/owner-login-request.js.map +1 -1
  383. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
  384. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  385. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
  386. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  387. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
  388. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  389. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +29 -0
  390. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  391. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
  392. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  393. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
  394. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  395. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts +197 -0
  396. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -0
  397. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js +455 -0
  398. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -0
  399. package/dist/cli/backend/src/services/people/acting-for.service.d.ts +151 -0
  400. package/dist/cli/backend/src/services/people/acting-for.service.d.ts.map +1 -0
  401. package/dist/cli/backend/src/services/people/acting-for.service.js +224 -0
  402. package/dist/cli/backend/src/services/people/acting-for.service.js.map +1 -0
  403. package/dist/cli/backend/src/services/people/dedicated-agent.d.ts +89 -0
  404. package/dist/cli/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
  405. package/dist/cli/backend/src/services/people/dedicated-agent.js +113 -0
  406. package/dist/cli/backend/src/services/people/dedicated-agent.js.map +1 -0
  407. package/dist/cli/backend/src/services/people/people-directory.service.d.ts +181 -0
  408. package/dist/cli/backend/src/services/people/people-directory.service.d.ts.map +1 -0
  409. package/dist/cli/backend/src/services/people/people-directory.service.js +317 -0
  410. package/dist/cli/backend/src/services/people/people-directory.service.js.map +1 -0
  411. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
  412. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  413. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
  414. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  415. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
  416. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  417. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
  418. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  419. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  420. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +3 -0
  421. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  422. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
  423. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  424. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
  425. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  426. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  427. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  428. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +46 -0
  429. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  430. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  431. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +4 -0
  432. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  433. package/dist/cli/backend/src/types/index.d.ts +12 -1
  434. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  435. package/dist/cli/backend/src/types/index.js.map +1 -1
  436. package/dist/cli/backend/src/types/messaging.types.d.ts +5 -0
  437. package/dist/cli/backend/src/types/messaging.types.d.ts.map +1 -1
  438. package/dist/cli/backend/src/types/messaging.types.js.map +1 -1
  439. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +13 -0
  440. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  441. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  442. package/dist/cli/cli/src/utils/marketplace.d.ts +21 -0
  443. package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
  444. package/dist/cli/cli/src/utils/marketplace.js +35 -1
  445. package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
  446. package/dist/cli/config/constants.d.ts +11 -0
  447. package/dist/cli/config/constants.d.ts.map +1 -1
  448. package/dist/cli/config/constants.js +11 -0
  449. package/dist/cli/config/constants.js.map +1 -1
  450. package/dist/cli/config/skills/marketplace-registry.d.ts +4 -4
  451. package/dist/cli/config/skills/marketplace-registry.js +4 -4
  452. package/frontend/dist/assets/{index-5b7af029.js → index-465d1f8f.js} +293 -293
  453. package/frontend/dist/assets/{index-fc715ec3.css → index-5e967795.css} +1 -1
  454. package/frontend/dist/index.html +2 -2
  455. package/package.json +1 -1
  456. package/packages/crewly-agent/src/runtime/tool-registry.test.ts +45 -0
  457. package/packages/crewly-agent/src/runtime/tool-registry.ts +40 -5
  458. package/packages/crewly-agent/src/test/isolated-home.test.ts +24 -0
@@ -9,7 +9,12 @@ print_usage() {
9
9
  cat <<'EOF_USAGE'
10
10
  Usage:
11
11
  # CLI flags (preferred — avoids shell escaping issues)
12
- bash execute.sh --session dev-1 --status done --summary "Fixed the bug" --project /path/to/project
12
+ bash execute.sh --session dev-1 --status done --summary "Fixed the bug" --project /path/to/project \
13
+ --artifact src/fix.ts --command "npm test" --exit-code 0 --output-tail "42 passed"
14
+
15
+ # Could not finish: done with a blocked step is recorded as BLOCKED, not done
16
+ bash execute.sh --session dev-1 --status done --summary "Fix written, tests blocked" \
17
+ --blocked-step "npm test" --blocked-reason "test DB unreachable"
13
18
 
14
19
  # Summary from stdin (for multi-line or special characters)
15
20
  echo "Fixed the bug — it's working" | bash execute.sh --session dev-1 --status done --project /path
@@ -37,6 +42,18 @@ Options:
37
42
  --progress Progress percentage (0-100, for structured format)
38
43
  --structured Use structured StatusReport format (true/false)
39
44
  --json | -j Raw JSON payload (same as legacy)
45
+
46
+ Evidence (status done — #873: "done" needs evidence):
47
+ --artifact <path> A file the work produced (absolute, relative to the
48
+ project/worktree, or an https URL). Must exist. Repeatable.
49
+ --command <cmd> A command you ran. Follow it with --exit-code (required)
50
+ --exit-code <n> and optionally --output-tail. Repeatable as a group.
51
+ --output-tail <text> Last lines of that command's output.
52
+ --blocked-step <step> You could not finish: the step that failed ...
53
+ --blocked-reason <why> ... and why. The WorkItem is recorded as BLOCKED, not done.
54
+ --evidence <json> Raw evidence array, e.g. '[{"type":"artifact","path":"/abs/f"}]'
55
+ A non-zero --exit-code or a missing artifact is rejected by the server. Without
56
+ any evidence, done is accepted this release with a warning; next release it is refused.
40
57
  --help | -h Show this help
41
58
  EOF_USAGE
42
59
  }
@@ -52,6 +69,28 @@ TASK_ID=""
52
69
  WORK_ITEM_ID=""
53
70
  PROGRESS=""
54
71
  STRUCTURED="false"
72
+ # Evidence entries built from flags (#873), as a JSON array.
73
+ FLAG_EVIDENCE='[]'
74
+ BLOCKED_STEP=""
75
+ BLOCKED_REASON=""
76
+ EVIDENCE_ARG=""
77
+
78
+ # add_evidence <jq-object-expression> [jq --arg pairs...]
79
+ # Appends one entry to FLAG_EVIDENCE.
80
+ add_evidence() {
81
+ local expr="$1"; shift
82
+ FLAG_EVIDENCE=$(printf '%s' "$FLAG_EVIDENCE" | jq -c "$@" ". + [${expr}]")
83
+ }
84
+
85
+ # set_last_command_field <field> <jq value expression> [jq --arg/--argjson pairs...]
86
+ # Sets a field on the most recent --command entry; refuses when there is none.
87
+ set_last_command_field() {
88
+ local field="$1" valexpr="$2" flag="$3"; shift 3
89
+ if [ "$(printf '%s' "$FLAG_EVIDENCE" | jq -r 'if length > 0 and .[-1].type == "command" then "yes" else "no" end')" != "yes" ]; then
90
+ error_exit "${flag} must follow --command <cmd>"
91
+ fi
92
+ FLAG_EVIDENCE=$(printf '%s' "$FLAG_EVIDENCE" | jq -c "$@" ".[-1].${field} = ${valexpr}")
93
+ }
55
94
 
56
95
  # Detect legacy JSON argument as the first parameter
57
96
  if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
@@ -109,6 +148,35 @@ while [[ $# -gt 0 ]]; do
109
148
  INPUT_JSON="$2"
110
149
  shift 2
111
150
  ;;
151
+ --artifact)
152
+ add_evidence '{type: "artifact", path: $p}' --arg p "$2"
153
+ shift 2
154
+ ;;
155
+ --command)
156
+ add_evidence '{type: "command", command: $c}' --arg c "$2"
157
+ shift 2
158
+ ;;
159
+ --exit-code)
160
+ [[ "$2" =~ ^-?[0-9]+$ ]] || error_exit "--exit-code must be an integer (got \"$2\")"
161
+ set_last_command_field exitCode '($n | tonumber)' --exit-code --arg n "$2"
162
+ shift 2
163
+ ;;
164
+ --output-tail)
165
+ set_last_command_field outputTail '$t' --output-tail --arg t "$2"
166
+ shift 2
167
+ ;;
168
+ --blocked-step)
169
+ BLOCKED_STEP="$2"
170
+ shift 2
171
+ ;;
172
+ --blocked-reason)
173
+ BLOCKED_REASON="$2"
174
+ shift 2
175
+ ;;
176
+ --evidence)
177
+ EVIDENCE_ARG="$2"
178
+ shift 2
179
+ ;;
112
180
  --help|-h)
113
181
  print_usage
114
182
  exit 0
@@ -152,6 +220,7 @@ if [ -n "$INPUT_JSON" ]; then
152
220
  [ -z "$AGENT_ROLE" ] && AGENT_ROLE=$(printf '%s' "$INPUT" | jq -r '.role // .agentRole // empty')
153
221
  ARTIFACTS=$(printf '%s' "$INPUT" | jq -c '.artifacts // empty')
154
222
  BLOCKERS=$(printf '%s' "$INPUT" | jq -c '.blockers // empty')
223
+ [ -z "$EVIDENCE_ARG" ] && EVIDENCE_ARG=$(printf '%s' "$INPUT" | jq -c '.evidence // empty')
155
224
  USE_STRUCTURED=$(printf '%s' "$INPUT" | jq -r '.structured // "false"')
156
225
  [ "$USE_STRUCTURED" = "true" ] && STRUCTURED="true"
157
226
  else
@@ -159,6 +228,24 @@ else
159
228
  BLOCKERS=""
160
229
  fi
161
230
 
231
+ # Assemble the evidence block (#873): --evidence / JSON `evidence` first, then
232
+ # the entries from --artifact / --command / --blocked-step flags.
233
+ if [ -n "$EVIDENCE_ARG" ]; then
234
+ if ! printf '%s' "$EVIDENCE_ARG" | jq -e 'type == "array"' >/dev/null 2>&1; then
235
+ error_exit "evidence must be a JSON array, e.g. '[{\"type\":\"artifact\",\"path\":\"/abs/file\"}]'"
236
+ fi
237
+ else
238
+ EVIDENCE_ARG='[]'
239
+ fi
240
+ if [ -n "$BLOCKED_STEP" ] || [ -n "$BLOCKED_REASON" ]; then
241
+ [ -n "$BLOCKED_STEP" ] && [ -n "$BLOCKED_REASON" ] || error_exit "--blocked-step and --blocked-reason go together: name the step that failed and why"
242
+ add_evidence '{type: "blocked", step: $s, reason: $r}' --arg s "$BLOCKED_STEP" --arg r "$BLOCKED_REASON"
243
+ fi
244
+ if [ "$(printf '%s' "$FLAG_EVIDENCE" | jq '[.[] | select(.type == "command" and (has("exitCode") | not))] | length')" != "0" ]; then
245
+ error_exit "every --command needs --exit-code <n> after it: the exit code is the evidence"
246
+ fi
247
+ EVIDENCE=$(jq -cn --argjson a "$EVIDENCE_ARG" --argjson b "$FLAG_EVIDENCE" '$a + $b')
248
+
162
249
  require_param "sessionName (--session)" "$SESSION_NAME"
163
250
  require_param "status (--status)" "$STATUS"
164
251
  require_param "summary (--summary)" "$SUMMARY"
@@ -297,18 +384,31 @@ if [ "$STATUS" = "done" ]; then
297
384
  # `completeItem`). Prior shape `{summary}` 400'd with
298
385
  # `agentId is required` + `summary required in body.result`,
299
386
  # forcing every worker into a direct-curl workaround.
387
+ #
388
+ # #873: the evidence block goes in result.evidence. Omitted when empty
389
+ # (the server then warns this release, refuses the next).
300
390
  COMPLETE_BODY=$(jq -n \
301
391
  --arg agentId "$SESSION_NAME" \
302
392
  --arg summary "$SUMMARY" \
303
- '{agentId: $agentId, result: {summary: $summary}}')
393
+ --argjson evidence "$EVIDENCE" \
394
+ '{agentId: $agentId, result: ({summary: $summary} + (if ($evidence | length) > 0 then {evidence: $evidence} else {} end))}')
304
395
  # No `|| true`. A swallowed failure here is the inverse of the bug above:
305
396
  # report-status would announce success while the WorkItem stayed open, and
306
397
  # that is equally invisible. Report what actually happened either way.
307
398
  if COMPLETE_RESULT=$(api_call POST "/task-pool/complete/${TARGET_WI_ID}" "$COMPLETE_BODY" 2>&1); then
308
399
  # Echo the resolved id even on the happy path. Silent-but-correct is how
309
400
  # this class hides — the caller must be able to see WHICH item closed.
310
- jq -n --arg id "$TARGET_WI_ID" --arg how "$WI_RESOLUTION" \
311
- '{completedWorkItem: $id, resolvedBy: $how}' >&2
401
+ # A `blocked` evidence entry is recorded as blocked, not done (#873);
402
+ # a completion without evidence carries the server's warning.
403
+ COMPLETE_WARNING=$(printf '%s' "$COMPLETE_RESULT" | jq -rs '(map(select(type == "object" and has("success"))) | last // {}) | .warning // empty' 2>/dev/null || true)
404
+ COMPLETE_RECORDED=$(printf '%s' "$COMPLETE_RESULT" | jq -rs '(map(select(type == "object" and has("success"))) | last // {}) | .recordedAs // empty' 2>/dev/null || true)
405
+ if [ "$COMPLETE_RECORDED" = "blocked" ]; then
406
+ jq -n --arg id "$TARGET_WI_ID" --arg how "$WI_RESOLUTION" \
407
+ '{workItem: $id, markedAs: "blocked", resolvedBy: $how, note: "blocked evidence: recorded as blocked, not done"}' >&2
408
+ else
409
+ jq -n --arg id "$TARGET_WI_ID" --arg how "$WI_RESOLUTION" --arg w "$COMPLETE_WARNING" \
410
+ '{completedWorkItem: $id, resolvedBy: $how} + (if $w != "" then {warning: $w} else {} end)' >&2
411
+ fi
312
412
  else
313
413
  jq -n --arg id "$TARGET_WI_ID" --arg err "$COMPLETE_RESULT" \
314
414
  '{warning: "status reported, but completing the WorkItem FAILED — it is still open", workItemId: $id, error: $err}' >&2
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: To Do Add
3
- description: Add a task to one of the owner's Microsoft To Do lists — title, optional due date, note and importance (via the Microsoft grant held by Crewly Cloud).
4
- version: 1.0.0
3
+ description: Add a task to one of the owner's Microsoft To Do lists — title, optional due date, note, importance and steps (checklist items) (via the Microsoft grant held by Crewly Cloud).
4
+ version: 1.1.0
5
5
  category: productivity
6
6
  skillType: claude-skill
7
7
  assignableRoles:
@@ -18,6 +18,7 @@ triggers:
18
18
  - add a microsoft to do task
19
19
  - remind me in to do
20
20
  - create an outlook task
21
+ - add a task with steps
21
22
  tags:
22
23
  - microsoft
23
24
  - todo
@@ -35,8 +36,13 @@ execution:
35
36
  ```bash
36
37
  bash execute.sh --title "Buy milk" # default list ("Tasks")
37
38
  bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 is in Drive"
39
+ bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # ONE task with three steps
38
40
  ```
39
41
 
42
+ When the owner asks for items as **steps of one task** (a shopping run, a
43
+ packing list), use `--steps` — do not put them in the note, and do not make
44
+ one task per item unless he asked for separate tasks.
45
+
40
46
  | Flag | Meaning |
41
47
  |---|---|
42
48
  | `--title` | Task title (required) |
@@ -44,13 +50,21 @@ bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --import
44
50
  | `--due` | Due date `YYYY-MM-DD` |
45
51
  | `--note` | Note shown under the task |
46
52
  | `--importance` | `low` \| `normal` \| `high` |
53
+ | `--steps` | Comma-separated steps (checklist items), in order |
54
+ | `--step` | One step; repeat it for more (for a step that contains a comma) |
47
55
 
48
56
  ## Output
49
57
 
50
58
  ```json
51
59
  {"success":true,"list":"Work","task":{"id":"AAMk…","title":"Send deck to Ann","status":"notStarted","importance":"high","due":"2026-10-01","note":"v3 is in Drive"}}
60
+ {"success":true,"list":"Groceries","task":{"id":"AAMk…","title":"Costco","status":"notStarted","steps":[{"id":"…","title":"Eggs","checked":false},{"id":"…","title":"Milk","checked":false}]}}
52
61
  ```
53
62
 
63
+ Steps are created after the task. If one fails, the task still exists and
64
+ the answer lists it in `failedSteps` (`[{"step":"Milk","error":"…"}]`):
65
+ add it with todo-update `--add-steps` — do **not** run todo-add again, that
66
+ would make a second task.
67
+
54
68
  A list that does not exist is not created — make it with todo-lists
55
69
  `--create` first.
56
70
 
@@ -7,6 +7,7 @@
7
7
  # Usage:
8
8
  # bash execute.sh --title "Buy milk" # default list
9
9
  # bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 in Drive"
10
+ # bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # one task, three steps
10
11
  # bash execute.sh '{"list":"Groceries","title":"Eggs"}'
11
12
  # =============================================================================
12
13
  set -euo pipefail
@@ -18,7 +19,8 @@ print_usage() {
18
19
  Usage:
19
20
  bash execute.sh --title "Buy milk" # default list
20
21
  bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 in Drive"
21
- bash execute.sh '{"list":"Groceries","title":"Eggs"}'
22
+ bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # one task, three steps
23
+ bash execute.sh '{"list":"Groceries","title":"Costco","steps":["Eggs","Milk"]}'
22
24
 
23
25
  Options:
24
26
  --title, -t Task title (required)
@@ -26,6 +28,8 @@ Options:
26
28
  --due Due date, YYYY-MM-DD
27
29
  --note Note text shown under the task
28
30
  --importance low | normal | high
31
+ --steps Comma-separated steps (checklist items) to create on the task
32
+ --step One step; repeat for more (use when a step contains a comma)
29
33
  --help | -h Show this help
30
34
  EOF_USAGE
31
35
  }
@@ -38,6 +42,12 @@ fail_from() {
38
42
 
39
43
  uri() { jq -rn --arg v "$1" '$v|@uri'; }
40
44
 
45
+ # Append step titles to a JSON array: $1 = array, $2 = text, $3 = "split" to
46
+ # split the text on commas. Titles are trimmed; empty ones are dropped.
47
+ add_steps() {
48
+ jq -c --arg v "$2" --arg mode "${3:-}" '. + (if $mode == "split" then ($v | split(",")) else [$v] end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0)))' <<<"$1"
49
+ }
50
+
41
51
  # api_call may print a one-line warning to stderr (no CREWLY_SESSION_NAME);
42
52
  # the backend answer is always the last line. On failure print the mapped
43
53
  # failure JSON (fail_from) and return 1.
@@ -52,7 +62,7 @@ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
52
62
  INPUT_JSON="$1"
53
63
  shift || true
54
64
  fi
55
- TITLE=""; LIST=""; DUE=""; NOTE=""; IMPORTANCE=""
65
+ TITLE=""; LIST=""; DUE=""; NOTE=""; IMPORTANCE=""; STEPS='[]'
56
66
  while [[ $# -gt 0 ]]; do
57
67
  case "$1" in
58
68
  --title|-t) [ $# -ge 2 ] || error_exit "--title requires a value"; TITLE="$2"; shift 2 ;;
@@ -60,6 +70,8 @@ while [[ $# -gt 0 ]]; do
60
70
  --due) [ $# -ge 2 ] || error_exit "--due requires a value"; DUE="$2"; shift 2 ;;
61
71
  --note) [ $# -ge 2 ] || error_exit "--note requires a value"; NOTE="$2"; shift 2 ;;
62
72
  --importance) [ $# -ge 2 ] || error_exit "--importance requires a value"; IMPORTANCE="$2"; shift 2 ;;
73
+ --steps) [ $# -ge 2 ] || error_exit "--steps requires a value"; STEPS=$(add_steps "$STEPS" "$2" split); shift 2 ;;
74
+ --step) [ $# -ge 2 ] || error_exit "--step requires a value"; STEPS=$(add_steps "$STEPS" "$2"); shift 2 ;;
63
75
  --help|-h) print_usage; exit 0 ;;
64
76
  *) error_exit "Unknown option: $1" ;;
65
77
  esac
@@ -71,14 +83,18 @@ if [ -n "$INPUT_JSON" ]; then
71
83
  [ -z "$DUE" ] && DUE=$(printf '%s' "$INPUT" | jq -r '.due // empty')
72
84
  [ -z "$NOTE" ] && NOTE=$(printf '%s' "$INPUT" | jq -r '.note // empty')
73
85
  [ -z "$IMPORTANCE" ] && IMPORTANCE=$(printf '%s' "$INPUT" | jq -r '.importance // empty')
86
+ if [ "$STEPS" = '[]' ]; then
87
+ STEPS=$(printf '%s' "$INPUT" | jq -c '.steps // [] | if type == "string" then split(",") else map(tostring) end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))')
88
+ fi
74
89
  fi
75
90
  [ -n "$TITLE" ] || error_exit "--title is required"
76
91
  if [ -n "$DUE" ] && ! [[ "$DUE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then error_exit "--due must look like 2026-10-01"; fi
77
- BODY=$(jq -cn --arg title "$TITLE" --arg list "$LIST" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" \
92
+ BODY=$(jq -cn --arg title "$TITLE" --arg list "$LIST" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" --argjson steps "$STEPS" \
78
93
  '{title: $title}
79
94
  + (if $list != "" then {list: $list} else {} end)
80
95
  + (if $due != "" then {due: $due} else {} end)
81
96
  + (if $note != "" then {note: $note} else {} end)
82
- + (if $imp != "" then {importance: $imp} else {} end)')
97
+ + (if $imp != "" then {importance: $imp} else {} end)
98
+ + (if ($steps | length) > 0 then {steps: $steps} else {} end)')
83
99
  RESPONSE=$(call POST "/microsoft-todo/tasks" "$BODY") || { printf '%s\n' "$RESPONSE"; exit 1; }
84
- printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task}'
100
+ printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task} + (if .data.failedSteps then {failedSteps: .data.failedSteps} else {} end)'
@@ -33,6 +33,8 @@ class H(BaseHTTPRequestHandler):
33
33
  out = {'list': LIST, 'count': 1, 'tasks': [{'id': 'T1', 'title': 'Milk', 'status': 'notStarted', 'due': '2026-10-01'}]}
34
34
  elif path == '/api/microsoft-todo/tasks':
35
35
  out = {'list': LIST, 'task': {'id': 'T2', 'title': (data or {}).get('title'), 'status': 'notStarted'}}
36
+ if (data or {}).get('title') == 'partial':
37
+ out['failedSteps'] = [{'step': 'Milk', 'error': 'Forbidden: no'}]
36
38
  elif method == 'PATCH':
37
39
  out = {'list': LIST, 'task': {'id': path.rsplit('/', 1)[1], 'title': 'Milk', 'status': 'completed'}}
38
40
  elif method == 'DELETE':
@@ -69,6 +71,18 @@ run '{"list":"Groceries","title":"Eggs"}' >/dev/null
69
71
  check "json input" "$(last '.body')" '{"title":"Eggs","list":"Groceries"}'
70
72
  check "title required" "$(run_err --list Work | jq -r .error)" "--title is required"
71
73
  check "bad due" "$(run_err --title x --due tomorrow | jq -r .error)" "--due must look like 2026-10-01"
74
+ run --title "Costco" --steps "Eggs, Milk,,Bread " >/dev/null
75
+ check "steps: comma list, trimmed, empties dropped" "$(last '.body')" '{"title":"Costco","steps":["Eggs","Milk","Bread"]}'
76
+ run --title "Costco" --step "Eggs, large" --step Milk >/dev/null
77
+ check "steps: repeated --step keeps commas" "$(last '.body.steps')" '["Eggs, large","Milk"]'
78
+ run '{"title":"Costco","steps":["Eggs","Milk"]}' >/dev/null
79
+ check "steps: json array" "$(last '.body.steps')" '["Eggs","Milk"]'
80
+ run '{"title":"Costco","steps":"Eggs,Milk"}' >/dev/null
81
+ check "steps: json string" "$(last '.body.steps')" '["Eggs","Milk"]'
82
+ run --title "Plain" --steps " , " >/dev/null
83
+ check "steps: none left means no steps field" "$(last '.body')" '{"title":"Plain"}'
84
+ OUT=$(run --title partial --steps "Eggs,Milk")
85
+ check "steps: failed steps are reported" "$(printf '%s' "$OUT" | jq -c '[.success,.failedSteps]')" '[true,[{"step":"Milk","error":"Forbidden: no"}]]'
72
86
  OUT=$(run --title no-grant || true)
73
87
  check "not connected" "$(printf '%s' "$OUT" | jq -r .reason)" "not_connected"
74
88
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: To Do Tasks
3
- description: List the tasks in one of the owner's Microsoft To Do lists — open tasks by default, --all to include completed ones (via the Microsoft grant held by Crewly Cloud). Read-only.
4
- version: 1.0.0
3
+ description: List the tasks in one of the owner's Microsoft To Do lists — open tasks by default, --all to include completed ones, with each task's steps (via the Microsoft grant held by Crewly Cloud). Read-only.
4
+ version: 1.1.0
5
5
  category: productivity
6
6
  skillType: claude-skill
7
7
  assignableRoles:
@@ -46,7 +46,8 @@ bash execute.sh --list Work --limit 20 # default 50, max 100
46
46
  ```
47
47
 
48
48
  `importance` appears only when not normal; `note` is plain text, cut at
49
- 200 characters. `hasMore: true` means the list has more tasks than the
49
+ 200 characters. `steps` (checklist items, in To Do order, each with `id`,
50
+ `title` and `checked`) appears only on tasks that have steps. `hasMore: true` means the list has more tasks than the
50
51
  limit. Use the task `id` with todo-update.
51
52
 
52
53
  ## Failures
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: To Do Update
3
- description: Complete, reopen, retitle, re-date or delete a task in one of the owner's Microsoft To Do lists (via the Microsoft grant held by Crewly Cloud).
4
- version: 1.0.0
3
+ description: Complete, reopen, retitle, re-date or delete a task — and add, tick, untick or remove its steps — in one of the owner's Microsoft To Do lists (via the Microsoft grant held by Crewly Cloud).
4
+ version: 1.1.0
5
5
  category: productivity
6
6
  skillType: claude-skill
7
7
  assignableRoles:
@@ -38,8 +38,18 @@ bash execute.sh --list Work --task <id> --title "Send v4 deck" --due 2026-10-03
38
38
  bash execute.sh --list Work --task <id> --due none # clear the due date
39
39
  bash execute.sh --list Work --task <id> --reopen
40
40
  bash execute.sh --list Work --task <id> --delete # cannot be undone
41
+ bash execute.sh --list Groceries --task <id> --add-steps "Butter,Ham"
42
+ bash execute.sh --list Groceries --task <id> --check-steps "Eggs,Milk" # tick steps
43
+ bash execute.sh --list Groceries --task <id> --uncheck-steps Eggs # untick
44
+ bash execute.sh --list Groceries --task <id> --remove-steps Bread # delete a step
41
45
  ```
42
46
 
47
+ Steps are named by title (case-insensitive) or by step id from todo-tasks.
48
+ `--add-step` / `--check-step` / `--uncheck-step` / `--remove-step` take one
49
+ step each and can be repeated, for a step whose title contains a comma.
50
+ Adding steps changes the existing task; it never creates a new one. A step
51
+ name that matches nothing (or two steps) fails before anything is changed.
52
+
43
53
  `--task` is the id from todo-tasks. `--list` is the list the task is in
44
54
  (name or id; the default list when omitted). Changes can be combined in one
45
55
  call; `--delete` ignores the others.
@@ -48,6 +58,7 @@ call; `--delete` ignores the others.
48
58
 
49
59
  ```json
50
60
  {"success":true,"list":"Groceries","task":{"id":"AAMk…","title":"Milk","status":"completed","completedAt":"2026-09-23"}}
61
+ {"success":true,"list":"Groceries","task":{"id":"AAMk…","title":"Costco","status":"notStarted","steps":[{"id":"…","title":"Eggs","checked":true},{"id":"…","title":"Butter","checked":false}]}}
51
62
  {"success":true,"deleted":true,"list":"Work","taskId":"AAMk…"}
52
63
  ```
53
64
 
@@ -10,6 +10,7 @@
10
10
  # bash execute.sh --list Work --task <taskId> --due none # clear the due date
11
11
  # bash execute.sh --list Work --task <taskId> --reopen
12
12
  # bash execute.sh --list Work --task <taskId> --delete
13
+ # bash execute.sh --list Groceries --task <taskId> --add-steps "Butter,Ham" --check-steps "Eggs"
13
14
  # bash execute.sh '{"list":"Work","task":"AAMk…","complete":true}'
14
15
  # =============================================================================
15
16
  set -euo pipefail
@@ -24,6 +25,7 @@ Usage:
24
25
  bash execute.sh --list Work --task <taskId> --due none # clear the due date
25
26
  bash execute.sh --list Work --task <taskId> --reopen
26
27
  bash execute.sh --list Work --task <taskId> --delete
28
+ bash execute.sh --list Groceries --task <taskId> --add-steps "Butter,Ham" --check-steps "Eggs"
27
29
  bash execute.sh '{"list":"Work","task":"AAMk…","complete":true}'
28
30
 
29
31
  Options:
@@ -36,6 +38,12 @@ Options:
36
38
  --note Replace the note
37
39
  --importance low | normal | high
38
40
  --delete Delete the task (cannot be undone)
41
+ --add-steps Comma-separated steps to append to the task
42
+ --check-steps Comma-separated steps to tick, by title (case-insensitive) or step id
43
+ --uncheck-steps Comma-separated steps to untick, by title or id
44
+ --remove-steps Comma-separated steps to delete, by title or id
45
+ --add-step, --check-step, --uncheck-step, --remove-step
46
+ One step each; repeat for more (use when a step contains a comma)
39
47
  --help | -h Show this help
40
48
  EOF_USAGE
41
49
  }
@@ -48,6 +56,17 @@ fail_from() {
48
56
 
49
57
  uri() { jq -rn --arg v "$1" '$v|@uri'; }
50
58
 
59
+ # Append step titles / ids to a JSON array: $1 = array, $2 = text, $3 =
60
+ # "split" to split the text on commas. Trimmed; empty ones are dropped.
61
+ add_steps() {
62
+ jq -c --arg v "$2" --arg mode "${3:-}" '. + (if $mode == "split" then ($v | split(",")) else [$v] end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0)))' <<<"$1"
63
+ }
64
+
65
+ # Step list from the JSON input: $1 = key; an array or a comma string.
66
+ input_steps() {
67
+ printf '%s' "$INPUT" | jq -c --arg k "$1" '.[$k] // [] | if type == "string" then split(",") else map(tostring) end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))'
68
+ }
69
+
51
70
  # api_call may print a one-line warning to stderr (no CREWLY_SESSION_NAME);
52
71
  # the backend answer is always the last line. On failure print the mapped
53
72
  # failure JSON (fail_from) and return 1.
@@ -63,6 +82,7 @@ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
63
82
  shift || true
64
83
  fi
65
84
  TASK=""; LIST=""; COMPLETE=""; TITLE=""; DUE=""; NOTE=""; IMPORTANCE=""; DELETE=""
85
+ ADD_STEPS='[]'; CHECK_STEPS='[]'; UNCHECK_STEPS='[]'; REMOVE_STEPS='[]'
66
86
  while [[ $# -gt 0 ]]; do
67
87
  case "$1" in
68
88
  --task) [ $# -ge 2 ] || error_exit "--task requires a value"; TASK="$2"; shift 2 ;;
@@ -74,6 +94,14 @@ while [[ $# -gt 0 ]]; do
74
94
  --note) [ $# -ge 2 ] || error_exit "--note requires a value"; NOTE="$2"; shift 2 ;;
75
95
  --importance) [ $# -ge 2 ] || error_exit "--importance requires a value"; IMPORTANCE="$2"; shift 2 ;;
76
96
  --delete) DELETE="1"; shift ;;
97
+ --add-steps) [ $# -ge 2 ] || error_exit "--add-steps requires a value"; ADD_STEPS=$(add_steps "$ADD_STEPS" "$2" split); shift 2 ;;
98
+ --add-step) [ $# -ge 2 ] || error_exit "--add-step requires a value"; ADD_STEPS=$(add_steps "$ADD_STEPS" "$2"); shift 2 ;;
99
+ --check-steps) [ $# -ge 2 ] || error_exit "--check-steps requires a value"; CHECK_STEPS=$(add_steps "$CHECK_STEPS" "$2" split); shift 2 ;;
100
+ --check-step) [ $# -ge 2 ] || error_exit "--check-step requires a value"; CHECK_STEPS=$(add_steps "$CHECK_STEPS" "$2"); shift 2 ;;
101
+ --uncheck-steps) [ $# -ge 2 ] || error_exit "--uncheck-steps requires a value"; UNCHECK_STEPS=$(add_steps "$UNCHECK_STEPS" "$2" split); shift 2 ;;
102
+ --uncheck-step) [ $# -ge 2 ] || error_exit "--uncheck-step requires a value"; UNCHECK_STEPS=$(add_steps "$UNCHECK_STEPS" "$2"); shift 2 ;;
103
+ --remove-steps) [ $# -ge 2 ] || error_exit "--remove-steps requires a value"; REMOVE_STEPS=$(add_steps "$REMOVE_STEPS" "$2" split); shift 2 ;;
104
+ --remove-step) [ $# -ge 2 ] || error_exit "--remove-step requires a value"; REMOVE_STEPS=$(add_steps "$REMOVE_STEPS" "$2"); shift 2 ;;
77
105
  --help|-h) print_usage; exit 0 ;;
78
106
  *) error_exit "Unknown option: $1" ;;
79
107
  esac
@@ -88,6 +116,10 @@ if [ -n "$INPUT_JSON" ]; then
88
116
  [ -z "$NOTE" ] && NOTE=$(printf '%s' "$INPUT" | jq -r '.note // empty')
89
117
  [ -z "$IMPORTANCE" ] && IMPORTANCE=$(printf '%s' "$INPUT" | jq -r '.importance // empty')
90
118
  [ -z "$DELETE" ] && DELETE=$(printf '%s' "$INPUT" | jq -r 'if .delete == true then "1" else empty end')
119
+ [ "$ADD_STEPS" = '[]' ] && ADD_STEPS=$(input_steps addSteps)
120
+ [ "$CHECK_STEPS" = '[]' ] && CHECK_STEPS=$(input_steps checkSteps)
121
+ [ "$UNCHECK_STEPS" = '[]' ] && UNCHECK_STEPS=$(input_steps uncheckSteps)
122
+ [ "$REMOVE_STEPS" = '[]' ] && REMOVE_STEPS=$(input_steps removeSteps)
91
123
  fi
92
124
  [ -n "$TASK" ] || error_exit "--task is required (ids come from todo-tasks)"
93
125
  if [ -n "$DELETE" ]; then
@@ -100,16 +132,22 @@ fi
100
132
  if [ -n "$DUE" ] && [ "$DUE" != "none" ] && ! [[ "$DUE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
101
133
  error_exit "--due must look like 2026-10-01, or none to clear it"
102
134
  fi
103
- if [ -z "$COMPLETE" ] && [ -z "$TITLE" ] && [ -z "$DUE" ] && [ -z "$NOTE" ] && [ -z "$IMPORTANCE" ]; then
104
- error_exit "nothing to change: give --complete, --reopen, --title, --due, --note, --importance or --delete"
135
+ STEP_CHANGES="${ADD_STEPS}${CHECK_STEPS}${UNCHECK_STEPS}${REMOVE_STEPS}"
136
+ if [ -z "$COMPLETE" ] && [ -z "$TITLE" ] && [ -z "$DUE" ] && [ -z "$NOTE" ] && [ -z "$IMPORTANCE" ] && [ "$STEP_CHANGES" = '[][][][]' ]; then
137
+ error_exit "nothing to change: give --complete, --reopen, --title, --due, --note, --importance, a step change or --delete"
105
138
  fi
106
139
  BODY=$(jq -cn --arg list "$LIST" --arg complete "$COMPLETE" --arg title "$TITLE" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" \
140
+ --argjson add "$ADD_STEPS" --argjson check "$CHECK_STEPS" --argjson uncheck "$UNCHECK_STEPS" --argjson remove "$REMOVE_STEPS" \
107
141
  '{}
108
142
  + (if $list != "" then {list: $list} else {} end)
109
143
  + (if $complete != "" then {complete: ($complete == "true")} else {} end)
110
144
  + (if $title != "" then {title: $title} else {} end)
111
145
  + (if $due == "none" then {due: null} elif $due != "" then {due: $due} else {} end)
112
146
  + (if $note != "" then {note: $note} else {} end)
113
- + (if $imp != "" then {importance: $imp} else {} end)')
147
+ + (if $imp != "" then {importance: $imp} else {} end)
148
+ + (if ($add | length) > 0 then {addSteps: $add} else {} end)
149
+ + (if ($check | length) > 0 then {checkSteps: $check} else {} end)
150
+ + (if ($uncheck | length) > 0 then {uncheckSteps: $uncheck} else {} end)
151
+ + (if ($remove | length) > 0 then {removeSteps: $remove} else {} end)')
114
152
  RESPONSE=$(call PATCH "/microsoft-todo/tasks/$(uri "$TASK")" "$BODY") || { printf '%s\n' "$RESPONSE"; exit 1; }
115
153
  printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task}'
@@ -75,6 +75,13 @@ check "json input" "$(last '[.path,.body]')" '["/api/microsoft-todo/tasks/T7",{"
75
75
  check "task required" "$(run_err --complete | jq -r .error)" "--task is required (ids come from todo-tasks)"
76
76
  check "nothing to change" "$(run_err --task T1 | jq -r .error | cut -c1-17)" "nothing to change"
77
77
  check "bad due" "$(run_err --task T1 --due 1/10 | jq -r .error)" "--due must look like 2026-10-01, or none to clear it"
78
+ run --list Groceries --task T1 --add-steps "Butter, Ham" --check-steps Eggs --uncheck-step "Milk, oat" --remove-steps Bread >/dev/null
79
+ check "steps: body" "$(last '[.method,.path,.body]')" '["PATCH","/api/microsoft-todo/tasks/T1",{"list":"Groceries","addSteps":["Butter","Ham"],"checkSteps":["Eggs"],"uncheckSteps":["Milk, oat"],"removeSteps":["Bread"]}]'
80
+ run --task T1 --add-step Butter >/dev/null
81
+ check "steps: a step change alone is a change" "$(last '.body')" '{"addSteps":["Butter"]}'
82
+ run '{"task":"T1","checkSteps":["Eggs"],"removeSteps":"Bread,Ham"}' >/dev/null
83
+ check "steps: json input" "$(last '.body')" '{"checkSteps":["Eggs"],"removeSteps":["Bread","Ham"]}'
84
+ check "steps: blank is still nothing to change" "$(run_err --task T1 --add-steps ' , ' | jq -r .error | cut -c1-17)" "nothing to change"
78
85
  OUT=$(run --list no-grant --task T1 --complete || true)
79
86
  check "not connected" "$(printf '%s' "$OUT" | jq -r .reason)" "not_connected"
80
87
 
@@ -118,10 +118,10 @@ export const SKILL_FILE_EXCLUDES: ReadonlyArray<RegExp> = [/\.test\./, /^mock-/,
118
118
  * never installed.
119
119
  *
120
120
  * Deliberately FLAT: files in subdirectories (e.g. remotion-video/templates/)
121
- * are not listed. The shipped CLI writes each listed file without creating
122
- * parent directories, so a nested path would fail the whole install on every
123
- * CLI released so far. List them only after the CLI creates parent dirs AND
124
- * the older CLIs are no longer in use.
121
+ * are not listed. CLIs released before #800 write each listed file without
122
+ * creating parent directories, so a nested path fails the whole install on
123
+ * them. The installers create parent dirs since #800; list nested files only
124
+ * once the older CLIs are no longer in use.
125
125
  *
126
126
  * @param skillDir - Absolute skill directory
127
127
  * @returns File names relative to the skill directory
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: Complete Task
3
- description: Mark a task as complete in the task management system.
4
- version: 1.0.0
3
+ description: Mark a WorkItem complete in the V3 task pool, with evidence.
4
+ version: 1.1.0
5
5
  category: management
6
6
  skillType: claude-skill
7
7
  assignableRoles:
@@ -24,18 +24,25 @@ execution:
24
24
 
25
25
  # Complete Task
26
26
 
27
- Mark a task as complete in the task management system.
27
+ Mark a WorkItem complete via `POST /api/task-pool/complete/:id`.
28
28
 
29
29
  ## Usage
30
30
 
31
31
  ```bash
32
- bash config/skills/orchestrator/complete-task/execute.sh '{"taskId":"task-123","result":"success"}'
32
+ bash config/skills/orchestrator/complete-task/execute.sh '{"workItemId":"wi-123","summary":"Shipped the report","evidence":[{"type":"artifact","path":"/abs/path/report.md"},{"type":"command","command":"npm test","exitCode":0}]}'
33
33
  ```
34
34
 
35
35
  ## Parameters
36
36
 
37
- Pass the full JSON body as expected by `POST /api/task-management/complete`.
37
+ | Parameter | Required | Description |
38
+ |-----------|----------|-------------|
39
+ | `workItemId` (alias `taskId`) | Yes | The WorkItem to complete |
40
+ | `summary` (alias `result`) | Yes | What was produced |
41
+ | `evidence` | Yes* | Evidence array (#873): `{"type":"artifact","path":…}` (must exist, or an https URL), `{"type":"command","command":…,"exitCode":0,"outputTail":…}`, or `{"type":"blocked","step":…,"reason":…}` (records the item as blocked, not done). *Accepted without it this release with a `warning`; required from the next |
42
+ | `output` | No | Structured output stored on the WorkItem before completion |
43
+ | `agentId` / `sessionName` | No | Who completed it (defaults to `crewly-orc`) |
38
44
 
39
45
  ## Output
40
46
 
41
- JSON confirmation of task completion.
47
+ The server's JSON response. A `warning` from the server (completion without
48
+ evidence) is repeated on stderr.
@@ -6,7 +6,15 @@
6
6
  # on the WorkItem (replaces `<taskId>.output.json`) before completion.
7
7
  #
8
8
  # Input shape:
9
- # { "workItemId": "abc-123", "summary": "...", "output"?: { ... } }
9
+ # { "workItemId": "abc-123", "summary": "...", "output"?: { ... },
10
+ # "evidence"?: [ {"type":"artifact","path":"..."} |
11
+ # {"type":"command","command":"...","exitCode":0,"outputTail":"..."} |
12
+ # {"type":"blocked","step":"...","reason":"..."} ] }
13
+ #
14
+ # `evidence` (#873) is sent as result.evidence. The server checks it: missing
15
+ # artifacts and non-zero exit codes are refused, a `blocked` entry records the
16
+ # item as blocked instead of done, and no evidence at all is accepted this
17
+ # release with a `warning` (refused from the next).
10
18
  #
11
19
  # Backwards-compat: a `taskId` field is accepted as alias for `workItemId`.
12
20
 
@@ -26,6 +34,11 @@ OUTPUT=$(printf '%s' "$INPUT" | jq -c '.output // empty')
26
34
  # work — pass that session name instead).
27
35
  AGENT_ID=$(printf '%s' "$INPUT" | jq -r '.agentId // .sessionName // "crewly-orc"')
28
36
 
37
+ EVIDENCE=$(printf '%s' "$INPUT" | jq -c '.evidence // empty')
38
+ if [ -n "$EVIDENCE" ] && [ "$(printf '%s' "$EVIDENCE" | jq -r 'type')" != "array" ]; then
39
+ error_exit "evidence must be a JSON array, e.g. [{\"type\":\"artifact\",\"path\":\"/abs/file\"}]"
40
+ fi
41
+
29
42
  require_param "workItemId" "$WORK_ITEM_ID"
30
43
 
31
44
  # Persist structured output on the WorkItem before completing, so that
@@ -47,6 +60,12 @@ fi
47
60
  COMPLETE_BODY=$(jq -n \
48
61
  --arg agentId "$AGENT_ID" \
49
62
  --arg summary "$SUMMARY" \
50
- '{agentId: $agentId, result: {summary: $summary}}')
63
+ --argjson evidence "${EVIDENCE:-null}" \
64
+ '{agentId: $agentId, result: ({summary: $summary} + (if $evidence != null then {evidence: $evidence} else {} end))}')
51
65
 
52
- api_call POST "/task-pool/complete/${WORK_ITEM_ID}" "$COMPLETE_BODY"
66
+ COMPLETE_RESPONSE=$(api_call POST "/task-pool/complete/${WORK_ITEM_ID}" "$COMPLETE_BODY")
67
+ printf '%s\n' "$COMPLETE_RESPONSE"
68
+ EVIDENCE_WARNING=$(printf '%s' "$COMPLETE_RESPONSE" | jq -r '.warning // empty' 2>/dev/null || true)
69
+ if [ -n "$EVIDENCE_WARNING" ]; then
70
+ jq -n --arg w "$EVIDENCE_WARNING" '{warning: $w}' >&2
71
+ fi
@@ -255,13 +255,13 @@ if [ "$USE_STRUCTURED" = "true" ] && [ -n "$TITLE" ]; then
255
255
 
256
256
  [ -n "$CONTEXT" ] && TASK_MESSAGE="${TASK_MESSAGE}\n\nAdditional context: ${CONTEXT}"
257
257
  [ -n "$DEADLINE_HINT" ] && TASK_MESSAGE="${TASK_MESSAGE}\n\n**Deadline hint**: ${DEADLINE_HINT}"
258
- TASK_MESSAGE="${TASK_MESSAGE}\n\n---\nWhen done, report back with report-status, passing the workItemId from your [CREWLY-DISPATCH] notice (or from get-my-tasks) so the right WorkItem is closed: bash ${CREWLY_ROOT}/config/skills/agent/core/report-status/execute.sh '{\"sessionName\":\"${TO}\",\"workItemId\":\"<your WorkItem id>\",\"status\":\"done\",\"summary\":\"<brief summary>\",\"projectPath\":\"${PROJECT_PATH}\"}'"
258
+ TASK_MESSAGE="${TASK_MESSAGE}\n\n---\nWhen done, report back with report-status, passing the workItemId from your [CREWLY-DISPATCH] notice (or from get-my-tasks) so the right WorkItem is closed: bash ${CREWLY_ROOT}/config/skills/agent/core/report-status/execute.sh '{\"sessionName\":\"${TO}\",\"workItemId\":\"<your WorkItem id>\",\"status\":\"done\",\"summary\":\"<brief summary>\",\"evidence\":[{\"type\":\"artifact\",\"path\":\"<file you produced>\"},{\"type\":\"command\",\"command\":\"<check you ran>\",\"exitCode\":0}],\"projectPath\":\"${PROJECT_PATH}\"}' — done needs evidence (files that exist, checks with exit code 0); if a step failed, send [{\"type\":\"blocked\",\"step\":\"<step>\",\"reason\":\"<why>\"}] instead, never done."
259
259
  TASK_MESSAGE="${TASK_MESSAGE}\n\nBefore reporting done, persist key findings using: bash ${CREWLY_ROOT}/config/skills/agent/core/remember/execute.sh '{\"agentId\":\"${TO}\",\"content\":\"<key findings>\",\"category\":\"pattern\",\"scope\":\"project\",\"projectPath\":\"${PROJECT_PATH}\"}'"
260
260
  else
261
261
  # Legacy free-text format (backwards compatible)
262
262
  TASK_MESSAGE="New task from orchestrator (priority: ${PRIORITY}):\n\n${TASK}"
263
263
  [ -n "$CONTEXT" ] && TASK_MESSAGE="${TASK_MESSAGE}\n\nContext: ${CONTEXT}"
264
- TASK_MESSAGE="${TASK_MESSAGE}\n\nWhen done, report back with report-status, passing the workItemId from your [CREWLY-DISPATCH] notice (or from get-my-tasks) so the right WorkItem is closed: bash ${CREWLY_ROOT}/config/skills/agent/core/report-status/execute.sh '{\"sessionName\":\"${TO}\",\"workItemId\":\"<your WorkItem id>\",\"status\":\"done\",\"summary\":\"<brief summary>\",\"projectPath\":\"${PROJECT_PATH}\"}'"
264
+ TASK_MESSAGE="${TASK_MESSAGE}\n\nWhen done, report back with report-status, passing the workItemId from your [CREWLY-DISPATCH] notice (or from get-my-tasks) so the right WorkItem is closed: bash ${CREWLY_ROOT}/config/skills/agent/core/report-status/execute.sh '{\"sessionName\":\"${TO}\",\"workItemId\":\"<your WorkItem id>\",\"status\":\"done\",\"summary\":\"<brief summary>\",\"evidence\":[{\"type\":\"artifact\",\"path\":\"<file you produced>\"},{\"type\":\"command\",\"command\":\"<check you ran>\",\"exitCode\":0}],\"projectPath\":\"${PROJECT_PATH}\"}' — done needs evidence (files that exist, checks with exit code 0); if a step failed, send [{\"type\":\"blocked\",\"step\":\"<step>\",\"reason\":\"<why>\"}] instead, never done."
265
265
  TASK_MESSAGE="${TASK_MESSAGE}\n\nBefore reporting done, persist key findings using: bash ${CREWLY_ROOT}/config/skills/agent/core/remember/execute.sh '{\"agentId\":\"${TO}\",\"content\":\"<key findings>\",\"category\":\"pattern\",\"scope\":\"project\",\"projectPath\":\"${PROJECT_PATH}\"}'"
266
266
  fi
267
267