crewly 1.20.192 → 1.20.194

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 (525) 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/experiment-card/SKILL.md +96 -0
  28. package/config/skills/agent/core/experiment-card/execute.sh +147 -0
  29. package/config/skills/agent/core/experiment-card/execute.test.sh +91 -0
  30. package/config/skills/agent/core/handoff-task/execute.sh +1 -1
  31. package/config/skills/agent/core/report-status/SKILL.md +27 -4
  32. package/config/skills/agent/core/report-status/execute.sh +104 -4
  33. package/config/skills/agent/core/todo-add/SKILL.md +16 -2
  34. package/config/skills/agent/core/todo-add/execute.sh +21 -5
  35. package/config/skills/agent/core/todo-add/execute.test.sh +14 -0
  36. package/config/skills/agent/core/todo-tasks/SKILL.md +4 -3
  37. package/config/skills/agent/core/todo-update/SKILL.md +13 -2
  38. package/config/skills/agent/core/todo-update/execute.sh +41 -3
  39. package/config/skills/agent/core/todo-update/execute.test.sh +7 -0
  40. package/config/skills/marketplace-registry.ts +4 -4
  41. package/config/skills/orchestrator/complete-task/SKILL.md +13 -6
  42. package/config/skills/orchestrator/complete-task/execute.sh +22 -3
  43. package/config/skills/orchestrator/delegate-task/execute.sh +2 -2
  44. package/config/skills/orchestrator/harness-login/SKILL.md +9 -1
  45. package/config/skills/orchestrator/harness-login/execute.sh +12 -4
  46. package/config/skills/orchestrator/harness-login/execute.test.sh +7 -0
  47. package/config/skills/registry.json +6 -5
  48. package/config/skills/team-leader/delegate-task/execute.sh +1 -1
  49. package/config/skills/team-leader/verify-output/SKILL.md +18 -1
  50. package/config/skills/team-leader/verify-output/execute.sh +28 -0
  51. package/config/skills/team-leader/verify-output/execute.test.sh +27 -0
  52. package/dist/backend/backend/src/constants.d.ts +192 -2
  53. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  54. package/dist/backend/backend/src/constants.js +196 -1
  55. package/dist/backend/backend/src/constants.js.map +1 -1
  56. package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts +6 -0
  57. package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts.map +1 -1
  58. package/dist/backend/backend/src/controllers/canva/canva.controller.js +13 -2
  59. package/dist/backend/backend/src/controllers/canva/canva.controller.js.map +1 -1
  60. package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
  61. package/dist/backend/backend/src/controllers/canva/canva.routes.js +3 -1
  62. package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
  63. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  64. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +4 -1
  65. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  66. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -0
  67. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
  68. package/dist/backend/backend/src/controllers/connector/connector.controller.js +32 -3
  69. package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
  70. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts +41 -0
  71. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -0
  72. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +75 -0
  73. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -0
  74. package/dist/backend/backend/src/controllers/experiments/experiments.routes.d.ts +27 -0
  75. package/dist/backend/backend/src/controllers/experiments/experiments.routes.d.ts.map +1 -0
  76. package/dist/backend/backend/src/controllers/experiments/experiments.routes.js +96 -0
  77. package/dist/backend/backend/src/controllers/experiments/experiments.routes.js.map +1 -0
  78. package/dist/backend/backend/src/controllers/google/google.controller.d.ts +6 -0
  79. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  80. package/dist/backend/backend/src/controllers/google/google.controller.js +19 -0
  81. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  82. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  83. package/dist/backend/backend/src/controllers/google/google.routes.js +3 -1
  84. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  85. package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts.map +1 -1
  86. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +22 -3
  87. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js.map +1 -1
  88. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +19 -2
  89. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -1
  90. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +37 -4
  91. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -1
  92. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
  93. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +3 -1
  94. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
  95. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +9 -0
  96. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  97. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +26 -0
  98. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  99. package/dist/backend/backend/src/controllers/people/people.routes.d.ts +25 -0
  100. package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -0
  101. package/dist/backend/backend/src/controllers/people/people.routes.js +90 -0
  102. package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -0
  103. package/dist/backend/backend/src/controllers/request-types.d.ts +2 -0
  104. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  105. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +22 -1
  106. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  107. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +143 -3
  108. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  109. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +25 -3
  110. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  111. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +125 -19
  112. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  113. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  114. package/dist/backend/backend/src/controllers/team/team.controller.js +14 -0
  115. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  116. package/dist/backend/backend/src/index.d.ts.map +1 -1
  117. package/dist/backend/backend/src/index.js +82 -3
  118. package/dist/backend/backend/src/index.js.map +1 -1
  119. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  120. package/dist/backend/backend/src/routes/api.routes.js +6 -0
  121. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  122. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +13 -0
  123. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  124. package/dist/backend/backend/src/services/agent/agent-registration.service.js +28 -3
  125. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  126. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +3 -0
  128. package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
  130. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  131. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +14 -3
  132. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  133. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
  134. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  135. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
  136. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  137. package/dist/backend/backend/src/services/agent/idle-detection.service.js +1 -1
  138. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  139. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
  140. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  141. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
  142. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  143. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
  144. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  145. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
  146. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  147. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
  148. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +49 -5
  150. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  151. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  152. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
  153. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  154. package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
  155. package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
  156. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  157. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  158. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  159. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts +17 -4
  160. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts.map +1 -1
  161. package/dist/backend/backend/src/services/canva/canva-token.service.js +54 -17
  162. package/dist/backend/backend/src/services/canva/canva-token.service.js.map +1 -1
  163. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +35 -0
  164. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  165. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +77 -1
  166. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  167. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +17 -2
  168. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -1
  169. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +30 -6
  170. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
  171. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +38 -2
  172. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
  173. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +63 -1
  174. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
  175. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
  176. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  177. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +204 -56
  178. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  179. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
  180. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  181. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  182. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  183. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +3 -0
  184. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  185. package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts +88 -0
  186. package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts.map +1 -0
  187. package/dist/backend/backend/src/services/experiments/experiment-verdict.js +226 -0
  188. package/dist/backend/backend/src/services/experiments/experiment-verdict.js.map +1 -0
  189. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +301 -0
  190. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -0
  191. package/dist/backend/backend/src/services/experiments/experiment.service.js +754 -0
  192. package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -0
  193. package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts +73 -0
  194. package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -0
  195. package/dist/backend/backend/src/services/experiments/experiment.wiring.js +142 -0
  196. package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -0
  197. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts +60 -0
  198. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts.map +1 -0
  199. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js +113 -0
  200. package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js.map +1 -0
  201. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +25 -2
  202. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
  203. package/dist/backend/backend/src/services/google/google-workspace-token.service.js +53 -7
  204. package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
  205. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +207 -0
  206. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
  207. package/dist/backend/backend/src/services/harness/claude-accounts.js +306 -0
  208. package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -0
  209. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
  210. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  211. package/dist/backend/backend/src/services/harness/harness-credentials.store.js +48 -0
  212. package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  213. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
  214. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  215. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +156 -19
  216. package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  217. package/dist/backend/backend/src/services/harness/harness.types.d.ts +2 -0
  218. package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
  219. package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
  220. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +19 -4
  221. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  222. package/dist/backend/backend/src/services/harness/login-broker.service.js +46 -7
  223. package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
  224. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts +18 -2
  225. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
  226. package/dist/backend/backend/src/services/harness/owner-login-request.js +31 -7
  227. package/dist/backend/backend/src/services/harness/owner-login-request.js.map +1 -1
  228. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
  229. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  230. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
  231. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  232. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +19 -0
  233. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  234. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +46 -0
  235. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  236. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
  237. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  238. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
  239. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  240. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +87 -5
  241. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -1
  242. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +151 -12
  243. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -1
  244. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +17 -4
  245. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -1
  246. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +50 -17
  247. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -1
  248. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts +53 -7
  249. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -1
  250. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js +77 -14
  251. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -1
  252. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +53 -1
  253. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
  254. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +130 -29
  255. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
  256. package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
  257. package/dist/backend/backend/src/services/orc/orc-status-router.service.js +3 -2
  258. package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
  259. package/dist/backend/backend/src/services/people/acting-for.service.d.ts +188 -0
  260. package/dist/backend/backend/src/services/people/acting-for.service.d.ts.map +1 -0
  261. package/dist/backend/backend/src/services/people/acting-for.service.js +299 -0
  262. package/dist/backend/backend/src/services/people/acting-for.service.js.map +1 -0
  263. package/dist/backend/backend/src/services/people/dedicated-agent.d.ts +89 -0
  264. package/dist/backend/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
  265. package/dist/backend/backend/src/services/people/dedicated-agent.js +113 -0
  266. package/dist/backend/backend/src/services/people/dedicated-agent.js.map +1 -0
  267. package/dist/backend/backend/src/services/people/grant-sharing.d.ts +80 -0
  268. package/dist/backend/backend/src/services/people/grant-sharing.d.ts.map +1 -0
  269. package/dist/backend/backend/src/services/people/grant-sharing.js +143 -0
  270. package/dist/backend/backend/src/services/people/grant-sharing.js.map +1 -0
  271. package/dist/backend/backend/src/services/people/people-directory.service.d.ts +239 -0
  272. package/dist/backend/backend/src/services/people/people-directory.service.d.ts.map +1 -0
  273. package/dist/backend/backend/src/services/people/people-directory.service.js +454 -0
  274. package/dist/backend/backend/src/services/people/people-directory.service.js.map +1 -0
  275. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  276. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
  277. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  278. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
  279. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  280. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -1
  281. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
  282. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +16 -2
  283. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
  284. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +60 -1
  285. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  286. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +140 -8
  287. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  288. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js +1 -1
  289. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js.map +1 -1
  290. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
  291. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  292. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
  293. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  294. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  295. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +12 -2
  296. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  297. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts +7 -1
  298. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts.map +1 -1
  299. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js +18 -3
  300. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js.map +1 -1
  301. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  302. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +3 -0
  303. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  304. package/dist/backend/backend/src/services/slack/slack-bot-ids.d.ts +33 -0
  305. package/dist/backend/backend/src/services/slack/slack-bot-ids.d.ts.map +1 -0
  306. package/dist/backend/backend/src/services/slack/slack-bot-ids.js +56 -0
  307. package/dist/backend/backend/src/services/slack/slack-bot-ids.js.map +1 -0
  308. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +22 -0
  309. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  310. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +70 -0
  311. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  312. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  313. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  314. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +46 -0
  315. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  316. package/dist/backend/backend/src/services/slack/slack.service.d.ts +6 -0
  317. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  318. package/dist/backend/backend/src/services/slack/slack.service.js +8 -0
  319. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  320. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts +105 -0
  321. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts.map +1 -0
  322. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js +238 -0
  323. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js.map +1 -0
  324. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  325. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +4 -0
  326. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  327. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +39 -12
  328. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -1
  329. package/dist/backend/backend/src/services/usage/usage-stats.service.js +61 -20
  330. package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -1
  331. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -0
  332. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  333. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +9 -0
  334. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  335. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +10 -0
  336. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  337. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +45 -2
  338. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  339. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  340. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  341. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  342. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  343. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -0
  344. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  345. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  346. package/dist/backend/backend/src/services/workflow/scheduler.service.js +3 -0
  347. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  348. package/dist/backend/backend/src/types/experiment.types.d.ts +153 -0
  349. package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -0
  350. package/dist/backend/backend/src/types/experiment.types.js +32 -0
  351. package/dist/backend/backend/src/types/experiment.types.js.map +1 -0
  352. package/dist/backend/backend/src/types/index.d.ts +12 -1
  353. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  354. package/dist/backend/backend/src/types/index.js.map +1 -1
  355. package/dist/backend/backend/src/types/messaging.types.d.ts +11 -0
  356. package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
  357. package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
  358. package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts +77 -0
  359. package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts.map +1 -0
  360. package/dist/backend/backend/src/types/v2/completion-evidence.types.js +119 -0
  361. package/dist/backend/backend/src/types/v2/completion-evidence.types.js.map +1 -0
  362. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +13 -0
  363. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  364. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  365. package/dist/backend/build-info.json +2 -2
  366. package/dist/backend/config/constants.d.ts +11 -0
  367. package/dist/backend/config/constants.d.ts.map +1 -1
  368. package/dist/backend/config/constants.js +11 -0
  369. package/dist/backend/config/constants.js.map +1 -1
  370. package/dist/cli/backend/src/constants.d.ts +192 -2
  371. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  372. package/dist/cli/backend/src/constants.js +196 -1
  373. package/dist/cli/backend/src/constants.js.map +1 -1
  374. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +13 -0
  375. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  376. package/dist/cli/backend/src/services/agent/agent-registration.service.js +28 -3
  377. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  378. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -1
  379. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js +3 -0
  380. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js.map +1 -1
  381. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
  382. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  383. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +14 -3
  384. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  385. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
  386. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  387. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
  388. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  389. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
  390. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  391. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
  392. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  393. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
  394. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  395. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
  396. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  397. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
  398. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  399. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +49 -5
  400. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  401. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  402. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
  403. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  404. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
  405. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
  406. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  407. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  408. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  409. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +35 -0
  410. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  411. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +77 -1
  412. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  413. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
  414. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  415. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +204 -56
  416. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  417. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
  418. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  419. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  420. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +207 -0
  421. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
  422. package/dist/cli/backend/src/services/harness/claude-accounts.js +306 -0
  423. package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -0
  424. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
  425. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  426. package/dist/cli/backend/src/services/harness/harness-credentials.store.js +48 -0
  427. package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  428. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
  429. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  430. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +156 -19
  431. package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  432. package/dist/cli/backend/src/services/harness/harness.types.d.ts +2 -0
  433. package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
  434. package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
  435. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +19 -4
  436. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  437. package/dist/cli/backend/src/services/harness/login-broker.service.js +46 -7
  438. package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
  439. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts +18 -2
  440. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
  441. package/dist/cli/backend/src/services/harness/owner-login-request.js +31 -7
  442. package/dist/cli/backend/src/services/harness/owner-login-request.js.map +1 -1
  443. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
  444. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  445. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
  446. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  447. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +19 -0
  448. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  449. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +46 -0
  450. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  451. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
  452. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  453. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
  454. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  455. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts +197 -0
  456. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -0
  457. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js +455 -0
  458. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -0
  459. package/dist/cli/backend/src/services/people/acting-for.service.d.ts +188 -0
  460. package/dist/cli/backend/src/services/people/acting-for.service.d.ts.map +1 -0
  461. package/dist/cli/backend/src/services/people/acting-for.service.js +299 -0
  462. package/dist/cli/backend/src/services/people/acting-for.service.js.map +1 -0
  463. package/dist/cli/backend/src/services/people/dedicated-agent.d.ts +89 -0
  464. package/dist/cli/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
  465. package/dist/cli/backend/src/services/people/dedicated-agent.js +113 -0
  466. package/dist/cli/backend/src/services/people/dedicated-agent.js.map +1 -0
  467. package/dist/cli/backend/src/services/people/people-directory.service.d.ts +239 -0
  468. package/dist/cli/backend/src/services/people/people-directory.service.d.ts.map +1 -0
  469. package/dist/cli/backend/src/services/people/people-directory.service.js +454 -0
  470. package/dist/cli/backend/src/services/people/people-directory.service.js.map +1 -0
  471. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
  472. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  473. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
  474. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  475. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
  476. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  477. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
  478. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  479. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  480. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +3 -0
  481. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  482. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +22 -0
  483. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  484. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +70 -0
  485. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  486. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  487. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  488. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +46 -0
  489. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  490. package/dist/cli/backend/src/services/slack/slack.service.d.ts +6 -0
  491. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  492. package/dist/cli/backend/src/services/slack/slack.service.js +8 -0
  493. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  494. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  495. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +4 -0
  496. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  497. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  498. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  499. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  500. package/dist/cli/backend/src/types/index.d.ts +12 -1
  501. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  502. package/dist/cli/backend/src/types/index.js.map +1 -1
  503. package/dist/cli/backend/src/types/messaging.types.d.ts +11 -0
  504. package/dist/cli/backend/src/types/messaging.types.d.ts.map +1 -1
  505. package/dist/cli/backend/src/types/messaging.types.js.map +1 -1
  506. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +13 -0
  507. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  508. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  509. package/dist/cli/cli/src/utils/marketplace.d.ts +21 -0
  510. package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
  511. package/dist/cli/cli/src/utils/marketplace.js +35 -1
  512. package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
  513. package/dist/cli/config/constants.d.ts +11 -0
  514. package/dist/cli/config/constants.d.ts.map +1 -1
  515. package/dist/cli/config/constants.js +11 -0
  516. package/dist/cli/config/constants.js.map +1 -1
  517. package/dist/cli/config/skills/marketplace-registry.d.ts +4 -4
  518. package/dist/cli/config/skills/marketplace-registry.js +4 -4
  519. package/frontend/dist/assets/{index-fc715ec3.css → index-5e967795.css} +1 -1
  520. package/frontend/dist/assets/{index-5b7af029.js → index-800118ca.js} +296 -296
  521. package/frontend/dist/index.html +2 -2
  522. package/package.json +1 -1
  523. package/packages/crewly-agent/src/runtime/tool-registry.test.ts +45 -0
  524. package/packages/crewly-agent/src/runtime/tool-registry.ts +40 -5
  525. package/packages/crewly-agent/src/test/isolated-home.test.ts +24 -0
