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.
- 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/experiment-card/SKILL.md +96 -0
- package/config/skills/agent/core/experiment-card/execute.sh +147 -0
- package/config/skills/agent/core/experiment-card/execute.test.sh +91 -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/registry.json +6 -5
- 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 +192 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +196 -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/experiments/experiments.routes.d.ts +27 -0
- package/dist/backend/backend/src/controllers/experiments/experiments.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/experiments/experiments.routes.js +96 -0
- package/dist/backend/backend/src/controllers/experiments/experiments.routes.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 +82 -3
- 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 +6 -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/auditor-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/auditor-scheduler.service.js +3 -0
- package/dist/backend/backend/src/services/agent/auditor-scheduler.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/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.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 +54 -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 +35 -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 +77 -1
- 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/experiments/experiment-verdict.d.ts +88 -0
- package/dist/backend/backend/src/services/experiments/experiment-verdict.d.ts.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment-verdict.js +226 -0
- package/dist/backend/backend/src/services/experiments/experiment-verdict.js.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +301 -0
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment.service.js +754 -0
- package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts +73 -0
- package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/experiments/experiment.wiring.js +142 -0
- package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts +60 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.d.ts.map +1 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js +113 -0
- package/dist/backend/backend/src/services/experiments/seo-ops-metric.fetcher.js.map +1 -0
- 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 +53 -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 +19 -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 +46 -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 +50 -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/orc/orc-status-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js +3 -2
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/people/acting-for.service.d.ts +188 -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 +299 -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 +80 -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 +143 -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 +239 -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 +454 -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-bot-ids.d.ts +33 -0
- package/dist/backend/backend/src/services/slack/slack-bot-ids.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-bot-ids.js +56 -0
- package/dist/backend/backend/src/services/slack/slack-bot-ids.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +22 -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 +70 -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/slack/slack.service.d.ts +6 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +8 -0
- package/dist/backend/backend/src/services/slack/slack.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/services/wiki/wiki-ingest.service.d.ts +3 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -0
- package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +3 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/experiment.types.d.ts +153 -0
- package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/experiment.types.js +32 -0
- package/dist/backend/backend/src/types/experiment.types.js.map +1 -0
- 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 +11 -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 +192 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +196 -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/auditor-scheduler.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js +3 -0
- package/dist/cli/backend/src/services/agent/auditor-scheduler.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/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +35 -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 +77 -1
- 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 +19 -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 +46 -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 +188 -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 +299 -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 +239 -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 +454 -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 +22 -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 +70 -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/slack/slack.service.d.ts +6 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +8 -0
- package/dist/cli/backend/src/services/slack/slack.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/services/wiki/wiki-ingest.service.d.ts +3 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.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 +11 -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-fc715ec3.css → index-5e967795.css} +1 -1
- package/frontend/dist/assets/{index-5b7af029.js → index-800118ca.js} +296 -296
- 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 ""
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Experiment Card
|
|
3
|
+
description: Attach an experiment to an optimisation ticket — hypothesis ("change X → metric Y from a to b"), a Search Console or GA4 metric (via seo-ops), an observation window (default 14 days). Crewly captures the baseline when the change ships, measures it when the window ends, labels it worked / didn't / inconclusive, resolves your prediction, writes the wiki experiment log and tells the owner.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: analysis
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- marketing
|
|
9
|
+
- content-strategist
|
|
10
|
+
- generalist
|
|
11
|
+
- developer
|
|
12
|
+
- fullstack-dev
|
|
13
|
+
- product-manager
|
|
14
|
+
- team-leader
|
|
15
|
+
- orchestrator
|
|
16
|
+
triggers:
|
|
17
|
+
- experiment
|
|
18
|
+
- measure the impact
|
|
19
|
+
- did it work
|
|
20
|
+
- a/b
|
|
21
|
+
- hypothesis
|
|
22
|
+
tags:
|
|
23
|
+
- experiments
|
|
24
|
+
- seo
|
|
25
|
+
- analytics
|
|
26
|
+
- outcomes
|
|
27
|
+
execution:
|
|
28
|
+
type: script
|
|
29
|
+
script:
|
|
30
|
+
file: execute.sh
|
|
31
|
+
interpreter: bash
|
|
32
|
+
timeoutMs: 180000
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
# Experiment Card
|
|
36
|
+
|
|
37
|
+
A ticket that is meant to *move a number* (rewrite a title, add FAQ schema,
|
|
38
|
+
shorten the inquiry form) should carry an experiment, so we learn whether it
|
|
39
|
+
worked instead of assuming it did. Create the card **before** the change ships;
|
|
40
|
+
Crewly does the rest:
|
|
41
|
+
|
|
42
|
+
1. **Ship** — when the linked ticket reaches `done` (or you run `ship`), the
|
|
43
|
+
windows are fixed and the **baseline** is fetched right away: the
|
|
44
|
+
`windowDays` days that had settled before the ship day.
|
|
45
|
+
2. **Wait** — the observation window is the `windowDays` days after the ship
|
|
46
|
+
day. Nothing to do; don't re-check it by hand.
|
|
47
|
+
3. **Measure** — once those days have settled (Search Console +3 days, GA4
|
|
48
|
+
+2), Crewly fetches the result and labels it:
|
|
49
|
+
- **worked** — a real change in the hypothesis's direction (|z| ≥ 1.96);
|
|
50
|
+
- **didn't** — enough data, but no real change (or the wrong way);
|
|
51
|
+
- **inconclusive** — too little data (e.g. fewer than 10 form submissions
|
|
52
|
+
across both windows, fewer than 30 clicks/sessions).
|
|
53
|
+
4. **Learn** — your prediction (recorded at ship with `--confidence`) is
|
|
54
|
+
resolved, the result is appended to the wiki experiment log
|
|
55
|
+
(`llm-curated/experiments/log.md`), the owner gets it, and a project
|
|
56
|
+
ticket gets a log line. `show` has the whole timeline (the run's trace).
|
|
57
|
+
|
|
58
|
+
## Create
|
|
59
|
+
|
|
60
|
+
The metric comes from the seo-ops skill, so you need a seo-ops site config
|
|
61
|
+
(`--config`, absolute path; it names the GSC property / GA4 property and the
|
|
62
|
+
service-account credentials).
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Search Console: organic clicks to one page, on a project ticket
|
|
66
|
+
bash execute.sh create --hypothesis "FAQ schema on the H-1B guide → organic clicks from 120 to 160" \
|
|
67
|
+
--source gsc --measure clicks --page https://visa.careerengine.us/h1b-guide \
|
|
68
|
+
--from 120 --to 160 --config /abs/path/ce.seo-ops.json --project ce-site --ticket CE-31 --confidence 0.6
|
|
69
|
+
|
|
70
|
+
# GA4: inquiry-form submissions (all channels), on a harness ticket
|
|
71
|
+
bash execute.sh create --hypothesis "3-field inquiry form → submissions from 8 to 14 per two weeks" \
|
|
72
|
+
--source ga4 --measure events --event generate_lead --channel all \
|
|
73
|
+
--config /abs/path/ce.seo-ops.json --tkt TKT-212
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- gsc measures: `clicks`, `impressions`, `ctr`, `position` (lower is better;
|
|
77
|
+
direction defaults to `decrease`). Filters: `--page URL`, `--query Q`,
|
|
78
|
+
`--page-match` / `--query-match exact|contains`.
|
|
79
|
+
- ga4 measures: `sessions` (Organic Search unless `--channel all`) and
|
|
80
|
+
`events` (`--event NAME`). Filter: `--page /landing-path`.
|
|
81
|
+
- `--window-days` 7–90, whole weeks preferred (default 14).
|
|
82
|
+
- One experiment per change: two changes on the same page in one window
|
|
83
|
+
can't be told apart.
|
|
84
|
+
|
|
85
|
+
## Follow it
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
bash execute.sh list --status running
|
|
89
|
+
bash execute.sh show --id EXP-3 # baseline, result, verdict, timeline
|
|
90
|
+
bash execute.sh ship --id EXP-3 # only if it has no ticket, or shipped before the ticket closed
|
|
91
|
+
bash execute.sh measure --id EXP-3 # only after dueAt; normally automatic
|
|
92
|
+
bash execute.sh cancel --id EXP-3 --reason "change reverted"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
If a fetch keeps failing (credentials, property access) the owner is told
|
|
96
|
+
once with the error; it keeps retrying.
|