crewly 1.20.302 → 1.20.304
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/roles/developer/prompt.md +7 -0
- package/config/roles/fullstack-dev/prompt.md +7 -0
- package/config/roles/product-manager/prompt.md +7 -0
- package/config/skills/orchestrator/move-team/SKILL.md +53 -0
- package/config/skills/orchestrator/move-team/execute.sh +42 -0
- package/config/skills/orchestrator/usage-categories/SKILL.md +59 -0
- package/config/skills/orchestrator/usage-categories/execute.sh +81 -0
- package/config/skills/orchestrator/usage-categories/execute.test.sh +45 -0
- package/config/skills/orchestrator/usage-report/SKILL.md +71 -0
- package/config/skills/orchestrator/usage-report/execute.sh +84 -0
- package/config/skills/orchestrator/usage-report/execute.test.sh +39 -0
- package/config/skills/team-leader/usage-report/SKILL.md +71 -0
- package/config/skills/team-leader/usage-report/execute.sh +84 -0
- package/config/skills/team-leader/usage-report/execute.test.sh +39 -0
- package/dist/backend/backend/src/constants.d.ts +80 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +80 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts +45 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.js +214 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts +36 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js +158 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js +26 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +10 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +97 -20
- 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/follow-through.wiring.d.ts +32 -0
- package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js +42 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +26 -6
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.js +59 -5
- package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- 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 +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +18 -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 +16 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +19 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +46 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +101 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts +58 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js +100 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js.map +1 -0
- 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 +3 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +7 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +15 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.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 +25 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -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 +41 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts +122 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.js +202 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +59 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.js +133 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js +217 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.js +348 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts +209 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.js +504 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +156 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js +462 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts +157 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.js +298 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.d.ts +69 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.js +198 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +121 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.js +462 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts +110 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.js +198 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts +71 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.js +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts +29 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js +173 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts +50 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js +96 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.d.ts +94 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.js +124 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts +46 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.js +202 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +269 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.js +44 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -0
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +42 -2
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-context.service.js +66 -5
- package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-recorder.js +11 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -1
- package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts +28 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.js +67 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts +37 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.js +49 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/index.d.ts +14 -0
- package/dist/backend/backend/src/services/usage-ledger/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/index.js +14 -0
- package/dist/backend/backend/src/services/usage-ledger/index.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts +100 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js +189 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts +41 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.js +71 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts +47 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.js +106 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts +101 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js +263 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts +96 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js +166 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts +90 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js +294 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts +102 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js +314 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts +62 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js +106 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts +52 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js +95 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts +127 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js +19 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts +124 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js +372 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +80 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +80 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +26 -6
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.js +59 -5
- package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- 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 +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +18 -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 +16 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +19 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +46 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +101 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
- 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 +3 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.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 +25 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -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 +41 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +42 -2
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-context.service.js +66 -5
- package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-recorder.js +11 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -1
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
- package/dist/cli/cli/src/commands/team-move.d.ts +68 -0
- package/dist/cli/cli/src/commands/team-move.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/team-move.js +155 -0
- package/dist/cli/cli/src/commands/team-move.js.map +1 -0
- package/dist/cli/cli/src/index.js +33 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-secret-scan.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-secret-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,iDAAiD;AACjD,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE;gBAAzB,QAAQ,EAAE,aAAa,EAAE;CAO/C;AAiCD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAAE,KAAK,GAAE,SAAS,cAAc,EAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAS5J;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAO/D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret scan of a package before it leaves the machine.
|
|
3
|
+
*
|
|
4
|
+
* Runs the same detectors as the session-log redactor (token shapes such as
|
|
5
|
+
* Slack, OpenAI/Anthropic, GitHub, Google keys, JWTs, bearer headers, private
|
|
6
|
+
* key blocks, connection strings and `SECRET_NAME=value` assignments) plus the
|
|
7
|
+
* exact secret values this machine holds in its environment and settings. It
|
|
8
|
+
* reports file paths and pattern counts only, never a matched value.
|
|
9
|
+
*
|
|
10
|
+
* @module services/team-move/team-move-secret-scan
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'node:fs/promises';
|
|
13
|
+
import { redactSecretsWithCount } from '../../utils/secret-redactor.js';
|
|
14
|
+
import { looksLikeText } from './team-move-fs.js';
|
|
15
|
+
/** Window read at a time (text is scanned in overlapping windows). */
|
|
16
|
+
const WINDOW_BYTES = 1024 * 1024;
|
|
17
|
+
/** Overlap between windows so a secret cut by a boundary is still seen. */
|
|
18
|
+
const OVERLAP_BYTES = 1024;
|
|
19
|
+
/** Thrown when a package would carry secrets. */
|
|
20
|
+
export class TeamMoveSecretScanError extends Error {
|
|
21
|
+
findings;
|
|
22
|
+
constructor(findings) {
|
|
23
|
+
super(`The secret scan found credentials in ${findings.length} file${findings.length === 1 ? '' : 's'}; nothing was sent. ` +
|
|
24
|
+
`Remove them from: ${findings.slice(0, 10).map((f) => f.path).join(', ')}${findings.length > 10 ? ', ...' : ''}`);
|
|
25
|
+
this.findings = findings;
|
|
26
|
+
this.name = 'TeamMoveSecretScanError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Count secrets in one file.
|
|
31
|
+
*
|
|
32
|
+
* @param abs - Absolute file path
|
|
33
|
+
* @param known - Exact secret values to look for
|
|
34
|
+
* @returns Number of matches, 0 for binary files
|
|
35
|
+
*/
|
|
36
|
+
async function scanFile(abs, known) {
|
|
37
|
+
const handle = await fs.open(abs, 'r');
|
|
38
|
+
try {
|
|
39
|
+
const stat = await handle.stat();
|
|
40
|
+
const head = Buffer.alloc(Math.min(8192, stat.size));
|
|
41
|
+
await handle.read(head, 0, head.length, 0);
|
|
42
|
+
if (!looksLikeText(head))
|
|
43
|
+
return { matches: 0, scanned: false };
|
|
44
|
+
let matches = 0;
|
|
45
|
+
let position = 0;
|
|
46
|
+
const buf = Buffer.alloc(WINDOW_BYTES + OVERLAP_BYTES);
|
|
47
|
+
// Matches inside the overlap are seen by two windows; counting the first
|
|
48
|
+
// window's tail once is enough, we only need "any", so double counts are fine.
|
|
49
|
+
while (position < stat.size) {
|
|
50
|
+
const { bytesRead } = await handle.read(buf, 0, buf.length, position);
|
|
51
|
+
if (bytesRead === 0)
|
|
52
|
+
break;
|
|
53
|
+
matches += redactSecretsWithCount(buf.subarray(0, bytesRead).toString('utf8'), known).count;
|
|
54
|
+
position += WINDOW_BYTES;
|
|
55
|
+
}
|
|
56
|
+
return { matches, scanned: true };
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await handle.close();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Scan every file of a staging area.
|
|
64
|
+
*
|
|
65
|
+
* @param staging - The package being built
|
|
66
|
+
* @param files - Its files
|
|
67
|
+
* @param known - Exact secret values (env, settings) to look for
|
|
68
|
+
* @returns Files scanned and the findings
|
|
69
|
+
*/
|
|
70
|
+
export async function scanStaging(staging, files, known = []) {
|
|
71
|
+
const findings = [];
|
|
72
|
+
let filesScanned = 0;
|
|
73
|
+
for (const f of files) {
|
|
74
|
+
const { matches, scanned } = await scanFile(staging.abs(f.path), known);
|
|
75
|
+
if (scanned)
|
|
76
|
+
filesScanned += 1;
|
|
77
|
+
if (matches > 0)
|
|
78
|
+
findings.push({ path: f.path, matches });
|
|
79
|
+
}
|
|
80
|
+
return { filesScanned, findings };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Whether a flagged file may be left out of the package instead of aborting.
|
|
84
|
+
* Core records (the team config, task pool, decisions, chat records) can never
|
|
85
|
+
* be skipped; free-form notes and project files can.
|
|
86
|
+
*
|
|
87
|
+
* @param packagePath - Package path of the flagged file
|
|
88
|
+
* @returns True when skipping is allowed
|
|
89
|
+
*/
|
|
90
|
+
export function isSkippableFinding(packagePath) {
|
|
91
|
+
return (packagePath.startsWith('projects/') ||
|
|
92
|
+
packagePath.startsWith('handover/') ||
|
|
93
|
+
/^agents\/[^/]+\/sessions\//.test(packagePath) ||
|
|
94
|
+
/^team\/(wiki|norms|sops)\//.test(packagePath));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=team-move-secret-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-secret-scan.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-secret-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which records of the global stores belong to a team. Pure functions: the
|
|
3
|
+
* exporter (source) selects with them, the archiver removes with them.
|
|
4
|
+
*
|
|
5
|
+
* @module services/team-move/team-move-select
|
|
6
|
+
*/
|
|
7
|
+
import type { Team } from '../../types/index.js';
|
|
8
|
+
import type { ScheduledMessage } from '../../types/index.js';
|
|
9
|
+
import type { WorkItem } from '../../types/v2/work-item.types.js';
|
|
10
|
+
import type { TaskClaim } from '../../types/v2/claim.types.js';
|
|
11
|
+
/** What identifies a team's records in the global stores. */
|
|
12
|
+
export interface TeamIdentity {
|
|
13
|
+
teamId: string;
|
|
14
|
+
teamName: string;
|
|
15
|
+
/** Member session names. */
|
|
16
|
+
sessions: ReadonlySet<string>;
|
|
17
|
+
/** Member ids. */
|
|
18
|
+
memberIds: ReadonlySet<string>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Identity of a team.
|
|
22
|
+
*
|
|
23
|
+
* @param team - The team
|
|
24
|
+
* @returns Ids and session names to match records by
|
|
25
|
+
*/
|
|
26
|
+
export declare function identityOf(team: Pick<Team, 'id' | 'name' | 'members'>): TeamIdentity;
|
|
27
|
+
/**
|
|
28
|
+
* Whether a free-form target string names the team or one of its members.
|
|
29
|
+
*
|
|
30
|
+
* @param target - A `target`/`targetTeam`/session field value
|
|
31
|
+
* @param id - Team identity
|
|
32
|
+
* @returns True on a match
|
|
33
|
+
*/
|
|
34
|
+
export declare function targetsTeam(target: unknown, id: TeamIdentity): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Whether a work item is still open.
|
|
37
|
+
*
|
|
38
|
+
* @param wi - Work item
|
|
39
|
+
* @returns True when it is neither terminal nor failed/rejected
|
|
40
|
+
*/
|
|
41
|
+
export declare function isOpenWorkItem(wi: Pick<WorkItem, 'status'>): boolean;
|
|
42
|
+
/** The slice of the pool a team owns. */
|
|
43
|
+
export interface TeamPoolSlice {
|
|
44
|
+
workItems: WorkItem[];
|
|
45
|
+
/** Active claims by team members on selected items (not moved; counted for the report). */
|
|
46
|
+
activeClaims: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Open task-pool items of a team: those aimed at the team or a member, those
|
|
50
|
+
* a member is working on, and their open children.
|
|
51
|
+
*
|
|
52
|
+
* @param pool - The pool file content
|
|
53
|
+
* @param pool.workItems - All work items
|
|
54
|
+
* @param pool.claims - All claims
|
|
55
|
+
* @param id - Team identity
|
|
56
|
+
* @returns Selected items
|
|
57
|
+
*/
|
|
58
|
+
export declare function selectPoolItems(pool: {
|
|
59
|
+
workItems?: WorkItem[];
|
|
60
|
+
claims?: TaskClaim[];
|
|
61
|
+
}, id: TeamIdentity): TeamPoolSlice;
|
|
62
|
+
/**
|
|
63
|
+
* Make a work item safe to start over on the target: nothing is running there
|
|
64
|
+
* yet, so an item that was being worked on goes back to the queue.
|
|
65
|
+
*
|
|
66
|
+
* @param wi - Work item as exported
|
|
67
|
+
* @returns Copy for the target
|
|
68
|
+
*/
|
|
69
|
+
export declare function resetWorkItemForTarget(wi: WorkItem): WorkItem;
|
|
70
|
+
/**
|
|
71
|
+
* Scheduled messages (legacy owner-created reminders) that address a team.
|
|
72
|
+
*
|
|
73
|
+
* @param messages - All scheduled messages
|
|
74
|
+
* @param id - Team identity
|
|
75
|
+
* @returns Those whose `targetTeam` names the team or one of its members
|
|
76
|
+
*/
|
|
77
|
+
export declare function selectScheduledMessages(messages: readonly ScheduledMessage[], id: TeamIdentity): ScheduledMessage[];
|
|
78
|
+
/** The decision fields the selector reads. */
|
|
79
|
+
export interface DecisionLike {
|
|
80
|
+
id: string;
|
|
81
|
+
status: string;
|
|
82
|
+
teamId?: string;
|
|
83
|
+
asker?: string;
|
|
84
|
+
requestedBy?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Open decisions/requests to the owner that belong to a team.
|
|
88
|
+
*
|
|
89
|
+
* @param decisions - All decisions
|
|
90
|
+
* @param id - Team identity
|
|
91
|
+
* @returns Pending ones asked by the team or one of its members
|
|
92
|
+
*/
|
|
93
|
+
export declare function selectDecisions<T extends DecisionLike>(decisions: readonly T[], id: TeamIdentity): T[];
|
|
94
|
+
//# sourceMappingURL=team-move-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-select.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-select.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,kBAAkB;IAClB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,YAAY,CAOpF;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,GAAG,OAAO,CAGtE;AAKD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,OAAO,CAEpE;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,2FAA2F;IAC3F,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;CAAE,EAAE,EAAE,EAAE,YAAY,GAAG,aAAa,CAwBvH;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAQ7D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,EAAE,EAAE,YAAY,GAAG,gBAAgB,EAAE,CAEnH;AAED,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,GAAG,CAAC,EAAE,CAMtG"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which records of the global stores belong to a team. Pure functions: the
|
|
3
|
+
* exporter (source) selects with them, the archiver removes with them.
|
|
4
|
+
*
|
|
5
|
+
* @module services/team-move/team-move-select
|
|
6
|
+
*/
|
|
7
|
+
import { TERMINAL_WORK_ITEM_STATUSES } from '../../types/v2/work-item.types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Identity of a team.
|
|
10
|
+
*
|
|
11
|
+
* @param team - The team
|
|
12
|
+
* @returns Ids and session names to match records by
|
|
13
|
+
*/
|
|
14
|
+
export function identityOf(team) {
|
|
15
|
+
return {
|
|
16
|
+
teamId: team.id,
|
|
17
|
+
teamName: team.name,
|
|
18
|
+
sessions: new Set(team.members.map((m) => m.sessionName).filter((s) => typeof s === 'string' && s.length > 0)),
|
|
19
|
+
memberIds: new Set(team.members.map((m) => m.id)),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether a free-form target string names the team or one of its members.
|
|
24
|
+
*
|
|
25
|
+
* @param target - A `target`/`targetTeam`/session field value
|
|
26
|
+
* @param id - Team identity
|
|
27
|
+
* @returns True on a match
|
|
28
|
+
*/
|
|
29
|
+
export function targetsTeam(target, id) {
|
|
30
|
+
if (typeof target !== 'string' || target.length === 0)
|
|
31
|
+
return false;
|
|
32
|
+
return target === id.teamId || target === id.teamName || id.sessions.has(target) || id.memberIds.has(target);
|
|
33
|
+
}
|
|
34
|
+
/** Work-item statuses that are still open (not finished, cancelled or verified). */
|
|
35
|
+
const OPEN_EXCLUDED = new Set([...TERMINAL_WORK_ITEM_STATUSES, 'failed', 'rejected']);
|
|
36
|
+
/**
|
|
37
|
+
* Whether a work item is still open.
|
|
38
|
+
*
|
|
39
|
+
* @param wi - Work item
|
|
40
|
+
* @returns True when it is neither terminal nor failed/rejected
|
|
41
|
+
*/
|
|
42
|
+
export function isOpenWorkItem(wi) {
|
|
43
|
+
return !OPEN_EXCLUDED.has(wi.status);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Open task-pool items of a team: those aimed at the team or a member, those
|
|
47
|
+
* a member is working on, and their open children.
|
|
48
|
+
*
|
|
49
|
+
* @param pool - The pool file content
|
|
50
|
+
* @param pool.workItems - All work items
|
|
51
|
+
* @param pool.claims - All claims
|
|
52
|
+
* @param id - Team identity
|
|
53
|
+
* @returns Selected items
|
|
54
|
+
*/
|
|
55
|
+
export function selectPoolItems(pool, id) {
|
|
56
|
+
const items = Array.isArray(pool.workItems) ? pool.workItems : [];
|
|
57
|
+
const claims = Array.isArray(pool.claims) ? pool.claims : [];
|
|
58
|
+
const activeByItem = new Map();
|
|
59
|
+
for (const c of claims)
|
|
60
|
+
if (c.status === 'active' && id.sessions.has(c.agentId))
|
|
61
|
+
activeByItem.set(c.workItemId, c);
|
|
62
|
+
const picked = new Map();
|
|
63
|
+
for (const wi of items) {
|
|
64
|
+
if (!isOpenWorkItem(wi))
|
|
65
|
+
continue;
|
|
66
|
+
if (targetsTeam(wi.target, id) || activeByItem.has(wi.id))
|
|
67
|
+
picked.set(wi.id, wi);
|
|
68
|
+
}
|
|
69
|
+
// Open children of picked items follow their parent.
|
|
70
|
+
let grew = true;
|
|
71
|
+
while (grew) {
|
|
72
|
+
grew = false;
|
|
73
|
+
for (const wi of items) {
|
|
74
|
+
if (picked.has(wi.id) || !isOpenWorkItem(wi))
|
|
75
|
+
continue;
|
|
76
|
+
if (wi.parentWorkItemId && picked.has(wi.parentWorkItemId)) {
|
|
77
|
+
picked.set(wi.id, wi);
|
|
78
|
+
grew = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const activeClaims = [...picked.keys()].filter((k) => activeByItem.has(k)).length;
|
|
83
|
+
return { workItems: [...picked.values()], activeClaims };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Make a work item safe to start over on the target: nothing is running there
|
|
87
|
+
* yet, so an item that was being worked on goes back to the queue.
|
|
88
|
+
*
|
|
89
|
+
* @param wi - Work item as exported
|
|
90
|
+
* @returns Copy for the target
|
|
91
|
+
*/
|
|
92
|
+
export function resetWorkItemForTarget(wi) {
|
|
93
|
+
const next = { ...wi };
|
|
94
|
+
if (next.status === 'running' || next.status === 'accepted') {
|
|
95
|
+
next.status = 'queued';
|
|
96
|
+
delete next.startedAt;
|
|
97
|
+
next.metadata = { ...(next.metadata ?? {}), movedFromRunning: true };
|
|
98
|
+
}
|
|
99
|
+
return next;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Scheduled messages (legacy owner-created reminders) that address a team.
|
|
103
|
+
*
|
|
104
|
+
* @param messages - All scheduled messages
|
|
105
|
+
* @param id - Team identity
|
|
106
|
+
* @returns Those whose `targetTeam` names the team or one of its members
|
|
107
|
+
*/
|
|
108
|
+
export function selectScheduledMessages(messages, id) {
|
|
109
|
+
return messages.filter((m) => targetsTeam(m.targetTeam, id));
|
|
110
|
+
}
|
|
111
|
+
/** Decision statuses that still wait for the owner. */
|
|
112
|
+
const PENDING_DECISION_STATUSES = new Set(['open', 'parked']);
|
|
113
|
+
/**
|
|
114
|
+
* Open decisions/requests to the owner that belong to a team.
|
|
115
|
+
*
|
|
116
|
+
* @param decisions - All decisions
|
|
117
|
+
* @param id - Team identity
|
|
118
|
+
* @returns Pending ones asked by the team or one of its members
|
|
119
|
+
*/
|
|
120
|
+
export function selectDecisions(decisions, id) {
|
|
121
|
+
return decisions.filter((d) => PENDING_DECISION_STATUSES.has(d.status) &&
|
|
122
|
+
(d.teamId === id.teamId || (typeof d.asker === 'string' && id.sessions.has(d.asker)) || (typeof d.requestedBy === 'string' && id.sessions.has(d.requestedBy))));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=team-move-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-select.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-select.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAYhF;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAA2C;IACpE,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,QAAQ,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3H,SAAS,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KAClD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,MAAe,EAAE,EAAgB;IAC3D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,OAAO,MAAM,KAAK,EAAE,CAAC,MAAM,IAAI,MAAM,KAAK,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC/G,CAAC;AAED,oFAAoF;AACpF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,2BAA2B,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAE9F;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,EAA4B;IACzD,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AASD;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,IAAsD,EAAE,EAAgB;IACtG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACnH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAAE,SAAS;QAClC,IAAI,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,qDAAqD;IACrD,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,GAAG,KAAK,CAAC;QACb,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBAAE,SAAS;YACvD,IAAI,EAAE,CAAC,gBAAgB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC3D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACtB,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClF,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAY;IACjD,MAAM,IAAI,GAAa,EAAE,GAAG,EAAE,EAAE,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAqC,EAAE,EAAgB;IAC7F,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC;AAWD,uDAAuD;AACvD,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAyB,SAAuB,EAAE,EAAgB;IAC/F,OAAO,SAAS,CAAC,MAAM,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACvC,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CACjK,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test fixture of the team move: builds a throwaway Crewly home with one team
|
|
3
|
+
* (plus a decoy team that must not travel), its agents' memory, handover notes,
|
|
4
|
+
* a project with `.crewly` data and a git repository, task-pool items,
|
|
5
|
+
* decisions, chat channels and a Slack channel mapping.
|
|
6
|
+
*
|
|
7
|
+
* @module services/team-move/team-move.fixture
|
|
8
|
+
*/
|
|
9
|
+
/** Ids of the fixture. */
|
|
10
|
+
export declare const FIXTURE: {
|
|
11
|
+
readonly teamId: "11111111-1111-4111-8111-111111111111";
|
|
12
|
+
readonly decoyTeamId: "22222222-2222-4222-8222-222222222222";
|
|
13
|
+
readonly projectId: "33333333-3333-4333-8333-333333333333";
|
|
14
|
+
readonly leadId: "aaaaaaaa-0000-4000-8000-000000000001";
|
|
15
|
+
readonly devId: "aaaaaaaa-0000-4000-8000-000000000002";
|
|
16
|
+
readonly leadSession: "movers-lena-aaaaaaaa";
|
|
17
|
+
readonly devSession: "movers-dev-bbbbbbbb";
|
|
18
|
+
readonly decoySession: "decoy-dan-cccccccc";
|
|
19
|
+
readonly channelId: "chan-0001-team-channel";
|
|
20
|
+
readonly dmId: "chan-0002-lena-dm";
|
|
21
|
+
};
|
|
22
|
+
/** A built fixture. */
|
|
23
|
+
export interface Fixture {
|
|
24
|
+
root: string;
|
|
25
|
+
home: string;
|
|
26
|
+
projectDir: string;
|
|
27
|
+
remoteDir: string;
|
|
28
|
+
cleanup(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build the source machine.
|
|
32
|
+
*
|
|
33
|
+
* @returns Paths and a cleanup function
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildSourceFixture(): Promise<Fixture>;
|
|
36
|
+
/**
|
|
37
|
+
* An empty target machine.
|
|
38
|
+
*
|
|
39
|
+
* @param root - Fixture root
|
|
40
|
+
* @returns Target home and projects root
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildTargetPaths(root: string): Promise<{
|
|
43
|
+
home: string;
|
|
44
|
+
projectsRoot: string;
|
|
45
|
+
}>;
|
|
46
|
+
//# sourceMappingURL=team-move.fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move.fixture.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move.fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,0BAA0B;AAC1B,eAAO,MAAM,OAAO;;;;;;;;;;;CAWV,CAAC;AAEX,uBAAuB;AACvB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AA2BD;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAiJ3D;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAMpG"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test fixture of the team move: builds a throwaway Crewly home with one team
|
|
3
|
+
* (plus a decoy team that must not travel), its agents' memory, handover notes,
|
|
4
|
+
* a project with `.crewly` data and a git repository, task-pool items,
|
|
5
|
+
* decisions, chat channels and a Slack channel mapping.
|
|
6
|
+
*
|
|
7
|
+
* @module services/team-move/team-move.fixture
|
|
8
|
+
*/
|
|
9
|
+
import { execFileSync } from 'node:child_process';
|
|
10
|
+
import * as fs from 'node:fs/promises';
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { openChatDatabase } from '../chat-v2/sqlite/chat-db.js';
|
|
14
|
+
/** Ids of the fixture. */
|
|
15
|
+
export const FIXTURE = {
|
|
16
|
+
teamId: '11111111-1111-4111-8111-111111111111',
|
|
17
|
+
decoyTeamId: '22222222-2222-4222-8222-222222222222',
|
|
18
|
+
projectId: '33333333-3333-4333-8333-333333333333',
|
|
19
|
+
leadId: 'aaaaaaaa-0000-4000-8000-000000000001',
|
|
20
|
+
devId: 'aaaaaaaa-0000-4000-8000-000000000002',
|
|
21
|
+
leadSession: 'movers-lena-aaaaaaaa',
|
|
22
|
+
devSession: 'movers-dev-bbbbbbbb',
|
|
23
|
+
decoySession: 'decoy-dan-cccccccc',
|
|
24
|
+
channelId: 'chan-0001-team-channel',
|
|
25
|
+
dmId: 'chan-0002-lena-dm',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Write a JSON file, creating folders.
|
|
29
|
+
*
|
|
30
|
+
* @param file - Destination
|
|
31
|
+
* @param value - Content
|
|
32
|
+
*/
|
|
33
|
+
async function writeJson(file, value) {
|
|
34
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
35
|
+
await fs.writeFile(file, JSON.stringify(value, null, 2));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Write a text file, creating folders.
|
|
39
|
+
*
|
|
40
|
+
* @param file - Destination
|
|
41
|
+
* @param text - Content
|
|
42
|
+
*/
|
|
43
|
+
async function writeText(file, text) {
|
|
44
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
45
|
+
await fs.writeFile(file, text);
|
|
46
|
+
}
|
|
47
|
+
const git = (cwd, ...args) => execFileSync('git', args, { cwd, encoding: 'utf8', env: { ...process.env, GIT_AUTHOR_NAME: 't', GIT_AUTHOR_EMAIL: 't@t', GIT_COMMITTER_NAME: 't', GIT_COMMITTER_EMAIL: 't@t' } }).trim();
|
|
48
|
+
/**
|
|
49
|
+
* Build the source machine.
|
|
50
|
+
*
|
|
51
|
+
* @returns Paths and a cleanup function
|
|
52
|
+
*/
|
|
53
|
+
export async function buildSourceFixture() {
|
|
54
|
+
const root = await fs.mkdtemp(path.join(os.tmpdir(), 'crewly-move-fixture-'));
|
|
55
|
+
const home = path.join(root, 'source-home', '.crewly');
|
|
56
|
+
const projectDir = path.join(root, 'source-projects', 'movers-app');
|
|
57
|
+
const remoteDir = path.join(root, 'remote.git');
|
|
58
|
+
const F = FIXTURE;
|
|
59
|
+
const now = '2026-10-10T10:00:00.000Z';
|
|
60
|
+
// Git: a bare remote with one pushed commit; the project is a clone of it.
|
|
61
|
+
await fs.mkdir(remoteDir, { recursive: true });
|
|
62
|
+
git(remoteDir, 'init', '--bare', '-q', '-b', 'main');
|
|
63
|
+
await fs.mkdir(projectDir, { recursive: true });
|
|
64
|
+
git(projectDir, 'init', '-q', '-b', 'main');
|
|
65
|
+
await writeText(path.join(projectDir, 'README.md'), '# movers app\n');
|
|
66
|
+
await writeText(path.join(projectDir, '.gitignore'), '.crewly/\n');
|
|
67
|
+
git(projectDir, 'add', '-A');
|
|
68
|
+
git(projectDir, 'commit', '-q', '-m', 'first');
|
|
69
|
+
git(projectDir, 'remote', 'add', 'origin', remoteDir);
|
|
70
|
+
git(projectDir, 'push', '-q', '-u', 'origin', 'main');
|
|
71
|
+
// Project-local Crewly data.
|
|
72
|
+
await writeText(path.join(projectDir, '.crewly', 'tickets', 'MOV-1-ship-it.md'), `---\nid: MOV-1\nstatus: ready\n---\nShip it from ${projectDir}/src\n`);
|
|
73
|
+
await writeText(path.join(projectDir, '.crewly', 'tickets', 'MOV-2-second.md'), '---\nid: MOV-2\nstatus: backlog\n---\nSecond ticket\n');
|
|
74
|
+
await writeJson(path.join(projectDir, '.crewly', 'missions', 'm1.json'), { id: 'm1', title: 'Launch', objective: 'ship' });
|
|
75
|
+
await writeText(path.join(projectDir, '.crewly', 'findings', 'notes.md'), 'findings\n');
|
|
76
|
+
await writeText(path.join(projectDir, '.crewly', 'logs', 'noise.log'), 'log noise\n');
|
|
77
|
+
await writeText(path.join(projectDir, '.crewly', 'tickets', 'old.md.bak-1'), 'backup\n');
|
|
78
|
+
// Teams.
|
|
79
|
+
const member = (id, name, role, session) => ({
|
|
80
|
+
id,
|
|
81
|
+
name,
|
|
82
|
+
sessionName: session,
|
|
83
|
+
role,
|
|
84
|
+
systemPrompt: `You are ${name}. Work in ${projectDir}. Use ffmpeg for video.`,
|
|
85
|
+
agentStatus: 'active',
|
|
86
|
+
workingStatus: 'in_progress',
|
|
87
|
+
runtimeType: 'claude-code',
|
|
88
|
+
readyAt: now,
|
|
89
|
+
dropoutReason: 'idle_exit',
|
|
90
|
+
createdAt: now,
|
|
91
|
+
updatedAt: now,
|
|
92
|
+
agentId: session,
|
|
93
|
+
});
|
|
94
|
+
const teamDir = path.join(home, 'teams', F.teamId);
|
|
95
|
+
await writeJson(path.join(teamDir, 'config.json'), {
|
|
96
|
+
id: F.teamId,
|
|
97
|
+
name: 'Movers',
|
|
98
|
+
description: 'Team that moves',
|
|
99
|
+
members: [member(F.leadId, 'Lena', 'tech-lead', F.leadSession), member(F.devId, 'Dev', 'developer', F.devSession)],
|
|
100
|
+
projectIds: [F.projectId],
|
|
101
|
+
leaderId: F.leadId,
|
|
102
|
+
leaderIds: [F.leadId],
|
|
103
|
+
createdAt: now,
|
|
104
|
+
updatedAt: now,
|
|
105
|
+
});
|
|
106
|
+
await writeText(path.join(teamDir, 'prompts', `${F.leadId}.md`), 'lead prompt');
|
|
107
|
+
await writeText(path.join(teamDir, 'norms', 'review.md'), '# Review norm\nAlways review with Google Drive docs.\n');
|
|
108
|
+
await writeText(path.join(teamDir, 'sops', 'release.md'), '# Release SOP\n');
|
|
109
|
+
await writeText(path.join(teamDir, 'wiki', 'llm-curated', 'index.md'), '# Wiki index\n');
|
|
110
|
+
await writeText(path.join(teamDir, 'wiki', 'llm-curated', 'usage.jsonl'), '{"x":1}\n');
|
|
111
|
+
await writeJson(path.join(teamDir, 'cron-tasks.json'), { tasks: [{ id: 'cron-1', cron: '0 9 * * *', message: 'daily' }] });
|
|
112
|
+
await writeJson(path.join(teamDir, 'config.json.bak-1'), { stale: true });
|
|
113
|
+
const decoyDir = path.join(home, 'teams', F.decoyTeamId);
|
|
114
|
+
await writeJson(path.join(decoyDir, 'config.json'), {
|
|
115
|
+
id: F.decoyTeamId,
|
|
116
|
+
name: 'Decoy',
|
|
117
|
+
members: [member('dddddddd-0000-4000-8000-000000000001', 'Dan', 'developer', F.decoySession)],
|
|
118
|
+
projectIds: [],
|
|
119
|
+
createdAt: now,
|
|
120
|
+
updatedAt: now,
|
|
121
|
+
});
|
|
122
|
+
await writeJson(path.join(home, 'projects.json'), [
|
|
123
|
+
{ id: F.projectId, name: 'Movers App', path: projectDir, teams: {}, status: 'stopped', createdAt: now, updatedAt: now },
|
|
124
|
+
]);
|
|
125
|
+
// Agent memory and handover notes.
|
|
126
|
+
for (const s of [F.leadSession, F.devSession, F.decoySession]) {
|
|
127
|
+
await writeJson(path.join(home, 'agents', s, 'memory.json'), { session: s, notes: [`remember ${s}`] });
|
|
128
|
+
await writeText(path.join(home, 'agents', s, 'standing.md'), `standing answers of ${s}\n`);
|
|
129
|
+
await writeText(path.join(home, 'agents', s, 'sessions', '2026-10-01-10-00.md'), `summary of ${s}\n`);
|
|
130
|
+
}
|
|
131
|
+
for (let i = 0; i < 12; i++) {
|
|
132
|
+
const stamp = `2026-10-${String(i + 1).padStart(2, '0')}T10-00-00-000Z`;
|
|
133
|
+
await writeText(path.join(home, 'handover', `${F.leadSession}-${stamp}.md`), `handover ${i}`);
|
|
134
|
+
}
|
|
135
|
+
await writeText(path.join(home, 'handover', `${F.decoySession}-2026-10-01T10-00-00-000Z.md`), 'decoy handover');
|
|
136
|
+
// Task pool.
|
|
137
|
+
const item = (id, target, status) => ({
|
|
138
|
+
id,
|
|
139
|
+
type: 'delegate',
|
|
140
|
+
owner: 'team_lead',
|
|
141
|
+
target,
|
|
142
|
+
title: `item ${id}`,
|
|
143
|
+
description: `see ${projectDir}`,
|
|
144
|
+
status,
|
|
145
|
+
createdAt: now,
|
|
146
|
+
retryCount: 0,
|
|
147
|
+
maxRetries: 3,
|
|
148
|
+
inputTokens: 0,
|
|
149
|
+
outputTokens: 0,
|
|
150
|
+
cost: 0,
|
|
151
|
+
startedAt: status === 'running' ? now : undefined,
|
|
152
|
+
});
|
|
153
|
+
await writeJson(path.join(home, 'task-pool', 'pool.json'), {
|
|
154
|
+
workItems: [item('wi-queued', F.devSession, 'queued'), item('wi-running', F.leadSession, 'running'), item('wi-done', F.devSession, 'done'), item('wi-decoy', F.decoySession, 'queued')],
|
|
155
|
+
claims: [],
|
|
156
|
+
lastUpdatedAt: now,
|
|
157
|
+
});
|
|
158
|
+
// Decisions.
|
|
159
|
+
await writeJson(path.join(home, 'owner-decisions.json'), {
|
|
160
|
+
nextId: 3,
|
|
161
|
+
decisions: [
|
|
162
|
+
{ id: 'D-1', question: 'Ship?', options: [], defaultKey: 'wait', deadline: now, requestedBy: F.leadSession, asker: F.leadSession, teamId: F.teamId, status: 'open', card: { slackChannelId: 'C1', messageTs: '1.1', postedBy: 'crewly' }, createdAt: now, updatedAt: now },
|
|
163
|
+
{ id: 'D-2', question: 'Old?', options: [], defaultKey: 'wait', deadline: now, requestedBy: F.leadSession, asker: F.leadSession, teamId: F.teamId, status: 'resolved', createdAt: now, updatedAt: now },
|
|
164
|
+
],
|
|
165
|
+
});
|
|
166
|
+
// Slack channel mapping.
|
|
167
|
+
await writeJson(path.join(home, 'slack-team-channels.json'), {
|
|
168
|
+
version: 1,
|
|
169
|
+
autoCreate: true,
|
|
170
|
+
channelPrefix: '',
|
|
171
|
+
mappings: [{ teamId: F.teamId, slackChannelId: 'C0MOVERS', slackChannelName: 'movers', chatChannelId: F.channelId, createdAt: now, autoCreated: true }],
|
|
172
|
+
});
|
|
173
|
+
// Chat channels.
|
|
174
|
+
const db = openChatDatabase({ dbPath: path.join(home, 'chat.db'), skipIntegrityCheck: true });
|
|
175
|
+
try {
|
|
176
|
+
const insert = db.prepare('INSERT INTO chat_channels (id, agent_session, owner_user_id, name, purpose, created_at, type, team_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
|
|
177
|
+
insert.run(F.channelId, '', 'owner', 'movers', null, Date.parse(now), 'huddle', F.teamId);
|
|
178
|
+
insert.run(F.dmId, F.leadSession, 'owner', 'Lena', null, Date.parse(now), 'dm', null);
|
|
179
|
+
insert.run('chan-0003-decoy-dm', F.decoySession, 'owner', 'Dan', null, Date.parse(now), 'dm', null);
|
|
180
|
+
const member = db.prepare('INSERT INTO chat_channel_members (channel_id, member_session, joined_at) VALUES (?, ?, ?)');
|
|
181
|
+
member.run(F.channelId, F.leadSession, Date.parse(now));
|
|
182
|
+
member.run(F.channelId, F.devSession, Date.parse(now));
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
db.close();
|
|
186
|
+
}
|
|
187
|
+
return { root, home, projectDir, remoteDir, cleanup: () => fs.rm(root, { recursive: true, force: true }) };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* An empty target machine.
|
|
191
|
+
*
|
|
192
|
+
* @param root - Fixture root
|
|
193
|
+
* @returns Target home and projects root
|
|
194
|
+
*/
|
|
195
|
+
export async function buildTargetPaths(root) {
|
|
196
|
+
const home = path.join(root, 'target-home', '.crewly');
|
|
197
|
+
const projectsRoot = path.join(root, 'target-projects');
|
|
198
|
+
await fs.mkdir(home, { recursive: true });
|
|
199
|
+
await fs.mkdir(projectsRoot, { recursive: true });
|
|
200
|
+
return { home, projectsRoot };
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=team-move.fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move.fixture.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move.fixture.ts"],"names":[],"mappings":"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"}
|