@@ -0,0 +1,147 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # experiment-card — attach an experiment to an optimisation ticket; Crewly
4
+ # captures the baseline when it ships and measures it when the window ends.
5
+ #
6
+ # Backed by /api/experiments (specs/experiment-cards.md, issue #986).
7
+ #
8
+ # Usage:
9
+ # bash execute.sh create --hypothesis "…" --source gsc|ga4 --measure M --config /abs/seo-ops.config.json
10
+ # [--page P] [--page-match exact|contains] [--query Q] [--query-match exact|contains]
11
+ # [--event NAME] [--channel all] [--label "…"] [--title "…"]
12
+ # [--from A] [--to B] [--direction increase|decrease] [--window-days 14]
13
+ # [--confidence 0.6] [--project P --ticket ID | --tkt TKT-12]
14
+ # bash execute.sh ship --id EXP-3 [--shipped-at ISO]
15
+ # bash execute.sh show --id EXP-3
16
+ # bash execute.sh list [--status planned|running|done|cancelled] [--ticket ID]
17
+ # bash execute.sh measure --id EXP-3
18
+ # bash execute.sh cancel --id EXP-3 [--reason "…"]
19
+ # bash execute.sh '{"action":"create","hypothesis":"…","metric":{…},"ticket":{…}}'
20
+ # =============================================================================
21
+ set -euo pipefail
22
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
+ source "${SCRIPT_DIR}/../../_common/lib.sh"
24
+
25
+ print_usage() {
26
+ cat <<'EOF_USAGE'
27
+ Usage:
28
+ bash execute.sh create --hypothesis "change X → metric Y from a to b" --source gsc|ga4 --measure M
29
+ --config /abs/path/seo-ops.config.json [filters] [--from A] [--to B]
30
+ [--window-days 14] [--confidence 0.6] [--project P --ticket ID | --tkt TKT-12]
31
+ gsc measures: clicks impressions ctr position (filters: --page URL --query Q, --page-match/--query-match exact|contains)
32
+ ga4 measures: sessions events (filters: --page /path, --event NAME, --channel all)
33
+ bash execute.sh ship --id EXP-3 [--shipped-at ISO] The change is live (automatic when the ticket is done)
34
+ bash execute.sh show --id EXP-3 Card, baseline, result and timeline
35
+ bash execute.sh list [--status S] [--ticket ID]
36
+ bash execute.sh measure --id EXP-3 Measure now (only once it is due)
37
+ bash execute.sh cancel --id EXP-3 [--reason "…"]
38
+ EOF_USAGE
39
+ }
40
+
41
+ ACTION=""; ID=""; JSON_BODY=""
42
+ HYPOTHESIS=""; TITLE=""; SOURCE=""; MEASURE=""; CONFIG=""; PAGE=""; PAGE_MATCH=""; QUERY=""; QUERY_MATCH=""
43
+ EVENT=""; CHANNEL=""; LABEL=""; FROM=""; TO=""; DIRECTION=""; WINDOW=""; CONFIDENCE=""; PROJECT=""; TICKET=""; TKT=""
44
+ SHIPPED_AT=""; STATUS=""; REASON=""
45
+
46
+ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
47
+ J=$(read_json_input "$1"); shift
48
+ ACTION=$(printf '%s' "$J" | jq -r '.action // empty')
49
+ ID=$(printf '%s' "$J" | jq -r '.id // empty')
50
+ SHIPPED_AT=$(printf '%s' "$J" | jq -r '.shippedAt // empty')
51
+ STATUS=$(printf '%s' "$J" | jq -r '.status // empty')
52
+ REASON=$(printf '%s' "$J" | jq -r '.reason // empty')
53
+ TICKET=$(printf '%s' "$J" | jq -r 'if (.ticket|type) == "string" then .ticket else empty end')
54
+ JSON_BODY=$(printf '%s' "$J" | jq -c 'del(.action, .id, .shippedAt, .status, .reason)')
55
+ fi
56
+ if [[ -z "$ACTION" && $# -gt 0 && ${1:0:1} != '-' ]]; then ACTION="$1"; shift; fi
57
+
58
+ while [[ $# -gt 0 ]]; do
59
+ case "$1" in
60
+ --id) [ $# -ge 2 ] || error_exit "--id requires a value"; ID="$2"; shift 2 ;;
61
+ --hypothesis) [ $# -ge 2 ] || error_exit "--hypothesis requires a value"; HYPOTHESIS="$2"; shift 2 ;;
62
+ --title) [ $# -ge 2 ] || error_exit "--title requires a value"; TITLE="$2"; shift 2 ;;
63
+ --source) [ $# -ge 2 ] || error_exit "--source requires a value"; SOURCE="$2"; shift 2 ;;
64
+ --measure) [ $# -ge 2 ] || error_exit "--measure requires a value"; MEASURE="$2"; shift 2 ;;
65
+ --config) [ $# -ge 2 ] || error_exit "--config requires a value"; CONFIG="$2"; shift 2 ;;
66
+ --page) [ $# -ge 2 ] || error_exit "--page requires a value"; PAGE="$2"; shift 2 ;;
67
+ --page-match) [ $# -ge 2 ] || error_exit "--page-match requires a value"; PAGE_MATCH="$2"; shift 2 ;;
68
+ --query) [ $# -ge 2 ] || error_exit "--query requires a value"; QUERY="$2"; shift 2 ;;
69
+ --query-match) [ $# -ge 2 ] || error_exit "--query-match requires a value"; QUERY_MATCH="$2"; shift 2 ;;
70
+ --event) [ $# -ge 2 ] || error_exit "--event requires a value"; EVENT="$2"; shift 2 ;;
71
+ --channel) [ $# -ge 2 ] || error_exit "--channel requires a value"; CHANNEL="$2"; shift 2 ;;
72
+ --label) [ $# -ge 2 ] || error_exit "--label requires a value"; LABEL="$2"; shift 2 ;;
73
+ --from) [ $# -ge 2 ] || error_exit "--from requires a value"; FROM="$2"; shift 2 ;;
74
+ --to) [ $# -ge 2 ] || error_exit "--to requires a value"; TO="$2"; shift 2 ;;
75
+ --direction) [ $# -ge 2 ] || error_exit "--direction requires a value"; DIRECTION="$2"; shift 2 ;;
76
+ --window-days) [ $# -ge 2 ] || error_exit "--window-days requires a value"; WINDOW="$2"; shift 2 ;;
77
+ --confidence) [ $# -ge 2 ] || error_exit "--confidence requires a value"; CONFIDENCE="$2"; shift 2 ;;
78
+ --project|-p) [ $# -ge 2 ] || error_exit "--project requires a value"; PROJECT="$2"; shift 2 ;;
79
+ --ticket) [ $# -ge 2 ] || error_exit "--ticket requires a value"; TICKET="$2"; shift 2 ;;
80
+ --tkt) [ $# -ge 2 ] || error_exit "--tkt requires a value"; TKT="$2"; shift 2 ;;
81
+ --shipped-at) [ $# -ge 2 ] || error_exit "--shipped-at requires a value"; SHIPPED_AT="$2"; shift 2 ;;
82
+ --status) [ $# -ge 2 ] || error_exit "--status requires a value"; STATUS="$2"; shift 2 ;;
83
+ --reason) [ $# -ge 2 ] || error_exit "--reason requires a value"; REASON="$2"; shift 2 ;;
84
+ --help|-h) print_usage; exit 0 ;;
85
+ *) error_exit "Unknown option: $1" ;;
86
+ esac
87
+ done
88
+
89
+ enc() { jq -rn --arg v "$1" '$v|@uri'; }
90
+ CARD='{id, status, title, hypothesis, metric: (.metric | {source, measure, page, query, event, label} | with_entries(select(.value != null))), windowDays, ticket, shippedAt, dueAt, baseline: (.baseline.total // null), result: (.result.total // null), verdict, verdictReason, lastError, traceId}'
91
+
92
+ case "$ACTION" in
93
+ create)
94
+ if [ -n "$JSON_BODY" ] && [ "$JSON_BODY" != "{}" ]; then
95
+ BODY="$JSON_BODY"
96
+ else
97
+ require_param "hypothesis (--hypothesis)" "$HYPOTHESIS"
98
+ require_param "source (--source gsc|ga4)" "$SOURCE"
99
+ require_param "measure (--measure)" "$MEASURE"
100
+ require_param "config (--config, the seo-ops site config)" "$CONFIG"
101
+ if [ -n "$TICKET" ] && [ -z "$PROJECT" ]; then error_exit "--ticket needs --project (or use --tkt TKT-n for a harness ticket)"; fi
102
+ BODY=$(jq -cn \
103
+ --arg h "$HYPOTHESIS" --arg t "$TITLE" --arg s "$SOURCE" --arg m "$MEASURE" --arg c "$CONFIG" \
104
+ --arg page "$PAGE" --arg pm "$PAGE_MATCH" --arg q "$QUERY" --arg qm "$QUERY_MATCH" --arg ev "$EVENT" \
105
+ --arg ch "$CHANNEL" --arg lb "$LABEL" --arg from "$FROM" --arg to "$TO" --arg dir "$DIRECTION" \
106
+ --arg win "$WINDOW" --arg conf "$CONFIDENCE" --arg proj "$PROJECT" --arg tic "$TICKET" --arg tkt "$TKT" '
107
+ def opt($k; $v): if $v == "" then {} else {($k): $v} end;
108
+ {hypothesis: $h}
109
+ + opt("title"; $t)
110
+ + {metric: ({source: $s, measure: $m, config: $c}
111
+ + opt("page"; $page) + opt("pageMatch"; $pm) + opt("query"; $q) + opt("queryMatch"; $qm)
112
+ + opt("event"; $ev) + opt("channel"; $ch) + opt("label"; $lb))}
113
+ + (if $from == "" and $to == "" then {} else {expected: (opt("from"; $from) + opt("to"; $to))} end)
114
+ + opt("direction"; $dir) + opt("windowDays"; $win) + opt("confidence"; $conf)
115
+ + (if $tkt != "" then {ticket: {kind: "harness", id: $tkt}}
116
+ elif $tic != "" then {ticket: {kind: "project", project: $proj, id: $tic}}
117
+ else {} end)')
118
+ fi
119
+ api_call POST "/experiments" "$BODY" | jq "{success, experiment: (.data | ${CARD})}"
120
+ ;;
121
+ ship)
122
+ require_param "id (--id EXP-n)" "$ID"
123
+ BODY=$(jq -cn --arg at "$SHIPPED_AT" 'if $at == "" then {} else {shippedAt: $at} end')
124
+ api_call POST "/experiments/$(enc "$ID")/ship" "$BODY" | jq "{success, experiment: (.data | ${CARD})}"
125
+ ;;
126
+ show)
127
+ require_param "id (--id EXP-n)" "$ID"
128
+ api_call GET "/experiments/$(enc "$ID")" | jq "{success, experiment: (.data | ${CARD} + {timeline})}"
129
+ ;;
130
+ list)
131
+ QS=""
132
+ [ -n "$STATUS" ] && QS="status=$(enc "$STATUS")"
133
+ [ -n "$TICKET" ] && QS="${QS:+$QS&}ticket=$(enc "$TICKET")"
134
+ api_call GET "/experiments${QS:+?$QS}" | jq "{success, experiments: [.data[] | ${CARD}]}"
135
+ ;;
136
+ measure)
137
+ require_param "id (--id EXP-n)" "$ID"
138
+ api_call POST "/experiments/$(enc "$ID")/measure" '{}' | jq "{success, experiment: (.data | ${CARD})}"
139
+ ;;
140
+ cancel)
141
+ require_param "id (--id EXP-n)" "$ID"
142
+ BODY=$(jq -cn --arg r "$REASON" 'if $r == "" then {} else {reason: $r} end')
143
+ api_call POST "/experiments/$(enc "$ID")/cancel" "$BODY" | jq "{success, experiment: (.data | ${CARD})}"
144
+ ;;
145
+ ""|help) print_usage; [ -n "$ACTION" ] || exit 1 ;;
146
+ *) error_exit "Unknown action: $ACTION (create, ship, show, list, measure, cancel)" ;;
147
+ esac
@@ -0,0 +1,91 @@
1
+ #!/bin/bash
2
+ # Tests for experiment-card — run with: bash execute.test.sh
3
+ # A python HTTP stub plays the backend; asserts the calls and the output.
4
+ set -u
5
+ HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ EXEC="$HERE/execute.sh"
7
+ PASS=0; FAIL=0
8
+ check() {
9
+ local name="$1"; local got="$2"; local want="$3"
10
+ if [ "$got" = "$want" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); echo "FAIL: $name"; echo " want: $want"; echo " got: $got"; fi
11
+ }
12
+
13
+ PORT=18853
14
+ STUB_LOG="$(mktemp)"; export STUB_LOG; export STUB_PORT="$PORT"
15
+ python3 -u <<'PY' >/dev/null 2>&1 &
16
+ from http.server import BaseHTTPRequestHandler, HTTPServer
17
+ import json, os
18
+ LOG = os.environ['STUB_LOG']; PORT = int(os.environ['STUB_PORT'])
19
+ E = {'id': 'EXP-1', 'traceId': 'exp:EXP-1', 'status': 'planned', 'title': 'T', 'hypothesis': 'H',
20
+ 'metric': {'source': 'gsc', 'measure': 'clicks', 'config': '/c.json', 'page': 'https://x/'}, 'windowDays': 14,
21
+ 'baseline': {'total': 100, 'days': [1, 2]}, 'timeline': [{'at': 'a', 'event': 'created'}], 'createdBy': 'ella'}
22
+ class H(BaseHTTPRequestHandler):
23
+ def reply(self, code, obj):
24
+ self.send_response(code); self.send_header('Content-Type', 'application/json'); self.end_headers()
25
+ self.wfile.write(json.dumps(obj).encode())
26
+ def record(self, body=None):
27
+ open(LOG, 'w').write(json.dumps({'method': self.command, 'path': self.path, 'body': body, 'agent': self.headers.get('X-Agent-Session')}))
28
+ def do_GET(self):
29
+ self.record()
30
+ if self.path.startswith('/api/experiments/'):
31
+ return self.reply(200, {'success': True, 'data': E})
32
+ return self.reply(200, {'success': True, 'data': [E, dict(E, id='EXP-2', status='done', verdict='worked')]})
33
+ def do_POST(self):
34
+ n = int(self.headers.get('content-length', '0')); body = json.loads(self.rfile.read(n).decode() or '{}')
35
+ self.record(body)
36
+ if self.path.endswith('/measure'):
37
+ return self.reply(409, {'success': False, 'error': 'EXP-1 is not due until 2026-10-28'})
38
+ return self.reply(200, {'success': True, 'data': E})
39
+ def log_message(self, *a, **k): pass
40
+ HTTPServer(('127.0.0.1', PORT), H).serve_forever()
41
+ PY
42
+ STUB_PID=$!
43
+ disown "$STUB_PID" 2>/dev/null || true
44
+ trap 'kill "$STUB_PID" >/dev/null 2>&1; rm -f "$STUB_LOG"' EXIT
45
+ for i in $(seq 1 30); do curl -s -o /dev/null -m 0.2 "http://127.0.0.1:${PORT}/" 2>/dev/null && break; sleep 0.1; done
46
+
47
+ run() { CREWLY_SESSION_NAME=ella CREWLY_API_URL="http://127.0.0.1:${PORT}" bash "$EXEC" "$@" 2>/dev/null; }
48
+ run_err() { CREWLY_SESSION_NAME=ella CREWLY_API_URL="http://127.0.0.1:${PORT}" bash "$EXEC" "$@" 2>&1 >/dev/null; }
49
+ last() { jq -r "$1" "$STUB_LOG"; }
50
+
51
+ # --- create on a project ticket: metric, expectation, window ---
52
+ OUT=$(run create --hypothesis "FAQ schema → clicks 100 to 140" --source gsc --measure clicks --config /c.json \
53
+ --page https://x/ --from 100 --to 140 --window-days 21 --project ce --ticket T-12)
54
+ check "create: path" "$(last .path)" "/api/experiments"
55
+ check "create: body" "$(last '.body | tostring')" '{"hypothesis":"FAQ schema → clicks 100 to 140","metric":{"source":"gsc","measure":"clicks","config":"/c.json","page":"https://x/"},"expected":{"from":"100","to":"140"},"windowDays":"21","ticket":{"kind":"project","project":"ce","id":"T-12"}}'
56
+ check "create: agent header" "$(last .agent)" "ella"
57
+ check "create: card" "$(printf '%s' "$OUT" | jq -c '.experiment | [.id, .baseline, .metric.page]')" '["EXP-1",100,"https://x/"]'
58
+
59
+ # --- create on a harness ticket with GA4 form events ---
60
+ run create --hypothesis "Shorter form" --source ga4 --measure events --event generate_lead --channel all --config /c.json --tkt TKT-40 >/dev/null
61
+ check "create ga4: body" "$(last '.body | tostring')" '{"hypothesis":"Shorter form","metric":{"source":"ga4","measure":"events","config":"/c.json","event":"generate_lead","channel":"all"},"ticket":{"kind":"harness","id":"TKT-40"}}'
62
+
63
+ # --- create from JSON passes the body through ---
64
+ run '{"action":"create","hypothesis":"J","metric":{"source":"gsc","measure":"ctr","config":"/c.json"}}' >/dev/null
65
+ check "create json: body" "$(last '.body | tostring')" '{"hypothesis":"J","metric":{"source":"gsc","measure":"ctr","config":"/c.json"}}'
66
+
67
+ # --- missing params / a ticket without its project ---
68
+ check "create: missing" "$(run_err create --hypothesis h --source gsc --measure clicks | grep -c 'config')" "1"
69
+ check "create: ticket w/o project" "$(run_err create --hypothesis h --source gsc --measure clicks --config /c --ticket T-1 | grep -c 'needs --project')" "1"
70
+
71
+ # --- ship / show / list / cancel ---
72
+ run ship --id EXP-1 --shipped-at 2026-10-01T10:00:00Z >/dev/null
73
+ check "ship: path" "$(last .path)" "/api/experiments/EXP-1/ship"
74
+ check "ship: body" "$(last '.body | tostring')" '{"shippedAt":"2026-10-01T10:00:00Z"}'
75
+ OUT=$(run show --id EXP-1)
76
+ check "show: timeline" "$(printf '%s' "$OUT" | jq -c '.experiment.timeline | map(.event)')" '["created"]'
77
+ OUT=$(run list --status done --ticket TKT-40)
78
+ check "list: path" "$(last .path)" "/api/experiments?status=done&ticket=TKT-40"
79
+ check "list: rows" "$(printf '%s' "$OUT" | jq -c '[.experiments[] | [.id, .verdict]]')" '[["EXP-1",null],["EXP-2","worked"]]'
80
+ run cancel --id EXP-1 --reason dup >/dev/null
81
+ check "cancel: body" "$(last '.body | tostring')" '{"reason":"dup"}'
82
+
83
+ # --- measure refused before it is due: the error reaches the agent ---
84
+ check "measure: not due" "$(run_err measure --id EXP-1 | grep -c 'not due')" "1"
85
+
86
+ # --- unknown action / option ---
87
+ check "unknown action" "$(run_err frobnicate | grep -c 'Unknown action')" "1"
88
+ check "unknown option" "$(run_err list --nope | grep -c 'Unknown option')" "1"
89
+
90
+ echo "experiment-card: $PASS passed, $FAIL failed"
91
+ [ "$FAIL" -eq 0 ]
@@ -128,7 +128,7 @@ fi
128
128
  cat >> "$HANDOFF_MSG_FILE" << FOOTER_EOF
129
129
 
130
130
  ---
131
- When 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}"}'
131
+ When 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.
132
132
  FOOTER_EOF
