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
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# experiment-card — attach an experiment to an optimisation ticket; Crewly
|
|
4
|
+
# captures the baseline when it ships and measures it when the window ends.
|
|
5
|
+
#
|
|
6
|
+
# Backed by /api/experiments (specs/experiment-cards.md, issue #986).
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# bash execute.sh create --hypothesis "…" --source gsc|ga4 --measure M --config /abs/seo-ops.config.json
|
|
10
|
+
# [--page P] [--page-match exact|contains] [--query Q] [--query-match exact|contains]
|
|
11
|
+
# [--event NAME] [--channel all] [--label "…"] [--title "…"]
|
|
12
|
+
# [--from A] [--to B] [--direction increase|decrease] [--window-days 14]
|
|
13
|
+
# [--confidence 0.6] [--project P --ticket ID | --tkt TKT-12]
|
|
14
|
+
# bash execute.sh ship --id EXP-3 [--shipped-at ISO]
|
|
15
|
+
# bash execute.sh show --id EXP-3
|
|
16
|
+
# bash execute.sh list [--status planned|running|done|cancelled] [--ticket ID]
|
|
17
|
+
# bash execute.sh measure --id EXP-3
|
|
18
|
+
# bash execute.sh cancel --id EXP-3 [--reason "…"]
|
|
19
|
+
# bash execute.sh '{"action":"create","hypothesis":"…","metric":{…},"ticket":{…}}'
|
|
20
|
+
# =============================================================================
|
|
21
|
+
set -euo pipefail
|
|
22
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
23
|
+
source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
24
|
+
|
|
25
|
+
print_usage() {
|
|
26
|
+
cat <<'EOF_USAGE'
|
|
27
|
+
Usage:
|
|
28
|
+
bash execute.sh create --hypothesis "change X → metric Y from a to b" --source gsc|ga4 --measure M
|
|
29
|
+
--config /abs/path/seo-ops.config.json [filters] [--from A] [--to B]
|
|
30
|
+
[--window-days 14] [--confidence 0.6] [--project P --ticket ID | --tkt TKT-12]
|
|
31
|
+
gsc measures: clicks impressions ctr position (filters: --page URL --query Q, --page-match/--query-match exact|contains)
|
|
32
|
+
ga4 measures: sessions events (filters: --page /path, --event NAME, --channel all)
|
|
33
|
+
bash execute.sh ship --id EXP-3 [--shipped-at ISO] The change is live (automatic when the ticket is done)
|
|
34
|
+
bash execute.sh show --id EXP-3 Card, baseline, result and timeline
|
|
35
|
+
bash execute.sh list [--status S] [--ticket ID]
|
|
36
|
+
bash execute.sh measure --id EXP-3 Measure now (only once it is due)
|
|
37
|
+
bash execute.sh cancel --id EXP-3 [--reason "…"]
|
|
38
|
+
EOF_USAGE
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
ACTION=""; ID=""; JSON_BODY=""
|
|
42
|
+
HYPOTHESIS=""; TITLE=""; SOURCE=""; MEASURE=""; CONFIG=""; PAGE=""; PAGE_MATCH=""; QUERY=""; QUERY_MATCH=""
|
|
43
|
+
EVENT=""; CHANNEL=""; LABEL=""; FROM=""; TO=""; DIRECTION=""; WINDOW=""; CONFIDENCE=""; PROJECT=""; TICKET=""; TKT=""
|
|
44
|
+
SHIPPED_AT=""; STATUS=""; REASON=""
|
|
45
|
+
|
|
46
|
+
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
47
|
+
J=$(read_json_input "$1"); shift
|
|
48
|
+
ACTION=$(printf '%s' "$J" | jq -r '.action // empty')
|
|
49
|
+
ID=$(printf '%s' "$J" | jq -r '.id // empty')
|
|
50
|
+
SHIPPED_AT=$(printf '%s' "$J" | jq -r '.shippedAt // empty')
|
|
51
|
+
STATUS=$(printf '%s' "$J" | jq -r '.status // empty')
|
|
52
|
+
REASON=$(printf '%s' "$J" | jq -r '.reason // empty')
|
|
53
|
+
TICKET=$(printf '%s' "$J" | jq -r 'if (.ticket|type) == "string" then .ticket else empty end')
|
|
54
|
+
JSON_BODY=$(printf '%s' "$J" | jq -c 'del(.action, .id, .shippedAt, .status, .reason)')
|
|
55
|
+
fi
|
|
56
|
+
if [[ -z "$ACTION" && $# -gt 0 && ${1:0:1} != '-' ]]; then ACTION="$1"; shift; fi
|
|
57
|
+
|
|
58
|
+
while [[ $# -gt 0 ]]; do
|
|
59
|
+
case "$1" in
|
|
60
|
+
--id) [ $# -ge 2 ] || error_exit "--id requires a value"; ID="$2"; shift 2 ;;
|
|
61
|
+
--hypothesis) [ $# -ge 2 ] || error_exit "--hypothesis requires a value"; HYPOTHESIS="$2"; shift 2 ;;
|
|
62
|
+
--title) [ $# -ge 2 ] || error_exit "--title requires a value"; TITLE="$2"; shift 2 ;;
|
|
63
|
+
--source) [ $# -ge 2 ] || error_exit "--source requires a value"; SOURCE="$2"; shift 2 ;;
|
|
64
|
+
--measure) [ $# -ge 2 ] || error_exit "--measure requires a value"; MEASURE="$2"; shift 2 ;;
|
|
65
|
+
--config) [ $# -ge 2 ] || error_exit "--config requires a value"; CONFIG="$2"; shift 2 ;;
|
|
66
|
+
--page) [ $# -ge 2 ] || error_exit "--page requires a value"; PAGE="$2"; shift 2 ;;
|
|
67
|
+
--page-match) [ $# -ge 2 ] || error_exit "--page-match requires a value"; PAGE_MATCH="$2"; shift 2 ;;
|
|
68
|
+
--query) [ $# -ge 2 ] || error_exit "--query requires a value"; QUERY="$2"; shift 2 ;;
|
|
69
|
+
--query-match) [ $# -ge 2 ] || error_exit "--query-match requires a value"; QUERY_MATCH="$2"; shift 2 ;;
|
|
70
|
+
--event) [ $# -ge 2 ] || error_exit "--event requires a value"; EVENT="$2"; shift 2 ;;
|
|
71
|
+
--channel) [ $# -ge 2 ] || error_exit "--channel requires a value"; CHANNEL="$2"; shift 2 ;;
|
|
72
|
+
--label) [ $# -ge 2 ] || error_exit "--label requires a value"; LABEL="$2"; shift 2 ;;
|
|
73
|
+
--from) [ $# -ge 2 ] || error_exit "--from requires a value"; FROM="$2"; shift 2 ;;
|
|
74
|
+
--to) [ $# -ge 2 ] || error_exit "--to requires a value"; TO="$2"; shift 2 ;;
|
|
75
|
+
--direction) [ $# -ge 2 ] || error_exit "--direction requires a value"; DIRECTION="$2"; shift 2 ;;
|
|
76
|
+
--window-days) [ $# -ge 2 ] || error_exit "--window-days requires a value"; WINDOW="$2"; shift 2 ;;
|
|
77
|
+
--confidence) [ $# -ge 2 ] || error_exit "--confidence requires a value"; CONFIDENCE="$2"; shift 2 ;;
|
|
78
|
+
--project|-p) [ $# -ge 2 ] || error_exit "--project requires a value"; PROJECT="$2"; shift 2 ;;
|
|
79
|
+
--ticket) [ $# -ge 2 ] || error_exit "--ticket requires a value"; TICKET="$2"; shift 2 ;;
|
|
80
|
+
--tkt) [ $# -ge 2 ] || error_exit "--tkt requires a value"; TKT="$2"; shift 2 ;;
|
|
81
|
+
--shipped-at) [ $# -ge 2 ] || error_exit "--shipped-at requires a value"; SHIPPED_AT="$2"; shift 2 ;;
|
|
82
|
+
--status) [ $# -ge 2 ] || error_exit "--status requires a value"; STATUS="$2"; shift 2 ;;
|
|
83
|
+
--reason) [ $# -ge 2 ] || error_exit "--reason requires a value"; REASON="$2"; shift 2 ;;
|
|
84
|
+
--help|-h) print_usage; exit 0 ;;
|
|
85
|
+
*) error_exit "Unknown option: $1" ;;
|
|
86
|
+
esac
|
|
87
|
+
done
|
|
88
|
+
|
|
89
|
+
enc() { jq -rn --arg v "$1" '$v|@uri'; }
|
|
90
|
+
CARD='{id, status, title, hypothesis, metric: (.metric | {source, measure, page, query, event, label} | with_entries(select(.value != null))), windowDays, ticket, shippedAt, dueAt, baseline: (.baseline.total // null), result: (.result.total // null), verdict, verdictReason, lastError, traceId}'
|
|
91
|
+
|
|
92
|
+
case "$ACTION" in
|
|
93
|
+
create)
|
|
94
|
+
if [ -n "$JSON_BODY" ] && [ "$JSON_BODY" != "{}" ]; then
|
|
95
|
+
BODY="$JSON_BODY"
|
|
96
|
+
else
|
|
97
|
+
require_param "hypothesis (--hypothesis)" "$HYPOTHESIS"
|
|
98
|
+
require_param "source (--source gsc|ga4)" "$SOURCE"
|
|
99
|
+
require_param "measure (--measure)" "$MEASURE"
|
|
100
|
+
require_param "config (--config, the seo-ops site config)" "$CONFIG"
|
|
101
|
+
if [ -n "$TICKET" ] && [ -z "$PROJECT" ]; then error_exit "--ticket needs --project (or use --tkt TKT-n for a harness ticket)"; fi
|
|
102
|
+
BODY=$(jq -cn \
|
|
103
|
+
--arg h "$HYPOTHESIS" --arg t "$TITLE" --arg s "$SOURCE" --arg m "$MEASURE" --arg c "$CONFIG" \
|
|
104
|
+
--arg page "$PAGE" --arg pm "$PAGE_MATCH" --arg q "$QUERY" --arg qm "$QUERY_MATCH" --arg ev "$EVENT" \
|
|
105
|
+
--arg ch "$CHANNEL" --arg lb "$LABEL" --arg from "$FROM" --arg to "$TO" --arg dir "$DIRECTION" \
|
|
106
|
+
--arg win "$WINDOW" --arg conf "$CONFIDENCE" --arg proj "$PROJECT" --arg tic "$TICKET" --arg tkt "$TKT" '
|
|
107
|
+
def opt($k; $v): if $v == "" then {} else {($k): $v} end;
|
|
108
|
+
{hypothesis: $h}
|
|
109
|
+
+ opt("title"; $t)
|
|
110
|
+
+ {metric: ({source: $s, measure: $m, config: $c}
|
|
111
|
+
+ opt("page"; $page) + opt("pageMatch"; $pm) + opt("query"; $q) + opt("queryMatch"; $qm)
|
|
112
|
+
+ opt("event"; $ev) + opt("channel"; $ch) + opt("label"; $lb))}
|
|
113
|
+
+ (if $from == "" and $to == "" then {} else {expected: (opt("from"; $from) + opt("to"; $to))} end)
|
|
114
|
+
+ opt("direction"; $dir) + opt("windowDays"; $win) + opt("confidence"; $conf)
|
|
115
|
+
+ (if $tkt != "" then {ticket: {kind: "harness", id: $tkt}}
|
|
116
|
+
elif $tic != "" then {ticket: {kind: "project", project: $proj, id: $tic}}
|
|
117
|
+
else {} end)')
|
|
118
|
+
fi
|
|
119
|
+
api_call POST "/experiments" "$BODY" | jq "{success, experiment: (.data | ${CARD})}"
|
|
120
|
+
;;
|
|
121
|
+
ship)
|
|
122
|
+
require_param "id (--id EXP-n)" "$ID"
|
|
123
|
+
BODY=$(jq -cn --arg at "$SHIPPED_AT" 'if $at == "" then {} else {shippedAt: $at} end')
|
|
124
|
+
api_call POST "/experiments/$(enc "$ID")/ship" "$BODY" | jq "{success, experiment: (.data | ${CARD})}"
|
|
125
|
+
;;
|
|
126
|
+
show)
|
|
127
|
+
require_param "id (--id EXP-n)" "$ID"
|
|
128
|
+
api_call GET "/experiments/$(enc "$ID")" | jq "{success, experiment: (.data | ${CARD} + {timeline})}"
|
|
129
|
+
;;
|
|
130
|
+
list)
|
|
131
|
+
QS=""
|
|
132
|
+
[ -n "$STATUS" ] && QS="status=$(enc "$STATUS")"
|
|
133
|
+
[ -n "$TICKET" ] && QS="${QS:+$QS&}ticket=$(enc "$TICKET")"
|
|
134
|
+
api_call GET "/experiments${QS:+?$QS}" | jq "{success, experiments: [.data[] | ${CARD}]}"
|
|
135
|
+
;;
|
|
136
|
+
measure)
|
|
137
|
+
require_param "id (--id EXP-n)" "$ID"
|
|
138
|
+
api_call POST "/experiments/$(enc "$ID")/measure" '{}' | jq "{success, experiment: (.data | ${CARD})}"
|
|
139
|
+
;;
|
|
140
|
+
cancel)
|
|
141
|
+
require_param "id (--id EXP-n)" "$ID"
|
|
142
|
+
BODY=$(jq -cn --arg r "$REASON" 'if $r == "" then {} else {reason: $r} end')
|
|
143
|
+
api_call POST "/experiments/$(enc "$ID")/cancel" "$BODY" | jq "{success, experiment: (.data | ${CARD})}"
|
|
144
|
+
;;
|
|
145
|
+
""|help) print_usage; [ -n "$ACTION" ] || exit 1 ;;
|
|
146
|
+
*) error_exit "Unknown action: $ACTION (create, ship, show, list, measure, cancel)" ;;
|
|
147
|
+
esac
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for experiment-card — run with: bash execute.test.sh
|
|
3
|
+
# A python HTTP stub plays the backend; asserts the calls and the output.
|
|
4
|
+
set -u
|
|
5
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
EXEC="$HERE/execute.sh"
|
|
7
|
+
PASS=0; FAIL=0
|
|
8
|
+
check() {
|
|
9
|
+
local name="$1"; local got="$2"; local want="$3"
|
|
10
|
+
if [ "$got" = "$want" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); echo "FAIL: $name"; echo " want: $want"; echo " got: $got"; fi
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
PORT=18853
|
|
14
|
+
STUB_LOG="$(mktemp)"; export STUB_LOG; export STUB_PORT="$PORT"
|
|
15
|
+
python3 -u <<'PY' >/dev/null 2>&1 &
|
|
16
|
+
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
17
|
+
import json, os
|
|
18
|
+
LOG = os.environ['STUB_LOG']; PORT = int(os.environ['STUB_PORT'])
|
|
19
|
+
E = {'id': 'EXP-1', 'traceId': 'exp:EXP-1', 'status': 'planned', 'title': 'T', 'hypothesis': 'H',
|
|
20
|
+
'metric': {'source': 'gsc', 'measure': 'clicks', 'config': '/c.json', 'page': 'https://x/'}, 'windowDays': 14,
|
|
21
|
+
'baseline': {'total': 100, 'days': [1, 2]}, 'timeline': [{'at': 'a', 'event': 'created'}], 'createdBy': 'ella'}
|
|
22
|
+
class H(BaseHTTPRequestHandler):
|
|
23
|
+
def reply(self, code, obj):
|
|
24
|
+
self.send_response(code); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
25
|
+
self.wfile.write(json.dumps(obj).encode())
|
|
26
|
+
def record(self, body=None):
|
|
27
|
+
open(LOG, 'w').write(json.dumps({'method': self.command, 'path': self.path, 'body': body, 'agent': self.headers.get('X-Agent-Session')}))
|
|
28
|
+
def do_GET(self):
|
|
29
|
+
self.record()
|
|
30
|
+
if self.path.startswith('/api/experiments/'):
|
|
31
|
+
return self.reply(200, {'success': True, 'data': E})
|
|
32
|
+
return self.reply(200, {'success': True, 'data': [E, dict(E, id='EXP-2', status='done', verdict='worked')]})
|
|
33
|
+
def do_POST(self):
|
|
34
|
+
n = int(self.headers.get('content-length', '0')); body = json.loads(self.rfile.read(n).decode() or '{}')
|
|
35
|
+
self.record(body)
|
|
36
|
+
if self.path.endswith('/measure'):
|
|
37
|
+
return self.reply(409, {'success': False, 'error': 'EXP-1 is not due until 2026-10-28'})
|
|
38
|
+
return self.reply(200, {'success': True, 'data': E})
|
|
39
|
+
def log_message(self, *a, **k): pass
|
|
40
|
+
HTTPServer(('127.0.0.1', PORT), H).serve_forever()
|
|
41
|
+
PY
|
|
42
|
+
STUB_PID=$!
|
|
43
|
+
disown "$STUB_PID" 2>/dev/null || true
|
|
44
|
+
trap 'kill "$STUB_PID" >/dev/null 2>&1; rm -f "$STUB_LOG"' EXIT
|
|
45
|
+
for i in $(seq 1 30); do curl -s -o /dev/null -m 0.2 "http://127.0.0.1:${PORT}/" 2>/dev/null && break; sleep 0.1; done
|
|
46
|
+
|
|
47
|
+
run() { CREWLY_SESSION_NAME=ella CREWLY_API_URL="http://127.0.0.1:${PORT}" bash "$EXEC" "$@" 2>/dev/null; }
|
|
48
|
+
run_err() { CREWLY_SESSION_NAME=ella CREWLY_API_URL="http://127.0.0.1:${PORT}" bash "$EXEC" "$@" 2>&1 >/dev/null; }
|
|
49
|
+
last() { jq -r "$1" "$STUB_LOG"; }
|
|
50
|
+
|
|
51
|
+
# --- create on a project ticket: metric, expectation, window ---
|
|
52
|
+
OUT=$(run create --hypothesis "FAQ schema → clicks 100 to 140" --source gsc --measure clicks --config /c.json \
|
|
53
|
+
--page https://x/ --from 100 --to 140 --window-days 21 --project ce --ticket T-12)
|
|
54
|
+
check "create: path" "$(last .path)" "/api/experiments"
|
|
55
|
+
check "create: body" "$(last '.body | tostring')" '{"hypothesis":"FAQ schema → clicks 100 to 140","metric":{"source":"gsc","measure":"clicks","config":"/c.json","page":"https://x/"},"expected":{"from":"100","to":"140"},"windowDays":"21","ticket":{"kind":"project","project":"ce","id":"T-12"}}'
|
|
56
|
+
check "create: agent header" "$(last .agent)" "ella"
|
|
57
|
+
check "create: card" "$(printf '%s' "$OUT" | jq -c '.experiment | [.id, .baseline, .metric.page]')" '["EXP-1",100,"https://x/"]'
|
|
58
|
+
|
|
59
|
+
# --- create on a harness ticket with GA4 form events ---
|
|
60
|
+
run create --hypothesis "Shorter form" --source ga4 --measure events --event generate_lead --channel all --config /c.json --tkt TKT-40 >/dev/null
|
|
61
|
+
check "create ga4: body" "$(last '.body | tostring')" '{"hypothesis":"Shorter form","metric":{"source":"ga4","measure":"events","config":"/c.json","event":"generate_lead","channel":"all"},"ticket":{"kind":"harness","id":"TKT-40"}}'
|
|
62
|
+
|
|
63
|
+
# --- create from JSON passes the body through ---
|
|
64
|
+
run '{"action":"create","hypothesis":"J","metric":{"source":"gsc","measure":"ctr","config":"/c.json"}}' >/dev/null
|
|
65
|
+
check "create json: body" "$(last '.body | tostring')" '{"hypothesis":"J","metric":{"source":"gsc","measure":"ctr","config":"/c.json"}}'
|
|
66
|
+
|
|
67
|
+
# --- missing params / a ticket without its project ---
|
|
68
|
+
check "create: missing" "$(run_err create --hypothesis h --source gsc --measure clicks | grep -c 'config')" "1"
|
|
69
|
+
check "create: ticket w/o project" "$(run_err create --hypothesis h --source gsc --measure clicks --config /c --ticket T-1 | grep -c 'needs --project')" "1"
|
|
70
|
+
|
|
71
|
+
# --- ship / show / list / cancel ---
|
|
72
|
+
run ship --id EXP-1 --shipped-at 2026-10-01T10:00:00Z >/dev/null
|
|
73
|
+
check "ship: path" "$(last .path)" "/api/experiments/EXP-1/ship"
|
|
74
|
+
check "ship: body" "$(last '.body | tostring')" '{"shippedAt":"2026-10-01T10:00:00Z"}'
|
|
75
|
+
OUT=$(run show --id EXP-1)
|
|
76
|
+
check "show: timeline" "$(printf '%s' "$OUT" | jq -c '.experiment.timeline | map(.event)')" '["created"]'
|
|
77
|
+
OUT=$(run list --status done --ticket TKT-40)
|
|
78
|
+
check "list: path" "$(last .path)" "/api/experiments?status=done&ticket=TKT-40"
|
|
79
|
+
check "list: rows" "$(printf '%s' "$OUT" | jq -c '[.experiments[] | [.id, .verdict]]')" '[["EXP-1",null],["EXP-2","worked"]]'
|
|
80
|
+
run cancel --id EXP-1 --reason dup >/dev/null
|
|
81
|
+
check "cancel: body" "$(last '.body | tostring')" '{"reason":"dup"}'
|
|
82
|
+
|
|
83
|
+
# --- measure refused before it is due: the error reaches the agent ---
|
|
84
|
+
check "measure: not due" "$(run_err measure --id EXP-1 | grep -c 'not due')" "1"
|
|
85
|
+
|
|
86
|
+
# --- unknown action / option ---
|
|
87
|
+
check "unknown action" "$(run_err frobnicate | grep -c 'Unknown action')" "1"
|
|
88
|
+
check "unknown option" "$(run_err list --nope | grep -c 'Unknown option')" "1"
|
|
89
|
+
|
|
90
|
+
echo "experiment-card: $PASS passed, $FAIL failed"
|
|
91
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -128,7 +128,7 @@ fi
|
|
|
128
128
|
cat >> "$HANDOFF_MSG_FILE" << FOOTER_EOF
|
|
129
129
|
|
|
130
130
|
---
|
|
131
|
-
When done, report back with report-status, passing the workItemId from your [CREWLY-DISPATCH] notice (or from get-my-tasks) so the right WorkItem is closed: bash ${CREWLY_ROOT}/config/skills/agent/core/report-status/execute.sh '{"sessionName":"${TO}","workItemId":"<your WorkItem id>","status":"done","summary":"<brief summary>","projectPath":"${PROJECT_PATH}"}'
|
|
131
|
+
When done, report back with report-status, passing the workItemId from your [CREWLY-DISPATCH] notice (or from get-my-tasks) so the right WorkItem is closed: bash ${CREWLY_ROOT}/config/skills/agent/core/report-status/execute.sh '{"sessionName":"${TO}","workItemId":"<your WorkItem id>","status":"done","summary":"<brief summary>","evidence":[{"type":"artifact","path":"<file you produced>"},{"type":"command","command":"<check you ran>","exitCode":0}],"projectPath":"${PROJECT_PATH}"}' — done needs evidence (files that exist, checks with exit code 0); if a step failed, send [{"type":"blocked","step":"<step>","reason":"<why>"}] instead, never done.
|
|
132
132
|
FOOTER_EOF
|
|
133
133
|
|
|
134
134
|
HANDOFF_MESSAGE=$(cat "$HANDOFF_MSG_FILE")
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Report Status
|
|
3
3
|
description: Proactively notify the orchestrator when a task is done, blocked, or failed.
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
category: task-management
|
|
6
6
|
skillType: claude-skill
|
|
7
7
|
assignableRoles:
|
|
@@ -59,6 +59,24 @@ Pass the `workItemId` of the work you are reporting on (from your `[CREWLY-DISPA
|
|
|
59
59
|
| `--structured` | `structured` | No | Use structured StatusReport format |
|
|
60
60
|
| `--work-item-id` / `--wi-id` | `workItemId` | **Pass this when `status` is `done`, `blocked` or `failed`** | Which WorkItem to complete, block or fail. See below — without it the skill infers, and refuses when the choice is ambiguous |
|
|
61
61
|
|
|
62
|
+
### Evidence (status `done`) — #873
|
|
63
|
+
|
|
64
|
+
"Done" needs evidence. Add one or more of:
|
|
65
|
+
|
|
66
|
+
| Flag | JSON | Entry sent |
|
|
67
|
+
|------|------|------------|
|
|
68
|
+
| `--artifact <path>` (repeatable) | — | `{"type":"artifact","path":…}` — absolute, relative to your worktree/project, or an `https://` URL. Must exist on the server. |
|
|
69
|
+
| `--command <cmd> --exit-code <n> [--output-tail <text>]` (repeatable group) | — | `{"type":"command","command":…,"exitCode":n,"outputTail":…}` — `exitCode` must be 0 |
|
|
70
|
+
| `--blocked-step <step> --blocked-reason <why>` | — | `{"type":"blocked",…}` — the WorkItem is recorded as **blocked**, not done |
|
|
71
|
+
| `--evidence '<json array>'` | `evidence` | The raw array, sent ahead of any flag entries |
|
|
72
|
+
|
|
73
|
+
The server rejects (400) a missing artifact, a non-zero exit code, or a
|
|
74
|
+
malformed entry; the skill then prints `{"warning":"… completing the WorkItem
|
|
75
|
+
FAILED …","error":…}` with the reason. Without any evidence, `done` is accepted
|
|
76
|
+
**this release** with a `warning` on stderr; from the next release it is
|
|
77
|
+
refused. If you could not finish, report `--status blocked` (or `done` with
|
|
78
|
+
`--blocked-step/--blocked-reason`), never `done`.
|
|
79
|
+
|
|
62
80
|
## This skill COMPLETES a WorkItem, not just reports
|
|
63
81
|
|
|
64
82
|
When `status=done`, this skill closes a WorkItem in the task pool as a side
|
|
@@ -93,8 +111,13 @@ the skill refuses instead of guessing.
|
|
|
93
111
|
## Examples — CLI Flags (preferred)
|
|
94
112
|
|
|
95
113
|
```bash
|
|
96
|
-
# Report done
|
|
97
|
-
bash execute.sh --session dev-1 --status done --summary "Finished auth module, all tests pass" --project /path/to/project
|
|
114
|
+
# Report done, with evidence
|
|
115
|
+
bash execute.sh --session dev-1 --status done --summary "Finished auth module, all tests pass" --project /path/to/project \
|
|
116
|
+
--work-item-id <id> --artifact src/auth.ts --command "npx jest src/auth" --exit-code 0 --output-tail "Tests: 14 passed"
|
|
117
|
+
|
|
118
|
+
# Could not finish one step: recorded as blocked, not done
|
|
119
|
+
bash execute.sh --session dev-1 --status done --summary "Auth module written; e2e blocked" --work-item-id <id> \
|
|
120
|
+
--blocked-step "npx playwright test" --blocked-reason "staging login returns 503"
|
|
98
121
|
|
|
99
122
|
# Report a blocker
|
|
100
123
|
bash execute.sh --session dev-1 --status blocked --summary "Waiting on API credentials from ops team"
|
|
@@ -119,7 +142,7 @@ bash execute.sh --session dev-1 --status done --summary-file /tmp/summary.txt --
|
|
|
119
142
|
## Examples — Legacy JSON (backward compatible)
|
|
120
143
|
|
|
121
144
|
```bash
|
|
122
|
-
bash execute.sh '{"sessionName":"dev-1","status":"done","summary":"Finished implementing auth module","workItemId":"<your WorkItem id>"}'
|
|
145
|
+
bash execute.sh '{"sessionName":"dev-1","status":"done","summary":"Finished implementing auth module","workItemId":"<your WorkItem id>","evidence":[{"type":"command","command":"npm test","exitCode":0}]}'
|
|
123
146
|
```
|
|
124
147
|
|
|
125
148
|
## Output
|
|
@@ -9,7 +9,12 @@ print_usage() {
|
|
|
9
9
|
cat <<'EOF_USAGE'
|
|
10
10
|
Usage:
|
|
11
11
|
# CLI flags (preferred — avoids shell escaping issues)
|
|
12
|
-
bash execute.sh --session dev-1 --status done --summary "Fixed the bug" --project /path/to/project
|
|
12
|
+
bash execute.sh --session dev-1 --status done --summary "Fixed the bug" --project /path/to/project \
|
|
13
|
+
--artifact src/fix.ts --command "npm test" --exit-code 0 --output-tail "42 passed"
|
|
14
|
+
|
|
15
|
+
# Could not finish: done with a blocked step is recorded as BLOCKED, not done
|
|
16
|
+
bash execute.sh --session dev-1 --status done --summary "Fix written, tests blocked" \
|
|
17
|
+
--blocked-step "npm test" --blocked-reason "test DB unreachable"
|
|
13
18
|
|
|
14
19
|
# Summary from stdin (for multi-line or special characters)
|
|
15
20
|
echo "Fixed the bug — it's working" | bash execute.sh --session dev-1 --status done --project /path
|
|
@@ -37,6 +42,18 @@ Options:
|
|
|
37
42
|
--progress Progress percentage (0-100, for structured format)
|
|
38
43
|
--structured Use structured StatusReport format (true/false)
|
|
39
44
|
--json | -j Raw JSON payload (same as legacy)
|
|
45
|
+
|
|
46
|
+
Evidence (status done — #873: "done" needs evidence):
|
|
47
|
+
--artifact <path> A file the work produced (absolute, relative to the
|
|
48
|
+
project/worktree, or an https URL). Must exist. Repeatable.
|
|
49
|
+
--command <cmd> A command you ran. Follow it with --exit-code (required)
|
|
50
|
+
--exit-code <n> and optionally --output-tail. Repeatable as a group.
|
|
51
|
+
--output-tail <text> Last lines of that command's output.
|
|
52
|
+
--blocked-step <step> You could not finish: the step that failed ...
|
|
53
|
+
--blocked-reason <why> ... and why. The WorkItem is recorded as BLOCKED, not done.
|
|
54
|
+
--evidence <json> Raw evidence array, e.g. '[{"type":"artifact","path":"/abs/f"}]'
|
|
55
|
+
A non-zero --exit-code or a missing artifact is rejected by the server. Without
|
|
56
|
+
any evidence, done is accepted this release with a warning; next release it is refused.
|
|
40
57
|
--help | -h Show this help
|
|
41
58
|
EOF_USAGE
|
|
42
59
|
}
|
|
@@ -52,6 +69,28 @@ TASK_ID=""
|
|
|
52
69
|
WORK_ITEM_ID=""
|
|
53
70
|
PROGRESS=""
|
|
54
71
|
STRUCTURED="false"
|
|
72
|
+
# Evidence entries built from flags (#873), as a JSON array.
|
|
73
|
+
FLAG_EVIDENCE='[]'
|
|
74
|
+
BLOCKED_STEP=""
|
|
75
|
+
BLOCKED_REASON=""
|
|
76
|
+
EVIDENCE_ARG=""
|
|
77
|
+
|
|
78
|
+
# add_evidence <jq-object-expression> [jq --arg pairs...]
|
|
79
|
+
# Appends one entry to FLAG_EVIDENCE.
|
|
80
|
+
add_evidence() {
|
|
81
|
+
local expr="$1"; shift
|
|
82
|
+
FLAG_EVIDENCE=$(printf '%s' "$FLAG_EVIDENCE" | jq -c "$@" ". + [${expr}]")
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# set_last_command_field <field> <jq value expression> [jq --arg/--argjson pairs...]
|
|
86
|
+
# Sets a field on the most recent --command entry; refuses when there is none.
|
|
87
|
+
set_last_command_field() {
|
|
88
|
+
local field="$1" valexpr="$2" flag="$3"; shift 3
|
|
89
|
+
if [ "$(printf '%s' "$FLAG_EVIDENCE" | jq -r 'if length > 0 and .[-1].type == "command" then "yes" else "no" end')" != "yes" ]; then
|
|
90
|
+
error_exit "${flag} must follow --command <cmd>"
|
|
91
|
+
fi
|
|
92
|
+
FLAG_EVIDENCE=$(printf '%s' "$FLAG_EVIDENCE" | jq -c "$@" ".[-1].${field} = ${valexpr}")
|
|
93
|
+
}
|
|
55
94
|
|
|
56
95
|
# Detect legacy JSON argument as the first parameter
|
|
57
96
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
@@ -109,6 +148,35 @@ while [[ $# -gt 0 ]]; do
|
|
|
109
148
|
INPUT_JSON="$2"
|
|
110
149
|
shift 2
|
|
111
150
|
;;
|
|
151
|
+
--artifact)
|
|
152
|
+
add_evidence '{type: "artifact", path: $p}' --arg p "$2"
|
|
153
|
+
shift 2
|
|
154
|
+
;;
|
|
155
|
+
--command)
|
|
156
|
+
add_evidence '{type: "command", command: $c}' --arg c "$2"
|
|
157
|
+
shift 2
|
|
158
|
+
;;
|
|
159
|
+
--exit-code)
|
|
160
|
+
[[ "$2" =~ ^-?[0-9]+$ ]] || error_exit "--exit-code must be an integer (got \"$2\")"
|
|
161
|
+
set_last_command_field exitCode '($n | tonumber)' --exit-code --arg n "$2"
|
|
162
|
+
shift 2
|
|
163
|
+
;;
|
|
164
|
+
--output-tail)
|
|
165
|
+
set_last_command_field outputTail '$t' --output-tail --arg t "$2"
|
|
166
|
+
shift 2
|
|
167
|
+
;;
|
|
168
|
+
--blocked-step)
|
|
169
|
+
BLOCKED_STEP="$2"
|
|
170
|
+
shift 2
|
|
171
|
+
;;
|
|
172
|
+
--blocked-reason)
|
|
173
|
+
BLOCKED_REASON="$2"
|
|
174
|
+
shift 2
|
|
175
|
+
;;
|
|
176
|
+
--evidence)
|
|
177
|
+
EVIDENCE_ARG="$2"
|
|
178
|
+
shift 2
|
|
179
|
+
;;
|
|
112
180
|
--help|-h)
|
|
113
181
|
print_usage
|
|
114
182
|
exit 0
|
|
@@ -152,6 +220,7 @@ if [ -n "$INPUT_JSON" ]; then
|
|
|
152
220
|
[ -z "$AGENT_ROLE" ] && AGENT_ROLE=$(printf '%s' "$INPUT" | jq -r '.role // .agentRole // empty')
|
|
153
221
|
ARTIFACTS=$(printf '%s' "$INPUT" | jq -c '.artifacts // empty')
|
|
154
222
|
BLOCKERS=$(printf '%s' "$INPUT" | jq -c '.blockers // empty')
|
|
223
|
+
[ -z "$EVIDENCE_ARG" ] && EVIDENCE_ARG=$(printf '%s' "$INPUT" | jq -c '.evidence // empty')
|
|
155
224
|
USE_STRUCTURED=$(printf '%s' "$INPUT" | jq -r '.structured // "false"')
|
|
156
225
|
[ "$USE_STRUCTURED" = "true" ] && STRUCTURED="true"
|
|
157
226
|
else
|
|
@@ -159,6 +228,24 @@ else
|
|
|
159
228
|
BLOCKERS=""
|
|
160
229
|
fi
|
|
161
230
|
|
|
231
|
+
# Assemble the evidence block (#873): --evidence / JSON `evidence` first, then
|
|
232
|
+
# the entries from --artifact / --command / --blocked-step flags.
|
|
233
|
+
if [ -n "$EVIDENCE_ARG" ]; then
|
|
234
|
+
if ! printf '%s' "$EVIDENCE_ARG" | jq -e 'type == "array"' >/dev/null 2>&1; then
|
|
235
|
+
error_exit "evidence must be a JSON array, e.g. '[{\"type\":\"artifact\",\"path\":\"/abs/file\"}]'"
|
|
236
|
+
fi
|
|
237
|
+
else
|
|
238
|
+
EVIDENCE_ARG='[]'
|
|
239
|
+
fi
|
|
240
|
+
if [ -n "$BLOCKED_STEP" ] || [ -n "$BLOCKED_REASON" ]; then
|
|
241
|
+
[ -n "$BLOCKED_STEP" ] && [ -n "$BLOCKED_REASON" ] || error_exit "--blocked-step and --blocked-reason go together: name the step that failed and why"
|
|
242
|
+
add_evidence '{type: "blocked", step: $s, reason: $r}' --arg s "$BLOCKED_STEP" --arg r "$BLOCKED_REASON"
|
|
243
|
+
fi
|
|
244
|
+
if [ "$(printf '%s' "$FLAG_EVIDENCE" | jq '[.[] | select(.type == "command" and (has("exitCode") | not))] | length')" != "0" ]; then
|
|
245
|
+
error_exit "every --command needs --exit-code <n> after it: the exit code is the evidence"
|
|
246
|
+
fi
|
|
247
|
+
EVIDENCE=$(jq -cn --argjson a "$EVIDENCE_ARG" --argjson b "$FLAG_EVIDENCE" '$a + $b')
|
|
248
|
+
|
|
162
249
|
require_param "sessionName (--session)" "$SESSION_NAME"
|
|
163
250
|
require_param "status (--status)" "$STATUS"
|
|
164
251
|
require_param "summary (--summary)" "$SUMMARY"
|
|
@@ -297,18 +384,31 @@ if [ "$STATUS" = "done" ]; then
|
|
|
297
384
|
# `completeItem`). Prior shape `{summary}` 400'd with
|
|
298
385
|
# `agentId is required` + `summary required in body.result`,
|
|
299
386
|
# forcing every worker into a direct-curl workaround.
|
|
387
|
+
#
|
|
388
|
+
# #873: the evidence block goes in result.evidence. Omitted when empty
|
|
389
|
+
# (the server then warns this release, refuses the next).
|
|
300
390
|
COMPLETE_BODY=$(jq -n \
|
|
301
391
|
--arg agentId "$SESSION_NAME" \
|
|
302
392
|
--arg summary "$SUMMARY" \
|
|
303
|
-
|
|
393
|
+
--argjson evidence "$EVIDENCE" \
|
|
394
|
+
'{agentId: $agentId, result: ({summary: $summary} + (if ($evidence | length) > 0 then {evidence: $evidence} else {} end))}')
|
|
304
395
|
# No `|| true`. A swallowed failure here is the inverse of the bug above:
|
|
305
396
|
# report-status would announce success while the WorkItem stayed open, and
|
|
306
397
|
# that is equally invisible. Report what actually happened either way.
|
|
307
398
|
if COMPLETE_RESULT=$(api_call POST "/task-pool/complete/${TARGET_WI_ID}" "$COMPLETE_BODY" 2>&1); then
|
|
308
399
|
# Echo the resolved id even on the happy path. Silent-but-correct is how
|
|
309
400
|
# this class hides — the caller must be able to see WHICH item closed.
|
|
310
|
-
|
|
311
|
-
|
|
401
|
+
# A `blocked` evidence entry is recorded as blocked, not done (#873);
|
|
402
|
+
# a completion without evidence carries the server's warning.
|
|
403
|
+
COMPLETE_WARNING=$(printf '%s' "$COMPLETE_RESULT" | jq -rs '(map(select(type == "object" and has("success"))) | last // {}) | .warning // empty' 2>/dev/null || true)
|
|
404
|
+
COMPLETE_RECORDED=$(printf '%s' "$COMPLETE_RESULT" | jq -rs '(map(select(type == "object" and has("success"))) | last // {}) | .recordedAs // empty' 2>/dev/null || true)
|
|
405
|
+
if [ "$COMPLETE_RECORDED" = "blocked" ]; then
|
|
406
|
+
jq -n --arg id "$TARGET_WI_ID" --arg how "$WI_RESOLUTION" \
|
|
407
|
+
'{workItem: $id, markedAs: "blocked", resolvedBy: $how, note: "blocked evidence: recorded as blocked, not done"}' >&2
|
|
408
|
+
else
|
|
409
|
+
jq -n --arg id "$TARGET_WI_ID" --arg how "$WI_RESOLUTION" --arg w "$COMPLETE_WARNING" \
|
|
410
|
+
'{completedWorkItem: $id, resolvedBy: $how} + (if $w != "" then {warning: $w} else {} end)' >&2
|
|
411
|
+
fi
|
|
312
412
|
else
|
|
313
413
|
jq -n --arg id "$TARGET_WI_ID" --arg err "$COMPLETE_RESULT" \
|
|
314
414
|
'{warning: "status reported, but completing the WorkItem FAILED — it is still open", workItemId: $id, error: $err}' >&2
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: To Do Add
|
|
3
|
-
description: Add a task to one of the owner's Microsoft To Do lists — title, optional due date, note and
|
|
4
|
-
version: 1.
|
|
3
|
+
description: Add a task to one of the owner's Microsoft To Do lists — title, optional due date, note, importance and steps (checklist items) (via the Microsoft grant held by Crewly Cloud).
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
category: productivity
|
|
6
6
|
skillType: claude-skill
|
|
7
7
|
assignableRoles:
|
|
@@ -18,6 +18,7 @@ triggers:
|
|
|
18
18
|
- add a microsoft to do task
|
|
19
19
|
- remind me in to do
|
|
20
20
|
- create an outlook task
|
|
21
|
+
- add a task with steps
|
|
21
22
|
tags:
|
|
22
23
|
- microsoft
|
|
23
24
|
- todo
|
|
@@ -35,8 +36,13 @@ execution:
|
|
|
35
36
|
```bash
|
|
36
37
|
bash execute.sh --title "Buy milk" # default list ("Tasks")
|
|
37
38
|
bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 is in Drive"
|
|
39
|
+
bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # ONE task with three steps
|
|
38
40
|
```
|
|
39
41
|
|
|
42
|
+
When the owner asks for items as **steps of one task** (a shopping run, a
|
|
43
|
+
packing list), use `--steps` — do not put them in the note, and do not make
|
|
44
|
+
one task per item unless he asked for separate tasks.
|
|
45
|
+
|
|
40
46
|
| Flag | Meaning |
|
|
41
47
|
|---|---|
|
|
42
48
|
| `--title` | Task title (required) |
|
|
@@ -44,13 +50,21 @@ bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --import
|
|
|
44
50
|
| `--due` | Due date `YYYY-MM-DD` |
|
|
45
51
|
| `--note` | Note shown under the task |
|
|
46
52
|
| `--importance` | `low` \| `normal` \| `high` |
|
|
53
|
+
| `--steps` | Comma-separated steps (checklist items), in order |
|
|
54
|
+
| `--step` | One step; repeat it for more (for a step that contains a comma) |
|
|
47
55
|
|
|
48
56
|
## Output
|
|
49
57
|
|
|
50
58
|
```json
|
|
51
59
|
{"success":true,"list":"Work","task":{"id":"AAMk…","title":"Send deck to Ann","status":"notStarted","importance":"high","due":"2026-10-01","note":"v3 is in Drive"}}
|
|
60
|
+
{"success":true,"list":"Groceries","task":{"id":"AAMk…","title":"Costco","status":"notStarted","steps":[{"id":"…","title":"Eggs","checked":false},{"id":"…","title":"Milk","checked":false}]}}
|
|
52
61
|
```
|
|
53
62
|
|
|
63
|
+
Steps are created after the task. If one fails, the task still exists and
|
|
64
|
+
the answer lists it in `failedSteps` (`[{"step":"Milk","error":"…"}]`):
|
|
65
|
+
add it with todo-update `--add-steps` — do **not** run todo-add again, that
|
|
66
|
+
would make a second task.
|
|
67
|
+
|
|
54
68
|
A list that does not exist is not created — make it with todo-lists
|
|
55
69
|
`--create` first.
|
|
56
70
|
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
# Usage:
|
|
8
8
|
# bash execute.sh --title "Buy milk" # default list
|
|
9
9
|
# bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 in Drive"
|
|
10
|
+
# bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # one task, three steps
|
|
10
11
|
# bash execute.sh '{"list":"Groceries","title":"Eggs"}'
|
|
11
12
|
# =============================================================================
|
|
12
13
|
set -euo pipefail
|
|
@@ -18,7 +19,8 @@ print_usage() {
|
|
|
18
19
|
Usage:
|
|
19
20
|
bash execute.sh --title "Buy milk" # default list
|
|
20
21
|
bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 in Drive"
|
|
21
|
-
bash execute.sh
|
|
22
|
+
bash execute.sh --list Groceries --title "Costco" --steps "Eggs,Milk,Bread" # one task, three steps
|
|
23
|
+
bash execute.sh '{"list":"Groceries","title":"Costco","steps":["Eggs","Milk"]}'
|
|
22
24
|
|
|
23
25
|
Options:
|
|
24
26
|
--title, -t Task title (required)
|
|
@@ -26,6 +28,8 @@ Options:
|
|
|
26
28
|
--due Due date, YYYY-MM-DD
|
|
27
29
|
--note Note text shown under the task
|
|
28
30
|
--importance low | normal | high
|
|
31
|
+
--steps Comma-separated steps (checklist items) to create on the task
|
|
32
|
+
--step One step; repeat for more (use when a step contains a comma)
|
|
29
33
|
--help | -h Show this help
|
|
30
34
|
EOF_USAGE
|
|
31
35
|
}
|
|
@@ -38,6 +42,12 @@ fail_from() {
|
|
|
38
42
|
|
|
39
43
|
uri() { jq -rn --arg v "$1" '$v|@uri'; }
|
|
40
44
|
|
|
45
|
+
# Append step titles to a JSON array: $1 = array, $2 = text, $3 = "split" to
|
|
46
|
+
# split the text on commas. Titles are trimmed; empty ones are dropped.
|
|
47
|
+
add_steps() {
|
|
48
|
+
jq -c --arg v "$2" --arg mode "${3:-}" '. + (if $mode == "split" then ($v | split(",")) else [$v] end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0)))' <<<"$1"
|
|
49
|
+
}
|
|
50
|
+
|
|
41
51
|
# api_call may print a one-line warning to stderr (no CREWLY_SESSION_NAME);
|
|
42
52
|
# the backend answer is always the last line. On failure print the mapped
|
|
43
53
|
# failure JSON (fail_from) and return 1.
|
|
@@ -52,7 +62,7 @@ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
|
52
62
|
INPUT_JSON="$1"
|
|
53
63
|
shift || true
|
|
54
64
|
fi
|
|
55
|
-
TITLE=""; LIST=""; DUE=""; NOTE=""; IMPORTANCE=""
|
|
65
|
+
TITLE=""; LIST=""; DUE=""; NOTE=""; IMPORTANCE=""; STEPS='[]'
|
|
56
66
|
while [[ $# -gt 0 ]]; do
|
|
57
67
|
case "$1" in
|
|
58
68
|
--title|-t) [ $# -ge 2 ] || error_exit "--title requires a value"; TITLE="$2"; shift 2 ;;
|
|
@@ -60,6 +70,8 @@ while [[ $# -gt 0 ]]; do
|
|
|
60
70
|
--due) [ $# -ge 2 ] || error_exit "--due requires a value"; DUE="$2"; shift 2 ;;
|
|
61
71
|
--note) [ $# -ge 2 ] || error_exit "--note requires a value"; NOTE="$2"; shift 2 ;;
|
|
62
72
|
--importance) [ $# -ge 2 ] || error_exit "--importance requires a value"; IMPORTANCE="$2"; shift 2 ;;
|
|
73
|
+
--steps) [ $# -ge 2 ] || error_exit "--steps requires a value"; STEPS=$(add_steps "$STEPS" "$2" split); shift 2 ;;
|
|
74
|
+
--step) [ $# -ge 2 ] || error_exit "--step requires a value"; STEPS=$(add_steps "$STEPS" "$2"); shift 2 ;;
|
|
63
75
|
--help|-h) print_usage; exit 0 ;;
|
|
64
76
|
*) error_exit "Unknown option: $1" ;;
|
|
65
77
|
esac
|
|
@@ -71,14 +83,18 @@ if [ -n "$INPUT_JSON" ]; then
|
|
|
71
83
|
[ -z "$DUE" ] && DUE=$(printf '%s' "$INPUT" | jq -r '.due // empty')
|
|
72
84
|
[ -z "$NOTE" ] && NOTE=$(printf '%s' "$INPUT" | jq -r '.note // empty')
|
|
73
85
|
[ -z "$IMPORTANCE" ] && IMPORTANCE=$(printf '%s' "$INPUT" | jq -r '.importance // empty')
|
|
86
|
+
if [ "$STEPS" = '[]' ]; then
|
|
87
|
+
STEPS=$(printf '%s' "$INPUT" | jq -c '.steps // [] | if type == "string" then split(",") else map(tostring) end | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))')
|
|
88
|
+
fi
|
|
74
89
|
fi
|
|
75
90
|
[ -n "$TITLE" ] || error_exit "--title is required"
|
|
76
91
|
if [ -n "$DUE" ] && ! [[ "$DUE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then error_exit "--due must look like 2026-10-01"; fi
|
|
77
|
-
BODY=$(jq -cn --arg title "$TITLE" --arg list "$LIST" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" \
|
|
92
|
+
BODY=$(jq -cn --arg title "$TITLE" --arg list "$LIST" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" --argjson steps "$STEPS" \
|
|
78
93
|
'{title: $title}
|
|
79
94
|
+ (if $list != "" then {list: $list} else {} end)
|
|
80
95
|
+ (if $due != "" then {due: $due} else {} end)
|
|
81
96
|
+ (if $note != "" then {note: $note} else {} end)
|
|
82
|
-
+ (if $imp != "" then {importance: $imp} else {} end)
|
|
97
|
+
+ (if $imp != "" then {importance: $imp} else {} end)
|
|
98
|
+
+ (if ($steps | length) > 0 then {steps: $steps} else {} end)')
|
|
83
99
|
RESPONSE=$(call POST "/microsoft-todo/tasks" "$BODY") || { printf '%s\n' "$RESPONSE"; exit 1; }
|
|
84
|
-
printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task}'
|
|
100
|
+
printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task} + (if .data.failedSteps then {failedSteps: .data.failedSteps} else {} end)'
|