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.
- package/config/constants.ts +11 -0
- package/config/hooks/subagent-guard/subagent.sh +113 -0
- package/config/roles/architect/prompt.md +1 -1
- package/config/roles/auditor/prompt.md +1 -1
- package/config/roles/backend-developer/prompt.md +1 -1
- package/config/roles/content-strategist/prompt.md +2 -2
- package/config/roles/designer/prompt.md +1 -1
- package/config/roles/developer/prompt.md +2 -2
- package/config/roles/frontend-developer/prompt.md +1 -1
- package/config/roles/fullstack-dev/prompt.md +1 -1
- package/config/roles/generalist/prompt.md +1 -1
- package/config/roles/ops/prompt.md +1 -1
- package/config/roles/orchestrator/prompt.md +2 -2
- package/config/roles/product-manager/prompt.md +1 -1
- package/config/roles/qa/prompt.md +1 -1
- package/config/roles/qa-engineer/prompt.md +1 -1
- package/config/roles/researcher/prompt.md +1 -1
- package/config/roles/sales/prompt.md +1 -1
- package/config/roles/support/prompt.md +1 -1
- package/config/roles/team-leader/prompt.md +1 -1
- package/config/roles/tpm/prompt.md +1 -1
- package/config/roles/ux-designer/prompt.md +1 -1
- package/config/skills/_common/complete-body-shape.test.sh +17 -0
- package/config/skills/agent/core/complete-task/SKILL.md +27 -4
- package/config/skills/agent/core/complete-task/execute.sh +23 -3
- package/config/skills/agent/core/complete-task/execute.test.sh +34 -0
- package/config/skills/agent/core/handoff-task/execute.sh +1 -1
- package/config/skills/agent/core/report-status/SKILL.md +27 -4
- package/config/skills/agent/core/report-status/execute.sh +104 -4
- package/config/skills/agent/core/todo-add/SKILL.md +16 -2
- package/config/skills/agent/core/todo-add/execute.sh +21 -5
- package/config/skills/agent/core/todo-add/execute.test.sh +14 -0
- package/config/skills/agent/core/todo-tasks/SKILL.md +4 -3
- package/config/skills/agent/core/todo-update/SKILL.md +13 -2
- package/config/skills/agent/core/todo-update/execute.sh +41 -3
- package/config/skills/agent/core/todo-update/execute.test.sh +7 -0
- package/config/skills/marketplace-registry.ts +4 -4
- package/config/skills/orchestrator/complete-task/SKILL.md +13 -6
- package/config/skills/orchestrator/complete-task/execute.sh +22 -3
- package/config/skills/orchestrator/delegate-task/execute.sh +2 -2
- package/config/skills/orchestrator/harness-login/SKILL.md +9 -1
- package/config/skills/orchestrator/harness-login/execute.sh +12 -4
- package/config/skills/orchestrator/harness-login/execute.test.sh +7 -0
- package/config/skills/team-leader/delegate-task/execute.sh +1 -1
- package/config/skills/team-leader/verify-output/SKILL.md +18 -1
- package/config/skills/team-leader/verify-output/execute.sh +28 -0
- package/config/skills/team-leader/verify-output/execute.test.sh +27 -0
- package/dist/backend/backend/src/constants.d.ts +135 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +136 -1
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts +6 -0
- package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.controller.js +13 -2
- package/dist/backend/backend/src/controllers/canva/canva.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.js +3 -1
- package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +4 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -0
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.js +32 -3
- package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts +41 -0
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +75 -0
- package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +6 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.js +19 -0
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js +3 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +22 -3
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +19 -2
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +37 -4
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +3 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +9 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +26 -0
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/people/people.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/people/people.routes.js +90 -0
- package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts +2 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +22 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +143 -3
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +25 -3
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +125 -19
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +14 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +44 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +3 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +13 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +28 -3
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +14 -3
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +49 -5
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
- package/dist/backend/backend/src/services/canva/canva-token.service.d.ts +17 -4
- package/dist/backend/backend/src/services/canva/canva-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/canva/canva-token.service.js +49 -17
- package/dist/backend/backend/src/services/canva/canva-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +24 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +52 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +17 -2
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +30 -6
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +38 -2
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +63 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +204 -56
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +3 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +25 -2
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js +48 -7
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +207 -0
- package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-accounts.js +306 -0
- package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js +48 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js +156 -19
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.types.d.ts +2 -0
- package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +19 -4
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/login-broker.service.js +46 -7
- package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/owner-login-request.d.ts +18 -2
- package/dist/backend/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/owner-login-request.js +31 -7
- package/dist/backend/backend/src/services/harness/owner-login-request.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
- package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +29 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +87 -5
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +151 -12
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +17 -4
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +45 -17
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts +53 -7
- package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js +77 -14
- package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +53 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +130 -29
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/people/acting-for.service.d.ts +151 -0
- package/dist/backend/backend/src/services/people/acting-for.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/people/acting-for.service.js +224 -0
- package/dist/backend/backend/src/services/people/acting-for.service.js.map +1 -0
- package/dist/backend/backend/src/services/people/dedicated-agent.d.ts +89 -0
- package/dist/backend/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
- package/dist/backend/backend/src/services/people/dedicated-agent.js +113 -0
- package/dist/backend/backend/src/services/people/dedicated-agent.js.map +1 -0
- package/dist/backend/backend/src/services/people/grant-sharing.d.ts +79 -0
- package/dist/backend/backend/src/services/people/grant-sharing.d.ts.map +1 -0
- package/dist/backend/backend/src/services/people/grant-sharing.js +135 -0
- package/dist/backend/backend/src/services/people/grant-sharing.js.map +1 -0
- package/dist/backend/backend/src/services/people/people-directory.service.d.ts +181 -0
- package/dist/backend/backend/src/services/people/people-directory.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/people/people-directory.service.js +317 -0
- package/dist/backend/backend/src/services/people/people-directory.service.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
- package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +16 -2
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +60 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +140 -8
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +12 -2
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts +7 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js +18 -3
- package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +3 -0
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +46 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts +105 -0
- package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js +238 -0
- package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +4 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +39 -12
- package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/usage/usage-stats.service.js +61 -20
- package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -0
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +9 -0
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +10 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +45 -2
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +12 -1
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.d.ts +5 -0
- package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts +77 -0
- package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/v2/completion-evidence.types.js +119 -0
- package/dist/backend/backend/src/types/v2/completion-evidence.types.js.map +1 -0
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +13 -0
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +11 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +11 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +135 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +136 -1
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +13 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +28 -3
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +14 -3
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +49 -5
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +24 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +52 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +204 -56
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +207 -0
- package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-accounts.js +306 -0
- package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js +48 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js +156 -19
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.types.d.ts +2 -0
- package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +19 -4
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/login-broker.service.js +46 -7
- package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/owner-login-request.d.ts +18 -2
- package/dist/cli/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/owner-login-request.js +31 -7
- package/dist/cli/backend/src/services/harness/owner-login-request.js.map +1 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +29 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts +197 -0
- package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js +455 -0
- package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -0
- package/dist/cli/backend/src/services/people/acting-for.service.d.ts +151 -0
- package/dist/cli/backend/src/services/people/acting-for.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/people/acting-for.service.js +224 -0
- package/dist/cli/backend/src/services/people/acting-for.service.js.map +1 -0
- package/dist/cli/backend/src/services/people/dedicated-agent.d.ts +89 -0
- package/dist/cli/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
- package/dist/cli/backend/src/services/people/dedicated-agent.js +113 -0
- package/dist/cli/backend/src/services/people/dedicated-agent.js.map +1 -0
- package/dist/cli/backend/src/services/people/people-directory.service.d.ts +181 -0
- package/dist/cli/backend/src/services/people/people-directory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/people/people-directory.service.js +317 -0
- package/dist/cli/backend/src/services/people/people-directory.service.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
- package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +3 -0
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +46 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +4 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +12 -1
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/messaging.types.d.ts +5 -0
- package/dist/cli/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/messaging.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +13 -0
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.d.ts +21 -0
- package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.js +35 -1
- package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
- package/dist/cli/config/constants.d.ts +11 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +11 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/skills/marketplace-registry.d.ts +4 -4
- package/dist/cli/config/skills/marketplace-registry.js +4 -4
- package/frontend/dist/assets/{index-5b7af029.js → index-465d1f8f.js} +293 -293
- package/frontend/dist/assets/{index-fc715ec3.css → index-5e967795.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/packages/crewly-agent/src/runtime/tool-registry.test.ts +45 -0
- package/packages/crewly-agent/src/runtime/tool-registry.ts +40 -5
- package/packages/crewly-agent/src/test/isolated-home.test.ts +24 -0
package/config/constants.ts
CHANGED
|
@@ -1430,6 +1430,17 @@ export const CLOUD_DISCONNECT_NOTICE_CONSTANTS = {
|
|
|
1430
1430
|
CHECK_INTERVAL_MS: 60 * 1000,
|
|
1431
1431
|
/** Repeat the notice at most this often while still disconnected (ms) — 6 h */
|
|
1432
1432
|
REPEAT_INTERVAL_MS: 6 * 60 * 60 * 1000,
|
|
1433
|
+
/**
|
|
1434
|
+
* Relay queue registration failing (and no queue held) for this long =
|
|
1435
|
+
* disconnected (ms) — 2 min. Heartbeats can keep succeeding meanwhile, so
|
|
1436
|
+
* the 15-min "no contact" rule never sees it (2026-10-02).
|
|
1437
|
+
*/
|
|
1438
|
+
QUEUE_FAILURE_THRESHOLD_MS: 2 * 60 * 1000,
|
|
1439
|
+
/**
|
|
1440
|
+
* When the owner was last told about a relay-queue failure (survives the
|
|
1441
|
+
* episode, so a flapping registration is reported at most every 6 h).
|
|
1442
|
+
*/
|
|
1443
|
+
RELAY_QUEUE_NOTICE_FILE: 'cloud/relay-queue-notice.json',
|
|
1433
1444
|
/** State file under the Crewly home (last notice, DM message, episode start) */
|
|
1434
1445
|
STATE_FILE: 'cloud/disconnect-notice.json',
|
|
1435
1446
|
/** Arguments for the CLI login run in a PTY (device pairing, no local browser) */
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Crewly subagent guard (#852) — Claude Code SubagentStart / SubagentStop hook.
|
|
3
|
+
#
|
|
4
|
+
# Spec: specs/2026-10-03-subagent-guard.md
|
|
5
|
+
#
|
|
6
|
+
# Claude Code's tool hooks (PreToolUse/PostToolUse) do not say whether a call
|
|
7
|
+
# comes from a subagent, so Crewly cannot deny a subagent's side effects per
|
|
8
|
+
# call. What it can do, with the two subagent events:
|
|
9
|
+
#
|
|
10
|
+
# SubagentStart — inject Crewly's subagent rules as additionalContext: do
|
|
11
|
+
# the work yourself, report back only to the parent, never close or claim
|
|
12
|
+
# WorkItems or message other agents/humans.
|
|
13
|
+
# SubagentStop — refuse, once, a "completion" from a subagent that made no
|
|
14
|
+
# tool call at all (the silent no-op of #852: a fork that idled, or that
|
|
15
|
+
# "delegated" its own task and exited). It is sent back with a reason;
|
|
16
|
+
# a second stop is always allowed, so this can never loop.
|
|
17
|
+
#
|
|
18
|
+
# Usage: bash subagent.sh # hook JSON on stdin
|
|
19
|
+
#
|
|
20
|
+
# Fails open: any parse error, missing transcript or missing node means
|
|
21
|
+
# "allow" (exit 0, no output). It reads the subagent's own transcript only to
|
|
22
|
+
# count tool_use blocks; nothing from stdin or the transcript is sent anywhere.
|
|
23
|
+
|
|
24
|
+
set -u
|
|
25
|
+
|
|
26
|
+
# Kill switch, independent of the control-plane guard's.
|
|
27
|
+
[ "${CREWLY_SUBAGENT_GUARD:-}" = "0" ] && exit 0
|
|
28
|
+
command -v node >/dev/null 2>&1 || exit 0
|
|
29
|
+
|
|
30
|
+
INPUT="$(cat)"
|
|
31
|
+
MARKER_DIR="${CREWLY_HOME:-$HOME/.crewly}/runtime/subagent-guard"
|
|
32
|
+
|
|
33
|
+
# The program is passed through a quoted heredoc so its text needs no shell
|
|
34
|
+
# escaping; the hook payload arrives on node's stdin.
|
|
35
|
+
PROGRAM="$(cat <<'JS'
|
|
36
|
+
const fs = require("fs");
|
|
37
|
+
const path = require("path");
|
|
38
|
+
|
|
39
|
+
const START_CONTEXT = [
|
|
40
|
+
"Crewly subagent rules (enforced by your parent agent's harness):",
|
|
41
|
+
"- You are a subagent. Do the assigned work yourself, with your tools. Do not hand it to another agent unless your instructions say to.",
|
|
42
|
+
"- Report your result only in your final message to the parent agent. Do not run report-status, complete-task, send-message, reply or any skill that closes, claims or verifies a WorkItem or messages another agent or a person. Your parent does that after checking your work.",
|
|
43
|
+
"- Stay inside the files, directories and branches your instructions name.",
|
|
44
|
+
"- End with evidence: the files or commits you changed, the commands you ran with their exit codes, or the exact step that blocked you and why.",
|
|
45
|
+
].join("\n");
|
|
46
|
+
|
|
47
|
+
const NO_OP_REASON =
|
|
48
|
+
"You are stopping without having made a single tool call, so none of the assigned work has been done. " +
|
|
49
|
+
"Do the task now with your tools (do not delegate it to another agent), or, if you cannot, reply with the exact reason you are blocked.";
|
|
50
|
+
|
|
51
|
+
/** Identifier check for values used in file names. */
|
|
52
|
+
const SAFE_ID = /^[A-Za-z0-9_-]{1,128}$/;
|
|
53
|
+
|
|
54
|
+
/** Count tool_use blocks in a Claude Code transcript (JSONL). */
|
|
55
|
+
function countToolUses(file) {
|
|
56
|
+
let n = 0;
|
|
57
|
+
for (const line of fs.readFileSync(file, "utf8").split("\n")) {
|
|
58
|
+
if (!line.includes("tool_use")) continue;
|
|
59
|
+
let entry;
|
|
60
|
+
try { entry = JSON.parse(line); } catch { continue; }
|
|
61
|
+
const content = entry && entry.message && entry.message.content;
|
|
62
|
+
if (!Array.isArray(content)) continue;
|
|
63
|
+
for (const block of content) if (block && block.type === "tool_use") n++;
|
|
64
|
+
}
|
|
65
|
+
return n;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let raw = "";
|
|
69
|
+
process.stdin.on("data", (c) => { raw += c; });
|
|
70
|
+
process.stdin.on("end", () => {
|
|
71
|
+
let input;
|
|
72
|
+
try { input = JSON.parse(raw); } catch { return; }
|
|
73
|
+
if (!input || typeof input !== "object") return;
|
|
74
|
+
const event = input.hook_event_name;
|
|
75
|
+
|
|
76
|
+
if (event === "SubagentStart") {
|
|
77
|
+
process.stdout.write(JSON.stringify({
|
|
78
|
+
hookSpecificOutput: { hookEventName: "SubagentStart", additionalContext: START_CONTEXT },
|
|
79
|
+
}));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (event !== "SubagentStop") return;
|
|
83
|
+
if (input.stop_hook_active === true) return;
|
|
84
|
+
|
|
85
|
+
const agentId = input.agent_id;
|
|
86
|
+
const parentTranscript = input.transcript_path;
|
|
87
|
+
if (typeof agentId !== "string" || !SAFE_ID.test(agentId)) return;
|
|
88
|
+
if (typeof parentTranscript !== "string" || !parentTranscript.endsWith(".jsonl")) return;
|
|
89
|
+
|
|
90
|
+
// <project>/<session>.jsonl -> <project>/<session>/subagents/agent-<id>.jsonl
|
|
91
|
+
const sessionDir = parentTranscript.slice(0, -".jsonl".length);
|
|
92
|
+
const transcript = path.join(sessionDir, "subagents", `agent-${agentId}.jsonl`);
|
|
93
|
+
|
|
94
|
+
let toolUses;
|
|
95
|
+
try { toolUses = countToolUses(transcript); } catch { return; }
|
|
96
|
+
if (toolUses > 0) return;
|
|
97
|
+
|
|
98
|
+
// Refuse once per subagent; the next stop goes through.
|
|
99
|
+
const marker = path.join(process.env.MARKER_DIR, `${agentId}.nudged`);
|
|
100
|
+
try {
|
|
101
|
+
fs.mkdirSync(process.env.MARKER_DIR, { recursive: true });
|
|
102
|
+
fs.writeFileSync(marker, "", { flag: "wx" });
|
|
103
|
+
} catch {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
process.stdout.write(JSON.stringify({ decision: "block", reason: NO_OP_REASON }));
|
|
107
|
+
});
|
|
108
|
+
JS
|
|
109
|
+
)"
|
|
110
|
+
|
|
111
|
+
printf '%s' "$INPUT" | MARKER_DIR="$MARKER_DIR" node -e "$PROGRAM" 2>/dev/null
|
|
112
|
+
|
|
113
|
+
exit 0
|
|
@@ -177,5 +177,5 @@ You are failing the task if you:
|
|
|
177
177
|
- Schedule follow-up instead of continuing work in-session.
|
|
178
178
|
- Mark blocked without trying at least one reasonable path.
|
|
179
179
|
- Stop after partial progress without assigning next action.
|
|
180
|
-
- Delegate without checking completion.
|
|
180
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
181
181
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -158,7 +158,7 @@ You are failing the task if you:
|
|
|
158
158
|
- Schedule follow-up instead of continuing work in-session.
|
|
159
159
|
- Mark blocked without trying at least one reasonable path.
|
|
160
160
|
- Stop after partial progress without assigning next action.
|
|
161
|
-
- Delegate without checking completion.
|
|
161
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
162
162
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
163
163
|
|
|
164
164
|
## Default Execution Loop
|
|
@@ -194,5 +194,5 @@ You are failing the task if you:
|
|
|
194
194
|
- Schedule follow-up instead of continuing work in-session.
|
|
195
195
|
- Mark blocked without trying at least one reasonable path.
|
|
196
196
|
- Stop after partial progress without assigning next action.
|
|
197
|
-
- Delegate without checking completion.
|
|
197
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
198
198
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -60,7 +60,7 @@ bash {{AGENT_SKILLS_PATH}}/core/report-status/execute.sh '{"sessionName":"{{SESS
|
|
|
60
60
|
|
|
61
61
|
When complete:
|
|
62
62
|
```bash
|
|
63
|
-
bash {{AGENT_SKILLS_PATH}}/core/report-status/execute.sh '{"sessionName":"{{SESSION_NAME}}","status":"done","summary":"<final results
|
|
63
|
+
bash {{AGENT_SKILLS_PATH}}/core/report-status/execute.sh '{"sessionName":"{{SESSION_NAME}}","status":"done","summary":"<final results>","evidence":[{"type":"artifact","path":"<file or https URL you produced>"}],"taskPath":"<optional task file path>"}'
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
If blocked:
|
|
@@ -133,7 +133,7 @@ You are failing the task if you:
|
|
|
133
133
|
- Schedule follow-up instead of continuing work in-session.
|
|
134
134
|
- Mark blocked without trying at least one reasonable path.
|
|
135
135
|
- Stop after partial progress without assigning next action.
|
|
136
|
-
- Delegate without checking completion.
|
|
136
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
137
137
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
138
138
|
|
|
139
139
|
## Default Execution Loop
|
|
@@ -175,5 +175,5 @@ You are failing the task if you:
|
|
|
175
175
|
- Schedule follow-up instead of continuing work in-session.
|
|
176
176
|
- Mark blocked without trying at least one reasonable path.
|
|
177
177
|
- Stop after partial progress without assigning next action.
|
|
178
|
-
- Delegate without checking completion.
|
|
178
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
179
179
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -299,7 +299,7 @@ When `poll-tasks` returns `claimed: true`:
|
|
|
299
299
|
1. Read the `workItem.title` and `workItem.description` for task details
|
|
300
300
|
2. Report status as `in_progress` with the work item summary
|
|
301
301
|
3. Execute the work as you would any delegated task
|
|
302
|
-
4. When done, report completion — the claim is automatically released
|
|
302
|
+
4. When done, report completion **with evidence** — the files you produced (`--artifact <path>`, must exist) and the checks you ran with their exit codes (`--command "<cmd>" --exit-code <n>`). If a step failed, report it blocked with the step and reason instead of done. The claim is automatically released
|
|
303
303
|
|
|
304
304
|
When `poll-tasks` returns `claimed: false`:
|
|
305
305
|
- No matching work is available — remain idle and wait for assignments
|
|
@@ -414,5 +414,5 @@ You are failing the task if you:
|
|
|
414
414
|
- Schedule follow-up instead of continuing work in-session.
|
|
415
415
|
- Mark blocked without trying at least one reasonable path.
|
|
416
416
|
- Stop after partial progress without assigning next action.
|
|
417
|
-
- Delegate without checking completion.
|
|
417
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
418
418
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -194,5 +194,5 @@ You are failing the task if you:
|
|
|
194
194
|
- Schedule follow-up instead of continuing work in-session.
|
|
195
195
|
- Mark blocked without trying at least one reasonable path.
|
|
196
196
|
- Stop after partial progress without assigning next action.
|
|
197
|
-
- Delegate without checking completion.
|
|
197
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
198
198
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -194,5 +194,5 @@ You are failing the task if you:
|
|
|
194
194
|
- Schedule follow-up instead of continuing work in-session.
|
|
195
195
|
- Mark blocked without trying at least one reasonable path.
|
|
196
196
|
- Stop after partial progress without assigning next action.
|
|
197
|
-
- Delegate without checking completion.
|
|
197
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
198
198
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -183,5 +183,5 @@ You are failing the task if you:
|
|
|
183
183
|
- Schedule follow-up instead of continuing work in-session.
|
|
184
184
|
- Mark blocked without trying at least one reasonable path.
|
|
185
185
|
- Stop after partial progress without assigning next action.
|
|
186
|
-
- Delegate without checking completion.
|
|
186
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
187
187
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -208,5 +208,5 @@ You are failing the task if you:
|
|
|
208
208
|
- Schedule follow-up instead of continuing work in-session.
|
|
209
209
|
- Mark blocked without trying at least one reasonable path.
|
|
210
210
|
- Stop after partial progress without assigning next action.
|
|
211
|
-
- Delegate without checking completion.
|
|
211
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
212
212
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -1554,7 +1554,7 @@ If you use raw `curl`, you may get empty `$CREWLY_API_URL`, wrong ports, or miss
|
|
|
1554
1554
|
| `get-project-overview` | List projects | (no params) |
|
|
1555
1555
|
| `assign-task` | Hand a WorkItem over | `'{"workItemId":"...","target":"..."}'` |
|
|
1556
1556
|
| `project-tickets` | Project backlog | `list | show | create | update | assign --project <path> …` (agent core skill) |
|
|
1557
|
-
| `complete-task` | Mark task done | `'{"
|
|
1557
|
+
| `complete-task` | Mark task done | `'{"workItemId":"...","summary":"...","evidence":[{"type":"artifact","path":"..."}]}'` |
|
|
1558
1558
|
| `get-tasks` | Task progress | (no params) |
|
|
1559
1559
|
| `broadcast` | Message all agents | `'{"message":"..."}'` |
|
|
1560
1560
|
| `resume-session` | Resume agent conversation | `'{"sessionName":"agent-joe"}'` |
|
|
@@ -2277,7 +2277,7 @@ You are failing the task if you:
|
|
|
2277
2277
|
- Schedule follow-up instead of continuing work in-session.
|
|
2278
2278
|
- Mark blocked without trying at least one reasonable path.
|
|
2279
2279
|
- Stop after partial progress without assigning next action.
|
|
2280
|
-
- Delegate without checking completion.
|
|
2280
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
2281
2281
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
2282
2282
|
|
|
2283
2283
|
## Default Execution Loop
|
|
@@ -304,5 +304,5 @@ You are failing the task if you:
|
|
|
304
304
|
- Schedule follow-up instead of continuing work in-session.
|
|
305
305
|
- Mark blocked without trying at least one reasonable path.
|
|
306
306
|
- Stop after partial progress without assigning next action.
|
|
307
|
-
- Delegate without checking completion.
|
|
307
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
308
308
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -193,5 +193,5 @@ You are failing the task if you:
|
|
|
193
193
|
- Schedule follow-up instead of continuing work in-session.
|
|
194
194
|
- Mark blocked without trying at least one reasonable path.
|
|
195
195
|
- Stop after partial progress without assigning next action.
|
|
196
|
-
- Delegate without checking completion.
|
|
196
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
197
197
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -193,5 +193,5 @@ You are failing the task if you:
|
|
|
193
193
|
- Schedule follow-up instead of continuing work in-session.
|
|
194
194
|
- Mark blocked without trying at least one reasonable path.
|
|
195
195
|
- Stop after partial progress without assigning next action.
|
|
196
|
-
- Delegate without checking completion.
|
|
196
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
197
197
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -186,5 +186,5 @@ You are failing the task if you:
|
|
|
186
186
|
- Schedule follow-up instead of continuing work in-session.
|
|
187
187
|
- Mark blocked without trying at least one reasonable path.
|
|
188
188
|
- Stop after partial progress without assigning next action.
|
|
189
|
-
- Delegate without checking completion.
|
|
189
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
190
190
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -175,5 +175,5 @@ You are failing the task if you:
|
|
|
175
175
|
- Schedule follow-up instead of continuing work in-session.
|
|
176
176
|
- Mark blocked without trying at least one reasonable path.
|
|
177
177
|
- Stop after partial progress without assigning next action.
|
|
178
|
-
- Delegate without checking completion.
|
|
178
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
179
179
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -175,5 +175,5 @@ You are failing the task if you:
|
|
|
175
175
|
- Schedule follow-up instead of continuing work in-session.
|
|
176
176
|
- Mark blocked without trying at least one reasonable path.
|
|
177
177
|
- Stop after partial progress without assigning next action.
|
|
178
|
-
- Delegate without checking completion.
|
|
178
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
179
179
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -350,7 +350,7 @@ You are failing the task if you:
|
|
|
350
350
|
- Schedule follow-up instead of continuing work in-session.
|
|
351
351
|
- Mark blocked without trying at least one reasonable path.
|
|
352
352
|
- Stop after partial progress without assigning next action.
|
|
353
|
-
- Delegate without checking completion.
|
|
353
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
354
354
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
355
355
|
|
|
356
356
|
## LLM-Wiki — Queue Worth-Saving Content (MANDATORY per-turn discipline)
|
|
@@ -177,5 +177,5 @@ You are failing the task if you:
|
|
|
177
177
|
- Schedule follow-up instead of continuing work in-session.
|
|
178
178
|
- Mark blocked without trying at least one reasonable path.
|
|
179
179
|
- Stop after partial progress without assigning next action.
|
|
180
|
-
- Delegate without checking completion.
|
|
180
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
181
181
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -177,5 +177,5 @@ You are failing the task if you:
|
|
|
177
177
|
- Schedule follow-up instead of continuing work in-session.
|
|
178
178
|
- Mark blocked without trying at least one reasonable path.
|
|
179
179
|
- Stop after partial progress without assigning next action.
|
|
180
|
-
- Delegate without checking completion.
|
|
180
|
+
- Delegate without checking completion (a subagent's "completed" is not proof: check its commits, files or test output before you rely on it).
|
|
181
181
|
- Produce status updates but no artifact, code, decision, or verified result.
|
|
@@ -246,6 +246,23 @@ else
|
|
|
246
246
|
assert_jq "no top-level summary leak" '.summary == null' "$COMPLETE_BODY"
|
|
247
247
|
fi
|
|
248
248
|
|
|
249
|
+
echo ""
|
|
250
|
+
echo "--- Scenario 3a: orchestrator/complete-task sends evidence under result (#873) ---"
|
|
251
|
+
: > "$LOG"
|
|
252
|
+
bash "${REPO_ROOT}/config/skills/orchestrator/complete-task/execute.sh" \
|
|
253
|
+
'{"workItemId":"wi-stub-1","summary":"Orc evidence summary","evidence":[{"type":"command","command":"npm test","exitCode":0}]}' \
|
|
254
|
+
>/dev/null 2>&1 || true
|
|
255
|
+
|
|
256
|
+
COMPLETE_LINE=$(grep -F '"path": "/api/task-pool/complete/' "$LOG" | head -1 || true)
|
|
257
|
+
if [ -z "$COMPLETE_LINE" ]; then
|
|
258
|
+
FAIL=$((FAIL + 1))
|
|
259
|
+
echo " ✗ no /task-pool/complete POST captured"
|
|
260
|
+
else
|
|
261
|
+
COMPLETE_BODY=$(printf '%s' "$COMPLETE_LINE" | jq -r '.body')
|
|
262
|
+
assert_complete_contract "orc-complete-task+evidence" "$COMPLETE_BODY"
|
|
263
|
+
assert_jq "result.evidence carries the command" '.result.evidence == [{"type":"command","command":"npm test","exitCode":0}]' "$COMPLETE_BODY"
|
|
264
|
+
fi
|
|
265
|
+
|
|
249
266
|
echo ""
|
|
250
267
|
echo "--- Scenario 3b: orchestrator/complete-task with explicit agentId override ---"
|
|
251
268
|
: > "$LOG"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Complete Task
|
|
3
|
-
description: Mark a task as complete with a summary
|
|
4
|
-
version: 1.
|
|
3
|
+
description: Mark a task as complete with a summary and evidence (artifacts that exist, commands with exit codes), or report it blocked.
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
category: task-management
|
|
6
6
|
skillType: claude-skill
|
|
7
7
|
assignableRoles:
|
|
@@ -46,6 +46,7 @@ Mark a task as complete with a summary of the work done. If the task has an outp
|
|
|
46
46
|
| `workItemId` | Preferred | ID of the V3 WorkItem to complete. This is the only input that selects the WorkItem |
|
|
47
47
|
| `sessionName` | Yes | Your agent session name |
|
|
48
48
|
| `summary` | Yes | Summary of the work completed |
|
|
49
|
+
| `evidence` | Yes* | Array of evidence entries — see **Evidence contract** below. *Accepted without it this release (with a warning); required from the next release |
|
|
49
50
|
| `absoluteTaskPath` | No | **Legacy (V1).** Still accepted so older callers keep working, but it does NOT identify a WorkItem |
|
|
50
51
|
| `output` | No | Structured output object (required if task has an output schema) |
|
|
51
52
|
| ~~`skipGates`~~ | **Rejected** | **Not supported.** This endpoint runs no quality gates, so there is nothing to skip. Passing it is a hard error. Use the `check-quality-gates` skill for gates. |
|
|
@@ -64,10 +65,32 @@ Pass `workItemId` whenever you know it — the lookup in step 2 depends on the
|
|
|
64
65
|
pool state at that instant and cannot disambiguate two concurrently running
|
|
65
66
|
items for one session.
|
|
66
67
|
|
|
68
|
+
## Evidence contract (#873)
|
|
69
|
+
|
|
70
|
+
"Done" needs evidence. Send `evidence` as an array; each entry is one of:
|
|
71
|
+
|
|
72
|
+
| Entry | Fields | Server check |
|
|
73
|
+
|-------|--------|--------------|
|
|
74
|
+
| `{"type":"artifact","path":"…"}` | Absolute path, path relative to your worktree/project, or an `https://` URL | A local path must exist, else 400 |
|
|
75
|
+
| `{"type":"command","command":"…","exitCode":0,"outputTail":"…"}` | The command, its exit code, the last lines of its output | `exitCode` must be 0, else 400 — a failing command is not evidence of done |
|
|
76
|
+
| `{"type":"blocked","step":"…","reason":"…"}` | The step that failed and why | The WorkItem is recorded as **blocked**, not done |
|
|
77
|
+
|
|
78
|
+
If you could not finish, do **not** report done: send a `blocked` entry (or use
|
|
79
|
+
`report-status --status blocked`). Malformed evidence is rejected with 400
|
|
80
|
+
naming the bad entry. A completion with no evidence is accepted this release
|
|
81
|
+
but the response (and stderr) carries a `warning`; next release it is a 400.
|
|
82
|
+
A review verdict (`verdict` set) needs no evidence.
|
|
83
|
+
|
|
67
84
|
## Example
|
|
68
85
|
|
|
69
86
|
```bash
|
|
70
|
-
bash config/skills/agent/core/complete-task/execute.sh '{"workItemId":"wi-abc123","sessionName":"dev-1","summary":"Implemented login form with validation and tests"}'
|
|
87
|
+
bash config/skills/agent/core/complete-task/execute.sh '{"workItemId":"wi-abc123","sessionName":"dev-1","summary":"Implemented login form with validation and tests","evidence":[{"type":"artifact","path":"src/login.tsx"},{"type":"command","command":"npx jest src/login.test.tsx","exitCode":0,"outputTail":"Tests: 6 passed, 6 total"}]}'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Could not finish
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
bash config/skills/agent/core/complete-task/execute.sh '{"workItemId":"wi-abc123","sessionName":"dev-1","summary":"Login form done; e2e blocked","evidence":[{"type":"blocked","step":"npx playwright test","reason":"staging auth server returns 503"}]}'
|
|
71
94
|
```
|
|
72
95
|
|
|
73
96
|
### Letting the skill resolve your running WorkItem
|
|
@@ -102,7 +125,7 @@ If the task markdown contains an `## Output Schema` section with a JSON Schema d
|
|
|
102
125
|
Before calling this skill, verify:
|
|
103
126
|
|
|
104
127
|
1. **All requirements met** — re-read the original task and confirm every requirement is addressed
|
|
105
|
-
2. **Code tested** — if you wrote code, run the relevant tests
|
|
128
|
+
2. **Code tested** — if you wrote code, run the relevant tests, confirm they pass, and put the command and its exit code in `evidence`
|
|
106
129
|
3. **URLs verified** — if your output includes URLs or links, verify they are valid
|
|
107
130
|
4. **Sources cited** — for research tasks, ensure all factual claims have source references
|
|
108
131
|
5. **Summary accurate** — your summary should reflect what was actually done, not just what was planned
|
|
@@ -5,7 +5,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
5
5
|
source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
6
6
|
|
|
7
7
|
INPUT=$(read_json_input "${1:-}")
|
|
8
|
-
[ -z "$INPUT" ] && error_exit "Usage: execute.sh '{\"workItemId\":\"wi-abc123\",\"sessionName\":\"dev-1\",\"summary\":\"Implemented feature X\",\"
|
|
8
|
+
[ -z "$INPUT" ] && error_exit "Usage: execute.sh '{\"workItemId\":\"wi-abc123\",\"sessionName\":\"dev-1\",\"summary\":\"Implemented feature X\",\"evidence\":[{\"type\":\"artifact\",\"path\":\"/abs/path/or/https-url\"},{\"type\":\"command\",\"command\":\"npm test\",\"exitCode\":0,\"outputTail\":\"42 passed\"}]}'"
|
|
9
9
|
|
|
10
10
|
# `workItemId` is the V3 identifier and the ONLY input that drives the API
|
|
11
11
|
# call (see the resolution block further down). `absoluteTaskPath` is the
|
|
@@ -41,6 +41,17 @@ if [ -n "$SKIP_GATES" ]; then
|
|
|
41
41
|
error_exit "skipGates is not supported by complete-task and never was — it was accepted and silently discarded. POST /task-pool/complete runs no quality gates, so there is nothing here to skip. Quality gates live behind the 'check-quality-gates' skill (POST /quality-gates/check); run or skip them there. Remove skipGates from this call."
|
|
42
42
|
fi
|
|
43
43
|
OUTPUT_JSON=$(printf '%s' "$INPUT" | jq -c '.output // empty')
|
|
44
|
+
# Evidence contract (#873): "done" needs evidence. Each entry is one of
|
|
45
|
+
# {"type":"artifact","path":"<existing file, relative to the project/worktree, or https URL>"}
|
|
46
|
+
# {"type":"command","command":"<cmd>","exitCode":0,"outputTail":"<last lines>"}
|
|
47
|
+
# {"type":"blocked","step":"<step that failed>","reason":"<why>"}
|
|
48
|
+
# A `blocked` entry records the WorkItem as BLOCKED, not done. The server
|
|
49
|
+
# checks the rest (artifacts exist, exit codes are 0); this only checks the
|
|
50
|
+
# block is an array so a typo fails here instead of as a 400.
|
|
51
|
+
EVIDENCE_JSON=$(printf '%s' "$INPUT" | jq -c '.evidence // empty')
|
|
52
|
+
if [ -n "$EVIDENCE_JSON" ] && [ "$(printf '%s' "$EVIDENCE_JSON" | jq -r 'type')" != "array" ]; then
|
|
53
|
+
error_exit "evidence must be a JSON array of entries, e.g. [{\"type\":\"artifact\",\"path\":\"/abs/file\"},{\"type\":\"command\",\"command\":\"npm test\",\"exitCode\":0}] — or [{\"type\":\"blocked\",\"step\":\"...\",\"reason\":\"...\"}] if you could not finish"
|
|
54
|
+
fi
|
|
44
55
|
# Reviewing someone's work (a "Verify: …" item): `verdict: "rejected"` plus
|
|
45
56
|
# `feedback` sends it back — the worker gets a retry carrying the feedback.
|
|
46
57
|
# Anything else (or nothing) accepts it.
|
|
@@ -144,6 +155,7 @@ BODY=$(jq -n \
|
|
|
144
155
|
--argjson output "${OUTPUT_JSON:-null}" \
|
|
145
156
|
--arg verdict "$VERDICT" \
|
|
146
157
|
--arg feedback "$FEEDBACK" \
|
|
158
|
+
--argjson evidence "${EVIDENCE_JSON:-null}" \
|
|
147
159
|
'{
|
|
148
160
|
agentId: $agentId,
|
|
149
161
|
result: ({summary: $summary}
|
|
@@ -151,10 +163,18 @@ BODY=$(jq -n \
|
|
|
151
163
|
then $output
|
|
152
164
|
else {} end)
|
|
153
165
|
+ (if $verdict != "" then {verdict: $verdict} else {} end)
|
|
154
|
-
+ (if $feedback != "" then {feedback: $feedback} else {} end)
|
|
166
|
+
+ (if $feedback != "" then {feedback: $feedback} else {} end)
|
|
167
|
+
+ (if $evidence != null then {evidence: $evidence} else {} end))
|
|
155
168
|
}')
|
|
156
169
|
|
|
157
|
-
api_call POST "/task-pool/complete/${WORK_ITEM_ID}" "$BODY"
|
|
170
|
+
COMPLETE_RESPONSE=$(api_call POST "/task-pool/complete/${WORK_ITEM_ID}" "$BODY")
|
|
171
|
+
printf '%s\n' "$COMPLETE_RESPONSE"
|
|
172
|
+
# Warn-mode rollout (#873): the server accepts a completion without evidence
|
|
173
|
+
# for one release but says so. Repeat it on stderr so it is not missed.
|
|
174
|
+
EVIDENCE_WARNING=$(printf '%s' "$COMPLETE_RESPONSE" | jq -r '.warning // empty' 2>/dev/null || true)
|
|
175
|
+
if [ -n "$EVIDENCE_WARNING" ]; then
|
|
176
|
+
jq -n --arg w "$EVIDENCE_WARNING" '{warning: $w}' >&2
|
|
177
|
+
fi
|
|
158
178
|
|
|
159
179
|
# The summary is stored on the WorkItem (result.summary) and in the project's
|
|
160
180
|
# task-history.json ledger. It is deliberately NOT saved to long-term memory:
|
|
@@ -92,6 +92,12 @@ if [ "$METHOD" = "GET" ] && printf '%s' "$URL" | grep -q '/task-pool/items'; the
|
|
|
92
92
|
exit 0
|
|
93
93
|
fi
|
|
94
94
|
|
|
95
|
+
if [ -n "${STUB_COMPLETE_RESPONSE:-}" ] && printf '%s' "$URL" | grep -q '/task-pool/complete/'; then
|
|
96
|
+
echo "$STUB_COMPLETE_RESPONSE"
|
|
97
|
+
echo "200"
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
|
|
95
101
|
echo '{"success":true,"stub":true}'
|
|
96
102
|
echo "200"
|
|
97
103
|
STUB_EOF
|
|
@@ -233,6 +239,34 @@ assert_contains "completion still reaches the task pool" \
|
|
|
233
239
|
assert_not_contains "no /memory/remember call on completion" "/memory/remember" "$REQUESTS"
|
|
234
240
|
assert_not_contains "no /memory/record-learning call on completion" "/memory/record-learning" "$REQUESTS"
|
|
235
241
|
|
|
242
|
+
echo ""
|
|
243
|
+
echo "--- Evidence contract (#873) ---"
|
|
244
|
+
|
|
245
|
+
run_skill '{"workItemId":"wi-ev","sessionName":"dev-1","summary":"Report written","evidence":[{"type":"artifact","path":"/proj/report.md"},{"type":"command","command":"npm test","exitCode":0,"outputTail":"42 passed"}]}'
|
|
246
|
+
EV_BODY="$(printf '%s' "$BODIES" | grep 'agentId' | head -1 || true)"
|
|
247
|
+
EV_TYPES="$(printf '%s' "$EV_BODY" | jq -r '[.result.evidence[].type] | join(",")' 2>/dev/null || echo "MISSING")"
|
|
248
|
+
assert_contains "evidence is sent under result.evidence, in order" "artifact,command" "$EV_TYPES"
|
|
249
|
+
EV_EXIT="$(printf '%s' "$EV_BODY" | jq -r '.result.evidence[1].exitCode' 2>/dev/null || echo "MISSING")"
|
|
250
|
+
assert_contains "command exitCode is sent as a number" "0" "$EV_EXIT"
|
|
251
|
+
EV_TOP="$(printf '%s' "$EV_BODY" | jq -r 'has("evidence")' 2>/dev/null || echo "MISSING")"
|
|
252
|
+
assert_contains "evidence is NOT sent at the top level" "false" "$EV_TOP"
|
|
253
|
+
|
|
254
|
+
run_skill '{"workItemId":"wi-ev","sessionName":"dev-1","summary":"Could not finish","evidence":[{"type":"blocked","step":"npm test","reason":"db down"}]}'
|
|
255
|
+
EV_BODY="$(printf '%s' "$BODIES" | grep 'agentId' | head -1 || true)"
|
|
256
|
+
assert_contains "blocked evidence is sent" '"type": "blocked"' "$EV_BODY"
|
|
257
|
+
|
|
258
|
+
run_skill '{"workItemId":"wi-ev","sessionName":"dev-1","summary":"Report written","evidence":{"type":"artifact","path":"/x"}}'
|
|
259
|
+
assert_contains "non-array evidence is refused locally" "evidence must be a JSON array" "$OUT"
|
|
260
|
+
assert_not_contains "no request sent for non-array evidence" "/task-pool/complete" "$REQUESTS"
|
|
261
|
+
|
|
262
|
+
run_skill '{"workItemId":"wi-plain","sessionName":"dev-1","summary":"Report written"}'
|
|
263
|
+
EV_BODY="$(printf '%s' "$BODIES" | grep 'agentId' | head -1 || true)"
|
|
264
|
+
assert_not_contains "no evidence key when none given" '"evidence"' "$EV_BODY"
|
|
265
|
+
|
|
266
|
+
STUB_COMPLETE_RESPONSE='{"success":true,"message":"WorkItem wi-plain completed","warning":"Completed WITHOUT evidence. Send body.result.evidence"}' \
|
|
267
|
+
run_skill '{"workItemId":"wi-plain","sessionName":"dev-1","summary":"Report written"}'
|
|
268
|
+
assert_contains "server warning is printed" '"warning": "Completed WITHOUT evidence' "$OUT"
|
|
269
|
+
|
|
236
270
|
rm -rf "$STUB_DIR"
|
|
237
271
|
|
|
238
272
|
echo ""
|
|
@@ -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.
|
|
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
|