133
133
 
134
134
  HANDOFF_MESSAGE=$(cat "$HANDOFF_MSG_FILE")
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: Report Status
3
3
  description: Proactively notify the orchestrator when a task is done, blocked, or failed.
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  category: task-management
6
6
  skillType: claude-skill
7
7
  assignableRoles:
@@ -59,6 +59,24 @@ Pass the `workItemId` of the work you are reporting on (from your `[CREWLY-DISPA
59
59
  | `--structured` | `structured` | No | Use structured StatusReport format |
60
60
  | `--work-item-id` / `--wi-id` | `workItemId` | **Pass this when `status` is `done`, `blocked` or `failed`** | Which WorkItem to complete, block or fail. See below — without it the skill infers, and refuses when the choice is ambiguous |
61
61
 
62
+ ### Evidence (status `done`) — #873
63
+
64
+ "Done" needs evidence. Add one or more of:
65
+
66
+ | Flag | JSON | Entry sent |
67
+ |------|------|------------|
68
+ | `--artifact <path>` (repeatable) | — | `{"type":"artifact","path":…}` — absolute, relative to your worktree/project, or an `https://` URL. Must exist on the server. |
69
+ | `--command <cmd> --exit-code <n> [--output-tail <text>]` (repeatable group) | — | `{"type":"command","command":…,"exitCode":n,"outputTail":…}` — `exitCode` must be 0 |
70
+ | `--blocked-step <step> --blocked-reason <why>` | — | `{"type":"blocked",…}` — the WorkItem is recorded as **blocked**, not done |
71
+ | `--evidence '<json array>'` | `evidence` | The raw array, sent ahead of any flag entries |
72
+
73
+ The server rejects (400) a missing artifact, a non-zero exit code, or a
74
+ malformed entry; the skill then prints `{"warning":"… completing the WorkItem
75
+ FAILED …","error":…}` with the reason. Without any evidence, `done` is accepted
76
+ **this release** with a `warning` on stderr; from the next release it is
77
+ refused. If you could not finish, report `--status blocked` (or `done` with
78
+ `--blocked-step/--blocked-reason`), never `done`.
79
+
62
80
  ## This skill COMPLETES a WorkItem, not just reports
63
81
 
64
82
  When `status=done`, this skill closes a WorkItem in the task pool as a side
@@ -93,8 +111,13 @@ the skill refuses instead of guessing.
93
111
  ## Examples — CLI Flags (preferred)
94
112
 
95
113
  ```bash
96
- # Report done
97
- bash execute.sh --session dev-1 --status done --summary "Finished auth module, all tests pass" --project /path/to/project
114
+ # Report done, with evidence
115
+ bash execute.sh --session dev-1 --status done --summary "Finished auth module, all tests pass" --project /path/to/project \
116
+ --work-item-id <id> --artifact src/auth.ts --command "npx jest src/auth" --exit-code 0 --output-tail "Tests: 14 passed"
117
+
118
+ # Could not finish one step: recorded as blocked, not done
119
+ bash execute.sh --session dev-1 --status done --summary "Auth module written; e2e blocked" --work-item-id <id> \
120
+ --blocked-step "npx playwright test" --blocked-reason "staging login returns 503"
98
121
 
99
122
  # Report a blocker
100
123
  bash execute.sh --session dev-1 --status blocked --summary "Waiting on API credentials from ops team"
@@ -119,7 +142,7 @@ bash execute.sh --session dev-1 --status done --summary-file /tmp/summary.txt --
119
142
  ## Examples — Legacy JSON (backward compatible)
120
143
 
121
144
  ```bash
122
- bash execute.sh '{"sessionName":"dev-1","status":"done","summary":"Finished implementing auth module","workItemId":"<your WorkItem id>"}'
145
+ bash execute.sh '{"sessionName":"dev-1","status":"done","summary":"Finished implementing auth module","workItemId":"<your WorkItem id>","evidence":[{"type":"command","command":"npm test","exitCode":0}]}'
123
146
  ```
124
147
 
125
148
  ## Output
@@ -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)'