crewly 1.14.0 → 1.15.0
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/README.md +28 -0
- package/config/constants.ts +57 -0
- package/config/index.ts +6 -2
- package/config/roles/architect/soul.md +31 -0
- package/config/roles/auditor/soul.md +30 -0
- package/config/roles/backend-developer/soul.md +30 -0
- package/config/roles/content-strategist/soul.md +29 -0
- package/config/roles/designer/soul.md +30 -0
- package/config/roles/developer/soul.md +4 -1
- package/config/roles/frontend-developer/soul.md +28 -0
- package/config/roles/fullstack-dev/soul.md +28 -0
- package/config/roles/generalist/soul.md +28 -0
- package/config/roles/ops/soul.md +31 -0
- package/config/roles/orchestrator/fragments/lifecycle.md +2 -22
- package/config/roles/orchestrator/fragments/recovery.md +1 -1
- package/config/roles/orchestrator/prompt.md +18 -49
- package/config/roles/orchestrator/soul.md +2 -1
- package/config/roles/product-manager/prompt.md +1 -1
- package/config/roles/product-manager/soul.md +30 -0
- package/config/roles/qa/soul.md +31 -0
- package/config/roles/qa-engineer/soul.md +31 -0
- package/config/roles/researcher/soul.md +4 -1
- package/config/roles/sales/soul.md +30 -0
- package/config/roles/support/soul.md +30 -0
- package/config/roles/team-leader/prompt.md +1 -1
- package/config/roles/team-leader/soul.md +32 -0
- package/config/roles/tpm/soul.md +31 -0
- package/config/roles/ux-designer/soul.md +31 -0
- package/config/skills/_common/lib.sh +124 -2
- package/config/skills/_common/lib.test.sh +68 -1
- package/config/skills/orchestrator/delegate-task/SKILL.md +17 -21
- package/config/skills/orchestrator/delegate-task/execute.sh +18 -9
- package/config/skills/orchestrator/delegate-task/execute.test.sh +1 -1
- package/config/skills/orchestrator/wiki-migrate/SKILL.md +33 -3
- package/config/skills/orchestrator/wiki-migrate/compact.jq +36 -0
- package/config/skills/orchestrator/wiki-migrate/execute.sh +35 -5
- package/config/skills/orchestrator/wiki-migrate/execute.test.sh +124 -0
- package/config/skills/team-leader/verify-output/execute.sh +14 -6
- package/config/skills/team-leader/verify-output/execute.test.sh +117 -0
- package/dist/backend/backend/src/constants.d.ts +100 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +88 -1
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.controller.js +4 -6
- package/dist/backend/backend/src/controllers/mission/mission-policy.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.d.ts +10 -0
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +78 -16
- package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +11 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +14 -0
- 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 +59 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts +9 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +14 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.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 +16 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +12 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +195 -9
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +139 -0
- package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/middleware/api-token.middleware.js +301 -0
- package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +3 -1
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +68 -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 +280 -10
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +7 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js +10 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts +8 -0
- package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.js +11 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +36 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +66 -9
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +7 -0
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +10 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +197 -0
- 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 +422 -3
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +27 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +50 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.js +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +35 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +73 -2
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +42 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js +33 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +13 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +26 -2
- package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-archive.service.js +91 -10
- package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts +15 -2
- package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/backup/backup-restore.service.js +100 -21
- package/dist/backend/backend/src/services/backup/backup-restore.service.js.map +1 -1
- package/dist/backend/backend/src/services/backup/backup.types.d.ts +85 -2
- package/dist/backend/backend/src/services/backup/backup.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/backup/backup.types.js +21 -0
- package/dist/backend/backend/src/services/backup/backup.types.js.map +1 -1
- package/dist/backend/backend/src/services/backup/project-file-filter.d.ts +35 -0
- package/dist/backend/backend/src/services/backup/project-file-filter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/backup/project-file-filter.js +90 -0
- package/dist/backend/backend/src/services/backup/project-file-filter.js.map +1 -0
- package/dist/backend/backend/src/services/budget/team-budget-gate.service.d.ts +165 -0
- package/dist/backend/backend/src/services/budget/team-budget-gate.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/budget/team-budget-gate.service.js +364 -0
- package/dist/backend/backend/src/services/budget/team-budget-gate.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +29 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +42 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +16 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +22 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/core/api-token.service.d.ts +78 -0
- package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/api-token.service.js +149 -0
- package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/logger.service.d.ts +10 -1
- package/dist/backend/backend/src/services/core/logger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/logger.service.js +18 -3
- package/dist/backend/backend/src/services/core/logger.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +11 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +34 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +7 -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 +29 -7
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.d.ts +140 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.js +346 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +27 -3
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +42 -7
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +47 -0
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +67 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +22 -15
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +24 -15
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +7 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js +9 -3
- package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts +27 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.js +110 -22
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js +7 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +52 -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 +132 -6
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-boot.d.ts +87 -0
- package/dist/backend/backend/src/services/v3/escalation-boot.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/escalation-boot.js +128 -0
- package/dist/backend/backend/src/services/v3/escalation-boot.js.map +1 -0
- package/dist/backend/backend/src/services/v3/escalation.service.d.ts +1 -1
- package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation.service.js +4 -4
- package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/kr-completion.subscriber.d.ts +118 -0
- package/dist/backend/backend/src/services/v3/kr-completion.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-completion.subscriber.js +277 -0
- package/dist/backend/backend/src/services/v3/kr-completion.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/kr-tracking.service.js +3 -6
- package/dist/backend/backend/src/services/v3/kr-tracking.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-executor.service.d.ts +5 -0
- package/dist/backend/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-executor.service.js +36 -0
- package/dist/backend/backend/src/services/v3/mission-executor.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-paths.d.ts +69 -0
- package/dist/backend/backend/src/services/v3/mission-paths.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-paths.js +92 -0
- package/dist/backend/backend/src/services/v3/mission-paths.js.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-period.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-period.service.js +1 -12
- package/dist/backend/backend/src/services/v3/mission-period.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +74 -2
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js +251 -9
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-cascade.service.d.ts +6 -4
- package/dist/backend/backend/src/services/v3/okr-cascade.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-cascade.service.js +11 -10
- package/dist/backend/backend/src/services/v3/okr-cascade.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-review.service.d.ts +24 -0
- package/dist/backend/backend/src/services/v3/okr-review.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-review.service.js +63 -3
- package/dist/backend/backend/src/services/v3/okr-review.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts +17 -0
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +62 -13
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +6 -2
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js +14 -9
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +14 -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 +31 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +21 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +53 -3
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +4 -2
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +15 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +16 -0
- 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/v2/index.d.ts +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.js +1 -1
- package/dist/backend/backend/src/types/v2/index.js.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.d.ts +41 -0
- package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.js +29 -0
- package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/backend/backend/src/utils/network-exposure.utils.d.ts +67 -0
- package/dist/backend/backend/src/utils/network-exposure.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/network-exposure.utils.js +92 -0
- package/dist/backend/backend/src/utils/network-exposure.utils.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +53 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +54 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +2 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +6 -6
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +100 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +88 -1
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +68 -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 +280 -10
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +7 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js +10 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +8 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js +11 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +36 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +66 -9
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +7 -0
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +10 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +197 -0
- 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 +422 -3
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +27 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +50 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +35 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +73 -2
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +42 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +33 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +13 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +26 -2
- package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-archive.service.js +91 -10
- package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts +15 -2
- package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/backup/backup-restore.service.js +100 -21
- package/dist/cli/backend/src/services/backup/backup-restore.service.js.map +1 -1
- package/dist/cli/backend/src/services/backup/backup.types.d.ts +85 -2
- package/dist/cli/backend/src/services/backup/backup.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/backup/backup.types.js +21 -0
- package/dist/cli/backend/src/services/backup/backup.types.js.map +1 -1
- package/dist/cli/backend/src/services/backup/project-file-filter.d.ts +35 -0
- package/dist/cli/backend/src/services/backup/project-file-filter.d.ts.map +1 -0
- package/dist/cli/backend/src/services/backup/project-file-filter.js +90 -0
- package/dist/cli/backend/src/services/backup/project-file-filter.js.map +1 -0
- package/dist/cli/backend/src/services/budget/team-budget-gate.service.d.ts +165 -0
- package/dist/cli/backend/src/services/budget/team-budget-gate.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/budget/team-budget-gate.service.js +364 -0
- package/dist/cli/backend/src/services/budget/team-budget-gate.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +29 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +42 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +16 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +22 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/core/api-token.service.d.ts +78 -0
- package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/api-token.service.js +149 -0
- package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/logger.service.d.ts +10 -1
- package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/logger.service.js +18 -3
- package/dist/cli/backend/src/services/core/logger.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +11 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +34 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +27 -3
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +42 -7
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +47 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +67 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +7 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.js +9 -3
- package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts +27 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.js +110 -22
- package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +52 -0
- 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 +132 -6
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js +3 -6
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts +5 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/mission-executor.service.js +36 -0
- package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/mission-paths.d.ts +69 -0
- package/dist/cli/backend/src/services/v3/mission-paths.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/mission-paths.js +92 -0
- package/dist/cli/backend/src/services/v3/mission-paths.js.map +1 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +6 -2
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/v3-data.service.js +14 -9
- package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.d.ts +4 -2
- package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.js +15 -0
- package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +16 -0
- 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/v2/index.d.ts +1 -1
- package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/index.js +1 -1
- package/dist/cli/backend/src/types/v2/index.js.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.d.ts +41 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.js +29 -0
- package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/cli/cli/src/commands/backup.d.ts +25 -0
- package/dist/cli/cli/src/commands/backup.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/backup.js +120 -6
- package/dist/cli/cli/src/commands/backup.js.map +1 -1
- package/dist/cli/cli/src/commands/doctor.d.ts +58 -0
- package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/doctor.js +163 -0
- package/dist/cli/cli/src/commands/doctor.js.map +1 -0
- package/dist/cli/cli/src/commands/service.d.ts +68 -11
- package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/service.js +183 -51
- package/dist/cli/cli/src/commands/service.js.map +1 -1
- package/dist/cli/cli/src/commands/token.d.ts +53 -0
- package/dist/cli/cli/src/commands/token.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/token.js +70 -0
- package/dist/cli/cli/src/commands/token.js.map +1 -0
- package/dist/cli/cli/src/index.js +40 -5
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/scripts/check-native-toolchain.d.ts +21 -0
- package/dist/cli/cli/src/scripts/check-native-toolchain.d.ts.map +1 -0
- package/dist/cli/cli/src/scripts/check-native-toolchain.js +40 -0
- package/dist/cli/cli/src/scripts/check-native-toolchain.js.map +1 -0
- package/dist/cli/cli/src/utils/native-toolchain.d.ts +111 -0
- package/dist/cli/cli/src/utils/native-toolchain.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/native-toolchain.js +146 -0
- package/dist/cli/cli/src/utils/native-toolchain.js.map +1 -0
- package/dist/cli/cli/src/utils/package-root.d.ts +55 -0
- package/dist/cli/cli/src/utils/package-root.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/package-root.js +107 -0
- package/dist/cli/cli/src/utils/package-root.js.map +1 -0
- package/dist/cli/cli/src/utils/version-check.d.ts +18 -2
- package/dist/cli/cli/src/utils/version-check.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/version-check.js +51 -4
- package/dist/cli/cli/src/utils/version-check.js.map +1 -1
- package/dist/cli/config/constants.d.ts +53 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +54 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +2 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +6 -6
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/index-203224f9.js +4961 -0
- package/frontend/dist/assets/index-dcaf6c88.css +42 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +3 -2
- package/config/constants.d.ts.map +0 -1
- package/config/index.d.ts.map +0 -1
- package/frontend/dist/assets/index-190a957f.js +0 -4961
- package/frontend/dist/assets/index-88feb412.css +0 -42
|
@@ -47,7 +47,7 @@ The script auto-resolves `config/skills/...` references to absolute paths so del
|
|
|
47
47
|
| `--task-type` | `taskType` | No | Task type: `general`, `technical` (default: `general`) |
|
|
48
48
|
| `--force-cross-team` | `forceCrossTeam` | No | Allow cross-team delegation |
|
|
49
49
|
| `--request-id` / `-R` | `requestId` | No | Parent V3 Request ID; tags the resulting WorkItem so `Request.workItemIds[]` is populated by the SLA subscriber (Pipeline-#4 fix) |
|
|
50
|
-
| `
|
|
50
|
+
| `--fallback-minutes` | — | No | Minutes until the ONE §3.0 fallback check fires for this delegation (default `120` ≈ 2× a TL milestone ETA). `0` disables it. Not cancelled on completion — keep it at 2× ETA, never a poll interval |
|
|
51
51
|
|
|
52
52
|
## Usage — CLI Flags (preferred)
|
|
53
53
|
|
|
@@ -71,51 +71,47 @@ bash execute.sh --to agent-joe --task-file /tmp/task-description.txt --priority
|
|
|
71
71
|
bash execute.sh '{"to":"agent-joe","task":"Implement the login form","priority":"high","context":"Use React hooks","projectPath":"/path/to/project"}'
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
### With
|
|
74
|
+
### With the fallback timer disabled (opt-out)
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
|
-
bash execute.sh
|
|
77
|
+
bash execute.sh --to agent-joe --task "Implement the login form" --priority high --project /path/to/project --fallback-minutes 0
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
## Examples
|
|
81
81
|
|
|
82
|
-
### Example 1: Basic delegation (
|
|
82
|
+
### Example 1: Basic delegation (one fallback timer by default)
|
|
83
83
|
```bash
|
|
84
84
|
bash config/skills/orchestrator/delegate-task/execute.sh '{"to":"agent-joe","task":"Fix the login bug","priority":"high"}'
|
|
85
85
|
```
|
|
86
86
|
This will automatically:
|
|
87
|
-
1.
|
|
88
|
-
2.
|
|
89
|
-
3. Schedule a recurring check every 5 minutes (auto-reminds orchestrator to check progress)
|
|
90
|
-
4. Link all monitoring IDs to the task for auto-cleanup on completion
|
|
87
|
+
1. Create + claim the WorkItem in the task pool and deliver it to agent-joe's terminal
|
|
88
|
+
2. Schedule ONE fallback check (`fallbackTriggerId`, fires after `--fallback-minutes`, default 120) that wakes the orchestrator with a "Fallback check on agent-joe" WorkItem if the work is still open
|
|
91
89
|
|
|
92
|
-
|
|
90
|
+
It does NOT set up a recurring check — the reconciler escalates stalled or unverified work on its own. Add the `agent:idle_after_task` watch yourself per §3.0; never add a second fallback or a self-targeted "check on agent" WorkItem for the same delegation.
|
|
91
|
+
|
|
92
|
+
### Example 2: Delegation with project tracking
|
|
93
93
|
```bash
|
|
94
94
|
bash config/skills/orchestrator/delegate-task/execute.sh '{"to":"agent-joe","task":"Implement user auth","priority":"high","projectPath":"/path/to/project"}'
|
|
95
95
|
```
|
|
96
96
|
Also creates a task file in the project's `.crewly/tasks/` directory.
|
|
97
97
|
|
|
98
|
-
### Example 3:
|
|
98
|
+
### Example 3: Cross-team delegation with a longer fallback (2× an 8 h ETA)
|
|
99
99
|
```bash
|
|
100
|
-
bash config/skills/orchestrator/delegate-task/execute.sh
|
|
100
|
+
bash config/skills/orchestrator/delegate-task/execute.sh --to agent-sam --task "Ship the billing rewrite" --priority normal --fallback-minutes 720
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
### Example 4:
|
|
103
|
+
### Example 4: Quick fix with the fallback disabled
|
|
104
104
|
```bash
|
|
105
|
-
bash config/skills/orchestrator/delegate-task/execute.sh
|
|
105
|
+
bash config/skills/orchestrator/delegate-task/execute.sh --to agent-joe --task "Quick fix" --priority low --fallback-minutes 0
|
|
106
106
|
```
|
|
107
107
|
|
|
108
108
|
## Output
|
|
109
109
|
|
|
110
110
|
JSON confirmation of task delivery. When `projectPath` is provided, also returns the created task file path.
|
|
111
111
|
|
|
112
|
-
##
|
|
113
|
-
|
|
114
|
-
When the agent completes the task (via `report-status` with `status: done` or `complete-task`), all linked monitoring is automatically cleaned up:
|
|
115
|
-
- Scheduled checks are cancelled
|
|
116
|
-
- Event subscriptions are unsubscribed
|
|
112
|
+
## Cleanup
|
|
117
113
|
|
|
118
|
-
|
|
114
|
+
The fallback trigger is **not** cancelled when the task completes. When it fires on already-verified work, complete the resulting check WorkItem immediately; to avoid the wake-up altogether, `cancel-followup --id <fallbackTriggerId from this skill's output>` once you have verified the deliverable (§3.0 step 3).
|
|
119
115
|
|
|
120
116
|
## Delivery Strategy
|
|
121
117
|
|
|
@@ -141,6 +137,6 @@ Error messages are output to **stdout** (JSON format) so the orchestrator can re
|
|
|
141
137
|
|
|
142
138
|
- `assign-task` — for formal task tracking in the management system (file-based kanban)
|
|
143
139
|
- `send-message` — for simple messages without task structure
|
|
144
|
-
- `
|
|
145
|
-
- `
|
|
140
|
+
- `watch-for-event` — the `agent:idle_after_task` watch that completes the §3.0 loop (not created by this skill)
|
|
141
|
+
- `cancel-followup` — cancel the fallback trigger once the deliverable is verified
|
|
146
142
|
- `report-status` — agent reports completion, triggers auto-cleanup
|
|
@@ -17,16 +17,25 @@ TASK_TYPE="general"
|
|
|
17
17
|
TEAM_ID=""
|
|
18
18
|
FORCE_CROSS_TEAM="false"
|
|
19
19
|
REQUEST_ID=""
|
|
20
|
-
# Self-heal fix #3 (2026-05-20): default fallback timer
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
20
|
+
# Self-heal fix #3 (2026-05-20): default fallback timer. Per the
|
|
21
|
+
# orchestrator prompt §3.0 the orc is supposed to set 2× ETA manually
|
|
22
|
+
# for every dispatch, but the convention was unenforced — observable in
|
|
23
|
+
# the 2026-05-20 ESTestNode incident where the orc set only the idle
|
|
24
|
+
# subscription and not the fallback timer, leaving the orc clueless when
|
|
25
|
+
# Sora never started. Auto-creating the fallback at dispatch time
|
|
26
|
+
# guarantees the dual-signal contract is honored.
|
|
27
|
+
#
|
|
28
|
+
# Default raised 30 → 120 min (2026-09-18): the trigger is never cancelled
|
|
29
|
+
# on completion, so at 30 min it fired inside the normal 30–90 min TL
|
|
30
|
+
# ETA on essentially every delegation and materialised a "Fallback check
|
|
31
|
+
# on <agent>" WorkItem for the orc — 26 of 65 real WorkItems on one
|
|
32
|
+
# production box, each a full-context wake-up that found nothing to do.
|
|
33
|
+
# 120 min is the §3.0 "2× ETA" figure for TL milestone delegations; the
|
|
34
|
+
# reconciler (2h unverified escalation, task:queued_too_long) covers the
|
|
35
|
+
# genuinely stuck case before this fires.
|
|
27
36
|
# Caller can override via --fallback-minutes N, or disable with
|
|
28
37
|
# --fallback-minutes 0.
|
|
29
|
-
FALLBACK_MINUTES="
|
|
38
|
+
FALLBACK_MINUTES="120"
|
|
30
39
|
|
|
31
40
|
# Detect legacy JSON argument
|
|
32
41
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
@@ -345,7 +354,7 @@ if [ -n "$WI_ID" ] && [ "${FALLBACK_MINUTES:-0}" -gt 0 ] 2>/dev/null; then
|
|
|
345
354
|
--arg createdBy "delegate-task" \
|
|
346
355
|
--arg name "fallback-${TO}-${WI_ID:0:8}" \
|
|
347
356
|
--arg title "Fallback check on ${TO} for task ${WI_ID:0:8}" \
|
|
348
|
-
--arg description "Per §3.0: ${FALLBACK_MINUTES}min fallback after dispatch to ${TO}.
|
|
357
|
+
--arg description "Per §3.0: ${FALLBACK_MINUTES}min fallback after dispatch to ${TO}. If ${WI_ID} is already done/verified, complete this check immediately — no action. Otherwise: if running but no output, re-prompt; if still queued, re-target or fail-fast. Do NOT create further check WorkItems for yourself." \
|
|
349
358
|
'{
|
|
350
359
|
type: $type,
|
|
351
360
|
config: {type: "time", fireAt: $fireAt},
|
|
@@ -152,7 +152,7 @@ OUT=$(CALL_LOG="$CALL_LOG" CREWLY_ROOT=/tmp/crewly-test \
|
|
|
152
152
|
|
|
153
153
|
assert_log_contains "POST /triggers fires after dispatch by default" "POST /triggers"
|
|
154
154
|
assert_output_contains "result reports fallbackTriggerId" "fallbackTriggerId" "$OUT"
|
|
155
|
-
assert_output_contains "result reports fallbackMinutes=
|
|
155
|
+
assert_output_contains "result reports fallbackMinutes=120 (default = §3.0 2× TL ETA)" '"fallbackMinutes": 120' "$OUT"
|
|
156
156
|
|
|
157
157
|
# --- Test 4: fallback can be disabled via --fallback-minutes 0 ---
|
|
158
158
|
> "$CALL_LOG"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Wiki Migrate
|
|
3
3
|
description: One-shot conversion from legacy `.crewly/knowledge/*.json` + loose `.md` + agent `memory.json` into the v2.1 three-scope vault structure. Default dry-run; idempotent; never deletes legacy files.
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
category: knowledge
|
|
6
6
|
skillType: claude-skill
|
|
7
7
|
assignableRoles:
|
|
@@ -65,14 +65,39 @@ Vault picker:
|
|
|
65
65
|
| `--project-root <abs path>` | yes | — | The dir containing `.crewly/`. |
|
|
66
66
|
| `--apply` | no | off | Execute writes. Without this, run a dry-run scan. |
|
|
67
67
|
| `--no-memory` | no | off | Skip the per-agent `memory.json` import. |
|
|
68
|
+
| `--full` (or `"full": true`) | no | off | Return the raw backend payload including the full `proposedPages` array. Default output is the compact report below. |
|
|
69
|
+
|
|
70
|
+
## Output: compact by default
|
|
71
|
+
|
|
72
|
+
The backend payload carries one row per proposed page — hundreds of entries on a real project — and re-reading it on every scan is a context-cost problem, not a decision aid. By default the skill therefore returns a **compact report**:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"ok": true, "vaultPath": "...", "legacyDetected": true,
|
|
77
|
+
"bootstrapNeeded": { "project": true, "global": false, "teams": [] },
|
|
78
|
+
"summary": { "decisions": 10, "patterns": 8, "...": 0, "alreadyMigrated": 8 },
|
|
79
|
+
"totalProposed": 25, "alreadyMigrated": 8, "skippedOther": 1, "netNew": 16,
|
|
80
|
+
"routingUncertain": 2,
|
|
81
|
+
"byCategory": { "decision": { "proposed": 10, "netNew": 6 }, "pattern": { "...": 0 } },
|
|
82
|
+
"netNewSample": [ "llm-curated/decisions/2026-05-01-foo.md", "..." ],
|
|
83
|
+
"hint": "compact view — pass --full for the complete proposedPages array"
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
- `byCategory` is keyed by `sourceType`; `netNew` = pages without a `skipReason`.
|
|
88
|
+
- `netNewSample` lists the first 10 net-new target paths (`WIKI_MIGRATE_SAMPLE_SIZE` env overrides the count).
|
|
89
|
+
- Apply-only keys (`applied`, `skipped`, `bootstrapped`, `manifestPath`) pass through unchanged.
|
|
90
|
+
|
|
91
|
+
Only pass `--full` when you actually need per-row detail (a specific `sourceFile`, `sourceId`, or the `routingUncertain` rows). Even then the shared skill output cap applies: very large payloads are parked under `$CREWLY_HOME/tmp/skill-output/` and you get a `{"truncated":true,"file":...}` envelope — read the file with `jq` and select the fields you need.
|
|
68
92
|
|
|
69
93
|
## What you do with the report
|
|
70
94
|
|
|
71
95
|
**On scan (dry-run):**
|
|
72
|
-
-
|
|
96
|
+
- `netNew == 0` → nothing to do; stop here.
|
|
97
|
+
- Read `byCategory` / `netNewSample` to sanity-check what will land; use `--full` only if a specific row needs inspection.
|
|
73
98
|
- Look at `bootstrapNeeded` — confirms which vaults will be created.
|
|
74
99
|
- Look at `summary` — counts per source type.
|
|
75
|
-
-
|
|
100
|
+
- `routingUncertain` counts rows that will land in the project vault but flagged for later human review (`--full` shows which).
|
|
76
101
|
|
|
77
102
|
**On apply:**
|
|
78
103
|
- Confirm `applied` count matches the proposal.
|
|
@@ -97,6 +122,11 @@ bash execute.sh --project-root /Users/me/code/myproject --apply
|
|
|
97
122
|
bash execute.sh --project-root /Users/me/code/myproject --no-memory --apply
|
|
98
123
|
```
|
|
99
124
|
|
|
125
|
+
**Inspect every proposed row (raw payload):**
|
|
126
|
+
```bash
|
|
127
|
+
bash execute.sh --project-root /Users/me/code/myproject --full
|
|
128
|
+
```
|
|
129
|
+
|
|
100
130
|
## Failure modes
|
|
101
131
|
|
|
102
132
|
- `400 invalid_input` — `projectRoot` is not absolute, or `confirm` was missing on apply (skill handles this automatically).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# wiki-migrate compact report filter.
|
|
2
|
+
#
|
|
3
|
+
# The backend's scan/apply payload carries the full `proposedPages` array —
|
|
4
|
+
# hundreds of rows on a real project — and the orchestrator only needs the
|
|
5
|
+
# shape of the migration to decide whether to apply it. This filter drops the
|
|
6
|
+
# array and replaces it with counts (by sourceType), the already-migrated /
|
|
7
|
+
# net-new split, and a short sample of net-new target paths.
|
|
8
|
+
#
|
|
9
|
+
# Every other top-level key (ok, vaultPath, legacyDetected, bootstrapNeeded,
|
|
10
|
+
# summary, applied, skipped, bootstrapped, manifestPath, ...) passes through.
|
|
11
|
+
#
|
|
12
|
+
# Args: $sample (number) — how many net-new relPaths to include.
|
|
13
|
+
def is_new: (.skipReason // "") == "";
|
|
14
|
+
|
|
15
|
+
. as $r
|
|
16
|
+
| ($r.proposedPages // []) as $pages
|
|
17
|
+
| ($pages | map(select(is_new))) as $new
|
|
18
|
+
| ($r | del(.proposedPages))
|
|
19
|
+
+ {
|
|
20
|
+
totalProposed: ($pages | length),
|
|
21
|
+
alreadyMigrated: ($pages | map(select(.skipReason == "already migrated")) | length),
|
|
22
|
+
skippedOther: ($pages | map(select((.skipReason // "") != "" and .skipReason != "already migrated")) | length),
|
|
23
|
+
netNew: ($new | length),
|
|
24
|
+
routingUncertain: ($pages | map(select(.routingUncertain == true)) | length),
|
|
25
|
+
byCategory: (
|
|
26
|
+
$pages
|
|
27
|
+
| group_by(.sourceType)
|
|
28
|
+
| map({
|
|
29
|
+
key: (.[0].sourceType // "unknown"),
|
|
30
|
+
value: { proposed: length, netNew: (map(select(is_new)) | length) }
|
|
31
|
+
})
|
|
32
|
+
| from_entries
|
|
33
|
+
),
|
|
34
|
+
netNewSample: ($new | .[:$sample] | map(.targetRelativePath)),
|
|
35
|
+
hint: "compact view — pass --full for the complete proposedPages array"
|
|
36
|
+
}
|
|
@@ -12,18 +12,30 @@
|
|
|
12
12
|
# Safe to re-run. The manifest at <project>/.crewly/wiki/.migration-state.json
|
|
13
13
|
# tracks already-migrated entries by content hash + sourceId.
|
|
14
14
|
#
|
|
15
|
+
# Output is a COMPACT report by default (counts by sourceType, alreadyMigrated
|
|
16
|
+
# vs netNew, first few net-new target paths). The raw backend payload carries
|
|
17
|
+
# the full `proposedPages` array — hundreds of rows — and is only returned
|
|
18
|
+
# with --full.
|
|
19
|
+
#
|
|
15
20
|
# Usage:
|
|
16
|
-
# bash execute.sh --project-root /abs/path # scan
|
|
21
|
+
# bash execute.sh --project-root /abs/path # scan (compact)
|
|
22
|
+
# bash execute.sh --project-root /abs/path --full # scan (raw proposedPages)
|
|
17
23
|
# bash execute.sh --project-root /abs/path --apply # write
|
|
18
24
|
# bash execute.sh --project-root /abs/path --no-memory --apply # skip agent memory.json copies
|
|
19
25
|
set -euo pipefail
|
|
20
26
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
21
27
|
source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
22
28
|
|
|
29
|
+
# Number of net-new target paths listed in the compact report.
|
|
30
|
+
WIKI_MIGRATE_SAMPLE_SIZE="${WIKI_MIGRATE_SAMPLE_SIZE:-10}"
|
|
31
|
+
COMPACT_FILTER="${SCRIPT_DIR}/compact.jq"
|
|
32
|
+
|
|
23
33
|
INPUT_JSON=""
|
|
24
34
|
PROJECT_ROOT=""
|
|
25
35
|
APPLY="false"
|
|
26
36
|
INCLUDE_MEMORY="true"
|
|
37
|
+
# lib.sh sets CREWLY_SKILL_FULL_OUTPUT=1 when --full is anywhere in argv.
|
|
38
|
+
FULL="${CREWLY_SKILL_FULL_OUTPUT:-0}"
|
|
27
39
|
|
|
28
40
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
29
41
|
INPUT_JSON="$1"; shift || true
|
|
@@ -34,6 +46,7 @@ while [[ $# -gt 0 ]]; do
|
|
|
34
46
|
--project-root|-p) PROJECT_ROOT="$2"; shift 2 ;;
|
|
35
47
|
--apply|-a) APPLY="true"; shift ;;
|
|
36
48
|
--no-memory) INCLUDE_MEMORY="false"; shift ;;
|
|
49
|
+
--full|-f) FULL="1"; shift ;;
|
|
37
50
|
--json|-j) INPUT_JSON="$2"; shift 2 ;;
|
|
38
51
|
--help|-h)
|
|
39
52
|
cat <<EOF
|
|
@@ -42,14 +55,20 @@ Usage:
|
|
|
42
55
|
execute.sh --project-root <abs path> --apply # execute migration
|
|
43
56
|
execute.sh --project-root <abs path> --no-memory --apply
|
|
44
57
|
# apply but skip agent memory.json copies
|
|
58
|
+
execute.sh --project-root <abs path> --full # raw payload incl. full proposedPages
|
|
45
59
|
|
|
46
|
-
Outputs a JSON report:
|
|
60
|
+
Outputs a compact JSON report (default):
|
|
47
61
|
- legacyDetected : true when any legacy source exists
|
|
48
|
-
-
|
|
62
|
+
- totalProposed / alreadyMigrated / netNew / skippedOther / routingUncertain
|
|
63
|
+
- byCategory : {sourceType: {proposed, netNew}}
|
|
64
|
+
- netNewSample : first ${WIKI_MIGRATE_SAMPLE_SIZE} net-new target paths
|
|
49
65
|
- bootstrapNeeded : which vaults will be bootstrapped on --apply
|
|
50
66
|
- summary : counts per source type
|
|
51
67
|
- applied/skipped : only present on --apply
|
|
52
68
|
|
|
69
|
+
With --full the raw backend payload is returned instead, including the
|
|
70
|
+
per-entry proposedPages array (target + skipReason when "already migrated").
|
|
71
|
+
|
|
53
72
|
The skill makes NO LLM calls. Re-running is safe (idempotent via manifest).
|
|
54
73
|
EOF
|
|
55
74
|
exit 0 ;;
|
|
@@ -65,6 +84,7 @@ if [ -n "$INPUT_JSON" ]; then
|
|
|
65
84
|
[ -z "$PROJECT_ROOT" ] && PROJECT_ROOT=$(printf '%s' "$INPUT" | jq -r '.projectRoot // empty')
|
|
66
85
|
if printf '%s' "$INPUT" | jq -e '.apply == true' >/dev/null 2>&1; then APPLY="true"; fi
|
|
67
86
|
if printf '%s' "$INPUT" | jq -e '.includeAgentMemory == false' >/dev/null 2>&1; then INCLUDE_MEMORY="false"; fi
|
|
87
|
+
if printf '%s' "$INPUT" | jq -e '.full == true' >/dev/null 2>&1; then FULL="1"; fi
|
|
68
88
|
fi
|
|
69
89
|
|
|
70
90
|
require_param "projectRoot (--project-root)" "$PROJECT_ROOT"
|
|
@@ -74,9 +94,19 @@ export _WM_M="$INCLUDE_MEMORY"
|
|
|
74
94
|
|
|
75
95
|
if [ "$APPLY" = "true" ]; then
|
|
76
96
|
BODY=$(jq -n '{projectRoot: env._WM_R, includeAgentMemory: (env._WM_M == "true"), confirm: true}')
|
|
77
|
-
|
|
97
|
+
ENDPOINT="/wiki/migrate/apply"
|
|
78
98
|
else
|
|
79
99
|
BODY=$(jq -n '{projectRoot: env._WM_R, includeAgentMemory: (env._WM_M == "true")}')
|
|
80
|
-
|
|
100
|
+
ENDPOINT="/wiki/migrate/scan"
|
|
81
101
|
fi
|
|
82
102
|
unset _WM_R _WM_M
|
|
103
|
+
|
|
104
|
+
# Fetch the raw payload uncapped so the compact filter sees the whole array;
|
|
105
|
+
# the compact report is small, and --full re-enters the shared output cap.
|
|
106
|
+
RAW=$(CREWLY_SKILL_FULL_OUTPUT=1 api_call POST "$ENDPOINT" "$BODY")
|
|
107
|
+
|
|
108
|
+
if [ "$FULL" = "1" ]; then
|
|
109
|
+
_cap_skill_output "$RAW"
|
|
110
|
+
else
|
|
111
|
+
printf '%s' "$RAW" | jq --argjson sample "$WIKI_MIGRATE_SAMPLE_SIZE" -f "$COMPACT_FILTER"
|
|
112
|
+
fi
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for ORC wiki-migrate execute.sh
|
|
3
|
+
#
|
|
4
|
+
# The backend's scan payload carries the full `proposedPages` array (hundreds
|
|
5
|
+
# of rows on a real project). The skill must return a COMPACT report by
|
|
6
|
+
# default and only hand back the raw payload with --full / {"full":true}.
|
|
7
|
+
#
|
|
8
|
+
# Like delegate-task/execute.test.sh, this harness runs a COPY of the real
|
|
9
|
+
# execute.sh (plus compact.jq) under a stubbed api_call so production logic
|
|
10
|
+
# is exercised verbatim.
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
|
+
PASS=0
|
|
14
|
+
FAIL=0
|
|
15
|
+
|
|
16
|
+
CALL_LOG=$(mktemp)
|
|
17
|
+
SKILL_PARENT=$(mktemp -d)
|
|
18
|
+
trap 'rm -rf "$SKILL_PARENT" "$CALL_LOG"' EXIT
|
|
19
|
+
|
|
20
|
+
# The skill resolves `${SCRIPT_DIR}/../../_common/lib.sh`, so mirror the
|
|
21
|
+
# config/skills/<role>/<skill> depth.
|
|
22
|
+
mkdir -p "$SKILL_PARENT/_common" "$SKILL_PARENT/orchestrator/wiki-migrate"
|
|
23
|
+
|
|
24
|
+
# Fixture: 25 proposed pages across 4 sourceTypes; 8 already migrated, 1
|
|
25
|
+
# skipped for another reason, 16 net-new, 2 routingUncertain.
|
|
26
|
+
FIXTURE=$(jq -nc '
|
|
27
|
+
def page($i; $type; $skip; $unc):
|
|
28
|
+
{sourceType: $type, sourceFile: "src/\($i).json", sourceId: "id-\($i)",
|
|
29
|
+
contentHash: "h\($i)", targetVaultPath: "/vault",
|
|
30
|
+
targetRelativePath: "llm-curated/\($type)/\($i).md", title: "t\($i)",
|
|
31
|
+
routingUncertain: $unc}
|
|
32
|
+
+ (if $skip == "" then {} else {skipReason: $skip} end);
|
|
33
|
+
{
|
|
34
|
+
ok: true, vaultPath: "/vault", legacyDetected: true,
|
|
35
|
+
bootstrapNeeded: {project: true, global: false, teams: []},
|
|
36
|
+
summary: {decisions: 10, patterns: 8, gotchas: 4, relationships: 3,
|
|
37
|
+
learnings: 0, looseMd: 0, memoryEntries: 0, alreadyMigrated: 8},
|
|
38
|
+
proposedPages: (
|
|
39
|
+
[range(0;10) | page(.; "decision"; (if . < 4 then "already migrated" else "" end); false)]
|
|
40
|
+
+ [range(10;18) | page(.; "pattern"; (if . < 14 then "already migrated" else "" end); (. == 15))]
|
|
41
|
+
+ [range(18;22) | page(.; "gotcha"; (if . == 18 then "malformed" else "" end); (. == 19))]
|
|
42
|
+
+ [range(22;25) | page(.; "relationship"; ""; false)]
|
|
43
|
+
)
|
|
44
|
+
}')
|
|
45
|
+
export FIXTURE
|
|
46
|
+
|
|
47
|
+
REAL_LIB="$(cd "$SCRIPT_DIR/../.." && pwd)/_common/lib.sh"
|
|
48
|
+
cat > "$SKILL_PARENT/_common/lib.sh" <<EOF
|
|
49
|
+
source "$REAL_LIB"
|
|
50
|
+
api_call() {
|
|
51
|
+
local method="\$1" path="\$2" body="\${3:-}"
|
|
52
|
+
echo "\${method} \${path} \${body}" >> "${CALL_LOG}"
|
|
53
|
+
printf '%s' "\$FIXTURE"
|
|
54
|
+
}
|
|
55
|
+
EOF
|
|
56
|
+
cp "$SCRIPT_DIR/execute.sh" "$SCRIPT_DIR/compact.jq" "$SKILL_PARENT/orchestrator/wiki-migrate/"
|
|
57
|
+
chmod +x "$SKILL_PARENT/orchestrator/wiki-migrate/execute.sh"
|
|
58
|
+
SKILL="$SKILL_PARENT/orchestrator/wiki-migrate/execute.sh"
|
|
59
|
+
|
|
60
|
+
assert_eq() {
|
|
61
|
+
local desc="$1" expected="$2" actual="$3"
|
|
62
|
+
if [ "$expected" = "$actual" ]; then
|
|
63
|
+
echo " PASS: $desc"; PASS=$((PASS + 1))
|
|
64
|
+
else
|
|
65
|
+
echo " FAIL: $desc"; echo " expected: $expected"; echo " actual: $actual"; FAIL=$((FAIL + 1))
|
|
66
|
+
fi
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
echo "=== wiki-migrate compact output ==="
|
|
70
|
+
|
|
71
|
+
# ---- Test 1: default scan is compact and drops proposedPages ----
|
|
72
|
+
OUT=$(bash "$SKILL" --project-root /tmp/proj)
|
|
73
|
+
assert_eq "scan hits the scan endpoint" "1" "$(grep -c 'POST /wiki/migrate/scan' "$CALL_LOG")"
|
|
74
|
+
assert_eq "compact: proposedPages dropped" "false" "$(printf '%s' "$OUT" | jq 'has("proposedPages")')"
|
|
75
|
+
assert_eq "compact: totalProposed" "25" "$(printf '%s' "$OUT" | jq '.totalProposed')"
|
|
76
|
+
assert_eq "compact: alreadyMigrated" "8" "$(printf '%s' "$OUT" | jq '.alreadyMigrated')"
|
|
77
|
+
assert_eq "compact: skippedOther" "1" "$(printf '%s' "$OUT" | jq '.skippedOther')"
|
|
78
|
+
assert_eq "compact: netNew" "16" "$(printf '%s' "$OUT" | jq '.netNew')"
|
|
79
|
+
assert_eq "compact: routingUncertain" "2" "$(printf '%s' "$OUT" | jq '.routingUncertain')"
|
|
80
|
+
assert_eq "compact: byCategory decision" '{"proposed":10,"netNew":6}' "$(printf '%s' "$OUT" | jq -c '.byCategory.decision')"
|
|
81
|
+
assert_eq "compact: byCategory gotcha" '{"proposed":4,"netNew":3}' "$(printf '%s' "$OUT" | jq -c '.byCategory.gotcha')"
|
|
82
|
+
assert_eq "compact: sample holds first 10 net-new relPaths" "10" "$(printf '%s' "$OUT" | jq '.netNewSample | length')"
|
|
83
|
+
assert_eq "compact: sample starts at first net-new page" "llm-curated/decision/4.md" "$(printf '%s' "$OUT" | jq -r '.netNewSample[0]')"
|
|
84
|
+
assert_eq "compact: sample excludes skipped pages" "0" "$(printf '%s' "$OUT" | jq '[.netNewSample[] | select(. == "llm-curated/gotcha/18.md")] | length')"
|
|
85
|
+
assert_eq "compact: passthrough keys kept" "true|/vault|true" "$(printf '%s' "$OUT" | jq -r '"\(.ok)|\(.vaultPath)|\(.bootstrapNeeded.project)"')"
|
|
86
|
+
assert_eq "compact: original summary kept" "8" "$(printf '%s' "$OUT" | jq '.summary.alreadyMigrated')"
|
|
87
|
+
assert_eq "compact: hint mentions --full" "true" "$(printf '%s' "$OUT" | jq '.hint | test("--full")')"
|
|
88
|
+
COMPACT_BYTES=$(printf '%s' "$OUT" | wc -c | tr -d ' ')
|
|
89
|
+
RAW_BYTES=$(printf '%s' "$FIXTURE" | wc -c | tr -d ' ')
|
|
90
|
+
assert_eq "compact: smaller than raw" "yes" "$([ "$COMPACT_BYTES" -lt "$RAW_BYTES" ] && echo yes || echo no)"
|
|
91
|
+
|
|
92
|
+
# ---- Test 2: WIKI_MIGRATE_SAMPLE_SIZE tunes the sample ----
|
|
93
|
+
OUT=$(WIKI_MIGRATE_SAMPLE_SIZE=3 bash "$SKILL" --project-root /tmp/proj)
|
|
94
|
+
assert_eq "sample size env respected" "3" "$(printf '%s' "$OUT" | jq '.netNewSample | length')"
|
|
95
|
+
|
|
96
|
+
# ---- Test 3: --full returns the raw payload ----
|
|
97
|
+
OUT=$(bash "$SKILL" --project-root /tmp/proj --full)
|
|
98
|
+
assert_eq "--full: proposedPages present" "25" "$(printf '%s' "$OUT" | jq '.proposedPages | length')"
|
|
99
|
+
assert_eq "--full: no compact keys" "false" "$(printf '%s' "$OUT" | jq 'has("netNew")')"
|
|
100
|
+
|
|
101
|
+
# ---- Test 4: {"full":true} JSON input also returns the raw payload ----
|
|
102
|
+
OUT=$(bash "$SKILL" '{"projectRoot":"/tmp/proj","full":true}')
|
|
103
|
+
assert_eq "json full:true: proposedPages present" "25" "$(printf '%s' "$OUT" | jq '.proposedPages | length')"
|
|
104
|
+
|
|
105
|
+
# ---- Test 5: apply path is compacted too and keeps apply-only keys ----
|
|
106
|
+
FIXTURE=$(printf '%s' "$FIXTURE" | jq -c '. + {applied: 16, skipped: 9, bootstrapped: ["/vault"], manifestPath: "/vault/.migration-state.json"}')
|
|
107
|
+
export FIXTURE
|
|
108
|
+
: > "$CALL_LOG"
|
|
109
|
+
OUT=$(bash "$SKILL" --project-root /tmp/proj --apply)
|
|
110
|
+
assert_eq "apply hits the apply endpoint" "1" "$(grep -c 'POST /wiki/migrate/apply' "$CALL_LOG")"
|
|
111
|
+
assert_eq "apply body carries confirm:true" "1" "$(grep -c '"confirm": *true' "$CALL_LOG")"
|
|
112
|
+
assert_eq "apply: applied/skipped kept" "16|9|/vault/.migration-state.json" "$(printf '%s' "$OUT" | jq -r '"\(.applied)|\(.skipped)|\(.manifestPath)"')"
|
|
113
|
+
assert_eq "apply: proposedPages dropped" "false" "$(printf '%s' "$OUT" | jq 'has("proposedPages")')"
|
|
114
|
+
|
|
115
|
+
# ---- Test 6: payload without proposedPages does not break the filter ----
|
|
116
|
+
FIXTURE='{"ok":true,"legacyDetected":false,"bootstrapNeeded":{"project":false,"global":false,"teams":[]}}'
|
|
117
|
+
export FIXTURE
|
|
118
|
+
OUT=$(bash "$SKILL" --project-root /tmp/proj)
|
|
119
|
+
assert_eq "empty scan: netNew 0" "0" "$(printf '%s' "$OUT" | jq '.netNew')"
|
|
120
|
+
assert_eq "empty scan: byCategory {}" "{}" "$(printf '%s' "$OUT" | jq -c '.byCategory')"
|
|
121
|
+
|
|
122
|
+
echo ""
|
|
123
|
+
echo "=== Results: $PASS passed, $FAIL failed ==="
|
|
124
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -44,6 +44,12 @@ elif [ -n "$WI_BRIEF" ]; then
|
|
|
44
44
|
TASK_OUTPUT="$WI_BRIEF"
|
|
45
45
|
fi
|
|
46
46
|
|
|
47
|
+
# Defaults. A pre-approved checklist or a template pipeline (below) may
|
|
48
|
+
# override these — they must NOT be reset after checklist loading, or the
|
|
49
|
+
# checklist's passPolicy is silently discarded.
|
|
50
|
+
PASS_POLICY="all"
|
|
51
|
+
MAX_RETRIES=2
|
|
52
|
+
|
|
47
53
|
# =============================================================================
|
|
48
54
|
# Pre-approved checklist loading (from design-checklist skill)
|
|
49
55
|
# =============================================================================
|
|
@@ -55,13 +61,17 @@ if [ -n "$CHECKLIST_PATH" ] && [ -f "$CHECKLIST_PATH" ]; then
|
|
|
55
61
|
CHECKLIST_STATUS=$(echo "$CHECKLIST_DATA" | jq -r '.status // "unknown"' 2>/dev/null || true)
|
|
56
62
|
|
|
57
63
|
if [ "$CHECKLIST_STATUS" = "approved" ]; then
|
|
58
|
-
# Convert checklist items to verification checks
|
|
64
|
+
# Convert checklist items to verification checks.
|
|
65
|
+
# NOTE: `(.command // empty)` inside an object constructor makes jq drop
|
|
66
|
+
# the WHOLE item when the key is absent, so every checklist item without
|
|
67
|
+
# both `command` and `pattern` used to vanish. Use `// null` instead —
|
|
68
|
+
# the consumers below read fields with `// empty`, so null is harmless.
|
|
59
69
|
CHECKS=$(echo "$CHECKLIST_DATA" | jq -c '
|
|
60
70
|
[.items[] | {
|
|
61
71
|
name: .id,
|
|
62
72
|
type: .type,
|
|
63
|
-
command: (.command //
|
|
64
|
-
pattern: (.pattern //
|
|
73
|
+
command: (.command // null),
|
|
74
|
+
pattern: (.pattern // null),
|
|
65
75
|
description: .description,
|
|
66
76
|
critical: (.critical // false)
|
|
67
77
|
}]
|
|
@@ -79,7 +89,7 @@ elif [ -n "$TASK_ID" ] && [ -n "$PROJECT_PATH" ]; then
|
|
|
79
89
|
if [ -f "$AUTO_CHECKLIST" ]; then
|
|
80
90
|
CHECKLIST_STATUS=$(jq -r '.status // "unknown"' "$AUTO_CHECKLIST" 2>/dev/null || true)
|
|
81
91
|
if [ "$CHECKLIST_STATUS" = "approved" ]; then
|
|
82
|
-
CHECKS=$(jq -c '[.items[] | {name: .id, type: .type, command: (.command //
|
|
92
|
+
CHECKS=$(jq -c '[.items[] | {name: .id, type: .type, command: (.command // null), pattern: (.pattern // null), description: .description, critical: (.critical // false)}]' "$AUTO_CHECKLIST" 2>/dev/null || echo '[]')
|
|
83
93
|
PASS_POLICY=$(jq -r '.passPolicy // "critical_only"' "$AUTO_CHECKLIST" 2>/dev/null || echo "critical_only")
|
|
84
94
|
fi
|
|
85
95
|
fi
|
|
@@ -89,8 +99,6 @@ fi
|
|
|
89
99
|
# Pipeline loading: convert template pipeline steps to checks
|
|
90
100
|
# =============================================================================
|
|
91
101
|
|
|
92
|
-
PASS_POLICY="all"
|
|
93
|
-
MAX_RETRIES=2
|
|
94
102
|
CHECK_COUNT=$(echo "$CHECKS" | jq 'length')
|
|
95
103
|
|
|
96
104
|
if [ "$CHECK_COUNT" = "0" ] && [ -n "$TEMPLATE_ID" ]; then
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for TL verify-output execute.sh
|
|
3
|
+
# Covers: passPolicy resolution — an approved checklist's passPolicy must
|
|
4
|
+
# survive into the verdict (it used to be clobbered by the
|
|
5
|
+
# pipeline-loading defaults), a template pipeline still overrides
|
|
6
|
+
# it when no checklist checks were loaded, and the default is "all".
|
|
7
|
+
#
|
|
8
|
+
# The real execute.sh is run end-to-end; HTTP is intercepted by a fake `curl`
|
|
9
|
+
# placed first on PATH so api_call() sees controlled responses.
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
PASS=0
|
|
13
|
+
FAIL=0
|
|
14
|
+
|
|
15
|
+
WORK_DIR=$(mktemp -d)
|
|
16
|
+
trap 'rm -rf "$WORK_DIR"' EXIT
|
|
17
|
+
|
|
18
|
+
# ---------------------------------------------------------------------------
|
|
19
|
+
# Fake curl: dispatches on the URL (last argument) and emits body + http code
|
|
20
|
+
# in the `-w '\n%{http_code}'` shape api_call() parses.
|
|
21
|
+
# ---------------------------------------------------------------------------
|
|
22
|
+
FAKE_BIN="$WORK_DIR/bin"
|
|
23
|
+
mkdir -p "$FAKE_BIN"
|
|
24
|
+
cat > "$FAKE_BIN/curl" <<'CURL_EOF'
|
|
25
|
+
#!/bin/bash
|
|
26
|
+
url="${@: -1}"
|
|
27
|
+
case "$url" in
|
|
28
|
+
*/api/templates/tmpl-majority)
|
|
29
|
+
printf '%s\n200' '{"success":true,"data":{"verificationPipeline":{"passPolicy":"majority","maxRetries":3,"steps":[{"id":"s1","name":"Review","method":"code_review","critical":false}]}}}'
|
|
30
|
+
;;
|
|
31
|
+
*)
|
|
32
|
+
printf '%s\n404' '{"success":false}'
|
|
33
|
+
;;
|
|
34
|
+
esac
|
|
35
|
+
CURL_EOF
|
|
36
|
+
chmod +x "$FAKE_BIN/curl"
|
|
37
|
+
|
|
38
|
+
PROJECT_DIR="$WORK_DIR/project"
|
|
39
|
+
mkdir -p "$PROJECT_DIR/.crewly/tasks"
|
|
40
|
+
|
|
41
|
+
run_verify() {
|
|
42
|
+
PATH="$FAKE_BIN:$PATH" CREWLY_API_URL="http://127.0.0.1:1" bash "$SCRIPT_DIR/execute.sh" "$1" 2>/dev/null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
assert_json_field() {
|
|
46
|
+
local desc="$1" input="$2" filter="$3" expected="$4"
|
|
47
|
+
local OUTPUT actual
|
|
48
|
+
OUTPUT=$(run_verify "$input") || true
|
|
49
|
+
actual=$(printf '%s' "$OUTPUT" | jq -r "$filter" 2>/dev/null || echo "<no-json>")
|
|
50
|
+
if [ "$actual" = "$expected" ]; then
|
|
51
|
+
echo " PASS: $desc"
|
|
52
|
+
PASS=$((PASS + 1))
|
|
53
|
+
else
|
|
54
|
+
echo " FAIL: $desc (expected '$filter' = '$expected', got '$actual'; output: $OUTPUT)"
|
|
55
|
+
FAIL=$((FAIL + 1))
|
|
56
|
+
fi
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# One critical check that passes, one non-critical check that fails.
|
|
60
|
+
# Under critical_only the verdict is PASS; under "all" it would be FAIL.
|
|
61
|
+
CHECKLIST='{
|
|
62
|
+
"status":"approved",
|
|
63
|
+
"passPolicy":"critical_only",
|
|
64
|
+
"items":[
|
|
65
|
+
{"id":"crit-ok","type":"command","command":"true","description":"critical passes","critical":true},
|
|
66
|
+
{"id":"minor-fail","type":"command","command":"false","description":"non-critical fails","critical":false}
|
|
67
|
+
]
|
|
68
|
+
}'
|
|
69
|
+
printf '%s' "$CHECKLIST" > "$WORK_DIR/checklist.json"
|
|
70
|
+
printf '%s' "$CHECKLIST" > "$PROJECT_DIR/.crewly/tasks/checklist-task-auto.json"
|
|
71
|
+
|
|
72
|
+
echo "verify-output: passPolicy resolution"
|
|
73
|
+
|
|
74
|
+
INPUT_EXPLICIT=$(jq -n --arg p "$WORK_DIR/checklist.json" --arg pp "$PROJECT_DIR" \
|
|
75
|
+
'{taskId:"task-1",workerId:"w1",teamId:"t1",projectPath:$pp,checklistPath:$p}')
|
|
76
|
+
assert_json_field "explicit checklistPath: passPolicy from checklist survives" \
|
|
77
|
+
"$INPUT_EXPLICIT" '.passPolicy' 'critical_only'
|
|
78
|
+
assert_json_field "explicit checklistPath: both checklist items are loaded as checks" \
|
|
79
|
+
"$INPUT_EXPLICIT" '[.results[] | select(.name != "manual-review")] | length' '2'
|
|
80
|
+
assert_json_field "explicit checklistPath: non-critical failure is recorded" \
|
|
81
|
+
"$INPUT_EXPLICIT" '.failedSteps | join(",")' 'minor-fail'
|
|
82
|
+
assert_json_field "explicit checklistPath: verdict honours critical_only" \
|
|
83
|
+
"$INPUT_EXPLICIT" '.passed' 'true'
|
|
84
|
+
|
|
85
|
+
INPUT_AUTO=$(jq -n --arg pp "$PROJECT_DIR" \
|
|
86
|
+
'{taskId:"task-auto",workerId:"w1",teamId:"t1",projectPath:$pp}')
|
|
87
|
+
assert_json_field "auto-discovered checklist: passPolicy from checklist survives" \
|
|
88
|
+
"$INPUT_AUTO" '.passPolicy' 'critical_only'
|
|
89
|
+
assert_json_field "auto-discovered checklist: both checklist items are loaded as checks" \
|
|
90
|
+
"$INPUT_AUTO" '[.results[] | select(.name != "manual-review")] | length' '2'
|
|
91
|
+
assert_json_field "auto-discovered checklist: verdict honours critical_only" \
|
|
92
|
+
"$INPUT_AUTO" '.passed' 'true'
|
|
93
|
+
|
|
94
|
+
INPUT_ALL_POLICY=$(jq -n --arg p "$WORK_DIR/checklist-all.json" --arg pp "$PROJECT_DIR" \
|
|
95
|
+
'{taskId:"task-1b",workerId:"w1",teamId:"t1",projectPath:$pp,checklistPath:$p}')
|
|
96
|
+
printf '%s' "$CHECKLIST" | jq '.passPolicy = "all"' > "$WORK_DIR/checklist-all.json"
|
|
97
|
+
assert_json_field "checklist with passPolicy=all: non-critical failure fails the verdict" \
|
|
98
|
+
"$INPUT_ALL_POLICY" '.passed' 'false'
|
|
99
|
+
|
|
100
|
+
INPUT_TEMPLATE=$(jq -n --arg pp "$PROJECT_DIR" \
|
|
101
|
+
'{taskId:"task-2",workerId:"w1",teamId:"t1",projectPath:$pp,templateId:"tmpl-majority"}')
|
|
102
|
+
assert_json_field "template pipeline: passPolicy comes from the pipeline when no checklist" \
|
|
103
|
+
"$INPUT_TEMPLATE" '.passPolicy' 'majority'
|
|
104
|
+
|
|
105
|
+
INPUT_NONE=$(jq -n --arg pp "$PROJECT_DIR" \
|
|
106
|
+
'{taskId:"task-3",workerId:"w1",teamId:"t1",projectPath:$pp}')
|
|
107
|
+
assert_json_field "no checklist, no template: passPolicy defaults to all" \
|
|
108
|
+
"$INPUT_NONE" '.passPolicy' 'all'
|
|
109
|
+
|
|
110
|
+
INPUT_INLINE=$(jq -n --arg pp "$PROJECT_DIR" \
|
|
111
|
+
'{taskId:"task-4",workerId:"w1",teamId:"t1",projectPath:$pp,checks:[{name:"ok",type:"command",command:"true",critical:true},{name:"bad",type:"command",command:"false",critical:false}]}')
|
|
112
|
+
assert_json_field "inline checks with default policy: all must pass" \
|
|
113
|
+
"$INPUT_INLINE" '.passed' 'false'
|
|
114
|
+
|
|
115
|
+
echo ""
|
|
116
|
+
echo "Results: $PASS passed, $FAIL failed"
|
|
117
|
+
[ "$FAIL" -eq 0 ]
|