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,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File helpers of the team move: walking with exclusions, a staging area that
|
|
3
|
+
* records a hash for every file it holds, text sniffing and path rewriting.
|
|
4
|
+
*
|
|
5
|
+
* @module services/team-move/team-move-fs
|
|
6
|
+
*/
|
|
7
|
+
import type { PackageFileEntry } from './team-move.types.js';
|
|
8
|
+
/** Directory names never packaged, at any depth (machine noise and build output). */
|
|
9
|
+
export declare const MOVE_EXCLUDED_DIR_NAMES: ReadonlySet<string>;
|
|
10
|
+
/**
|
|
11
|
+
* Whether a file name is left out of a package.
|
|
12
|
+
*
|
|
13
|
+
* @param name - File name (no directory)
|
|
14
|
+
* @returns True for backups, temp files, logs, JSONL transcripts and shell history
|
|
15
|
+
*/
|
|
16
|
+
export declare function isExcludedMoveFile(name: string): boolean;
|
|
17
|
+
/** A regular file found by {@link walkFiles}. */
|
|
18
|
+
export interface WalkedFile {
|
|
19
|
+
abs: string;
|
|
20
|
+
/** POSIX path relative to the walked root. */
|
|
21
|
+
rel: string;
|
|
22
|
+
size: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Walk the regular files under a directory, skipping excluded names. Symlinks
|
|
26
|
+
* are never followed or packaged.
|
|
27
|
+
*
|
|
28
|
+
* @param root - Directory to walk (a missing one yields nothing)
|
|
29
|
+
* @param extraExcludedDirs - Extra directory names to skip
|
|
30
|
+
* @yields Each file, directories in name order
|
|
31
|
+
*/
|
|
32
|
+
export declare function walkFiles(root: string, extraExcludedDirs?: ReadonlySet<string>): AsyncGenerator<WalkedFile>;
|
|
33
|
+
/**
|
|
34
|
+
* SHA-256 of a file, streamed.
|
|
35
|
+
*
|
|
36
|
+
* @param file - Absolute path
|
|
37
|
+
* @returns Hex digest
|
|
38
|
+
*/
|
|
39
|
+
export declare function sha256File(file: string): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* A directory the package is assembled in. Every file written through it is
|
|
42
|
+
* hashed and listed, which becomes the manifest's file list.
|
|
43
|
+
*/
|
|
44
|
+
export declare class StagingArea {
|
|
45
|
+
readonly root: string;
|
|
46
|
+
private readonly entries;
|
|
47
|
+
/** @param root - Absolute staging directory (created when missing) */
|
|
48
|
+
constructor(root: string);
|
|
49
|
+
/** Create the staging directory. */
|
|
50
|
+
init(): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Absolute path of a package path (refusing anything that escapes the root).
|
|
53
|
+
*
|
|
54
|
+
* @param rel - POSIX package path
|
|
55
|
+
* @returns Absolute path
|
|
56
|
+
*/
|
|
57
|
+
abs(rel: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Copy a file in, recording its hash.
|
|
60
|
+
*
|
|
61
|
+
* @param source - Absolute source file
|
|
62
|
+
* @param rel - POSIX package path
|
|
63
|
+
* @returns The recorded entry
|
|
64
|
+
*/
|
|
65
|
+
copyIn(source: string, rel: string): Promise<PackageFileEntry>;
|
|
66
|
+
/**
|
|
67
|
+
* Write a text/JSON file, recording its hash.
|
|
68
|
+
*
|
|
69
|
+
* @param rel - POSIX package path
|
|
70
|
+
* @param content - File content
|
|
71
|
+
* @returns The recorded entry
|
|
72
|
+
*/
|
|
73
|
+
writeText(rel: string, content: string): Promise<PackageFileEntry>;
|
|
74
|
+
/**
|
|
75
|
+
* Write a JSON file.
|
|
76
|
+
*
|
|
77
|
+
* @param rel - POSIX package path
|
|
78
|
+
* @param value - Value to serialise
|
|
79
|
+
* @returns The recorded entry
|
|
80
|
+
*/
|
|
81
|
+
writeJson(rel: string, value: unknown): Promise<PackageFileEntry>;
|
|
82
|
+
/**
|
|
83
|
+
* Remove a file again (secret-scan exclusion).
|
|
84
|
+
*
|
|
85
|
+
* @param rel - POSIX package path
|
|
86
|
+
*/
|
|
87
|
+
remove(rel: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Whether a package path is in the area.
|
|
90
|
+
*
|
|
91
|
+
* @param rel - POSIX package path
|
|
92
|
+
* @returns True when present
|
|
93
|
+
*/
|
|
94
|
+
has(rel: string): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Every recorded file, sorted by path.
|
|
97
|
+
*
|
|
98
|
+
* @returns File entries
|
|
99
|
+
*/
|
|
100
|
+
files(): PackageFileEntry[];
|
|
101
|
+
/**
|
|
102
|
+
* Total bytes of the recorded files.
|
|
103
|
+
*
|
|
104
|
+
* @returns Sum of sizes
|
|
105
|
+
*/
|
|
106
|
+
totalBytes(): number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Whether a path looks like a text file by its extension.
|
|
110
|
+
*
|
|
111
|
+
* @param file - File path or name
|
|
112
|
+
* @returns True for known text extensions and extension-less names
|
|
113
|
+
*/
|
|
114
|
+
export declare function hasTextExtension(file: string): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Whether a buffer looks like text (no NUL byte in the first 8 KB).
|
|
117
|
+
*
|
|
118
|
+
* @param head - First bytes of a file
|
|
119
|
+
* @returns True when no NUL is found
|
|
120
|
+
*/
|
|
121
|
+
export declare function looksLikeText(head: Buffer): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Replace a path prefix wherever it appears as a path in a text: followed by
|
|
124
|
+
* `/`, a quote, whitespace, end of text or other non-path characters.
|
|
125
|
+
*
|
|
126
|
+
* @param text - Text to rewrite
|
|
127
|
+
* @param from - Source path (no trailing slash)
|
|
128
|
+
* @param to - Target path
|
|
129
|
+
* @returns Rewritten text and the number of replacements
|
|
130
|
+
*/
|
|
131
|
+
export declare function rewritePathPrefix(text: string, from: string, to: string): {
|
|
132
|
+
text: string;
|
|
133
|
+
count: number;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Turn a name into a folder-safe slug.
|
|
137
|
+
*
|
|
138
|
+
* @param name - Project or team name
|
|
139
|
+
* @returns Lowercase slug of letters, digits, dot, dash and underscore
|
|
140
|
+
*/
|
|
141
|
+
export declare function slugify(name: string): string;
|
|
142
|
+
/**
|
|
143
|
+
* Whether a path exists.
|
|
144
|
+
*
|
|
145
|
+
* @param target - Absolute path
|
|
146
|
+
* @returns True when it can be stat'ed
|
|
147
|
+
*/
|
|
148
|
+
export declare function pathExists(target: string): Promise<boolean>;
|
|
149
|
+
/**
|
|
150
|
+
* Write a file atomically (temp file in the same directory, then rename), so a
|
|
151
|
+
* crash never leaves half a file. Accepts bytes, so binaries survive.
|
|
152
|
+
*
|
|
153
|
+
* @param dest - Destination path (its folder is created)
|
|
154
|
+
* @param content - Bytes to write
|
|
155
|
+
*/
|
|
156
|
+
export declare function writeFileAtomic(dest: string, content: Buffer): Promise<void>;
|
|
157
|
+
//# sourceMappingURL=team-move-fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-fs.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-fs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,qFAAqF;AACrF,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAAiF,CAAC;AAK1I;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED,iDAAiD;AACjD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAuB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,cAAc,CAAC,UAAU,CAAC,CAkB7H;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9D;AAED;;;GAGG;AACH,qBAAa,WAAW;IAIV,QAAQ,CAAC,IAAI,EAAE,MAAM;IAHjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D,sEAAsE;gBACjD,IAAI,EAAE,MAAM;IAEjC,oCAAoC;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMxB;;;;;;OAMG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqBpE;;;;;;OAMG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUxE;;;;;;OAMG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIvE;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;;;OAIG;IACH,KAAK,IAAI,gBAAgB,EAAE;IAI3B;;;;OAIG;IACH,UAAU,IAAI,MAAM;CAKrB;AAKD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6BzG;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjE;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlF"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File helpers of the team move: walking with exclusions, a staging area that
|
|
3
|
+
* records a hash for every file it holds, text sniffing and path rewriting.
|
|
4
|
+
*
|
|
5
|
+
* @module services/team-move/team-move-fs
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
import { createReadStream, createWriteStream } from 'node:fs';
|
|
9
|
+
import * as fs from 'node:fs/promises';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import { pipeline } from 'node:stream/promises';
|
|
12
|
+
import { BACKUP_EXCLUDED_FILE_NAMES, BACKUP_EXCLUDED_FILE_SUFFIXES } from '../backup/backup.types.js';
|
|
13
|
+
/** Directory names never packaged, at any depth (machine noise and build output). */
|
|
14
|
+
export const MOVE_EXCLUDED_DIR_NAMES = new Set(['node_modules', 'logs', '.orchestrator-state', '.git', '.DS_Store']);
|
|
15
|
+
/** File-name patterns never packaged: backups, temp files, logs, transcripts, shell history. */
|
|
16
|
+
const EXCLUDED_NAME_PATTERNS = [/\.bak(?:[-.].*)?$/, /\.tmp(?:\.|$)/, /\.orig$/, /~$/, /^\.DS_Store$/];
|
|
17
|
+
/**
|
|
18
|
+
* Whether a file name is left out of a package.
|
|
19
|
+
*
|
|
20
|
+
* @param name - File name (no directory)
|
|
21
|
+
* @returns True for backups, temp files, logs, JSONL transcripts and shell history
|
|
22
|
+
*/
|
|
23
|
+
export function isExcludedMoveFile(name) {
|
|
24
|
+
if (BACKUP_EXCLUDED_FILE_NAMES.includes(name))
|
|
25
|
+
return true;
|
|
26
|
+
if (BACKUP_EXCLUDED_FILE_SUFFIXES.some((suffix) => name.endsWith(suffix)))
|
|
27
|
+
return true;
|
|
28
|
+
return EXCLUDED_NAME_PATTERNS.some((re) => re.test(name));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Walk the regular files under a directory, skipping excluded names. Symlinks
|
|
32
|
+
* are never followed or packaged.
|
|
33
|
+
*
|
|
34
|
+
* @param root - Directory to walk (a missing one yields nothing)
|
|
35
|
+
* @param extraExcludedDirs - Extra directory names to skip
|
|
36
|
+
* @yields Each file, directories in name order
|
|
37
|
+
*/
|
|
38
|
+
export async function* walkFiles(root, extraExcludedDirs = new Set()) {
|
|
39
|
+
const walk = async function* (absDir, relDir) {
|
|
40
|
+
const entries = await fs.readdir(absDir, { withFileTypes: true }).catch(() => []);
|
|
41
|
+
entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
42
|
+
for (const e of entries) {
|
|
43
|
+
const rel = relDir ? `${relDir}/${e.name}` : e.name;
|
|
44
|
+
if (e.isSymbolicLink())
|
|
45
|
+
continue;
|
|
46
|
+
if (e.isDirectory()) {
|
|
47
|
+
if (MOVE_EXCLUDED_DIR_NAMES.has(e.name) || extraExcludedDirs.has(e.name))
|
|
48
|
+
continue;
|
|
49
|
+
yield* walk(path.join(absDir, e.name), rel);
|
|
50
|
+
}
|
|
51
|
+
else if (e.isFile() && !isExcludedMoveFile(e.name)) {
|
|
52
|
+
const abs = path.join(absDir, e.name);
|
|
53
|
+
const st = await fs.stat(abs).catch(() => null);
|
|
54
|
+
if (st?.isFile())
|
|
55
|
+
yield { abs, rel, size: st.size };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
yield* walk(root, '');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* SHA-256 of a file, streamed.
|
|
63
|
+
*
|
|
64
|
+
* @param file - Absolute path
|
|
65
|
+
* @returns Hex digest
|
|
66
|
+
*/
|
|
67
|
+
export async function sha256File(file) {
|
|
68
|
+
const hash = createHash('sha256');
|
|
69
|
+
await pipeline(createReadStream(file), async function (source) {
|
|
70
|
+
for await (const chunk of source)
|
|
71
|
+
hash.update(chunk);
|
|
72
|
+
});
|
|
73
|
+
return hash.digest('hex');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A directory the package is assembled in. Every file written through it is
|
|
77
|
+
* hashed and listed, which becomes the manifest's file list.
|
|
78
|
+
*/
|
|
79
|
+
export class StagingArea {
|
|
80
|
+
root;
|
|
81
|
+
entries = new Map();
|
|
82
|
+
/** @param root - Absolute staging directory (created when missing) */
|
|
83
|
+
constructor(root) {
|
|
84
|
+
this.root = root;
|
|
85
|
+
}
|
|
86
|
+
/** Create the staging directory. */
|
|
87
|
+
async init() {
|
|
88
|
+
await fs.mkdir(this.root, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Absolute path of a package path (refusing anything that escapes the root).
|
|
92
|
+
*
|
|
93
|
+
* @param rel - POSIX package path
|
|
94
|
+
* @returns Absolute path
|
|
95
|
+
*/
|
|
96
|
+
abs(rel) {
|
|
97
|
+
const target = path.resolve(this.root, ...rel.split('/'));
|
|
98
|
+
if (target !== this.root && !target.startsWith(this.root + path.sep))
|
|
99
|
+
throw new Error(`path escapes the package: ${rel}`);
|
|
100
|
+
return target;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Copy a file in, recording its hash.
|
|
104
|
+
*
|
|
105
|
+
* @param source - Absolute source file
|
|
106
|
+
* @param rel - POSIX package path
|
|
107
|
+
* @returns The recorded entry
|
|
108
|
+
*/
|
|
109
|
+
async copyIn(source, rel) {
|
|
110
|
+
const dest = this.abs(rel);
|
|
111
|
+
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
112
|
+
const hash = createHash('sha256');
|
|
113
|
+
let bytes = 0;
|
|
114
|
+
await pipeline(createReadStream(source), async function* (src) {
|
|
115
|
+
for await (const chunk of src) {
|
|
116
|
+
hash.update(chunk);
|
|
117
|
+
bytes += chunk.length;
|
|
118
|
+
yield chunk;
|
|
119
|
+
}
|
|
120
|
+
}, createWriteStream(dest));
|
|
121
|
+
const entry = { path: rel, sha256: hash.digest('hex'), bytes };
|
|
122
|
+
this.entries.set(rel, entry);
|
|
123
|
+
return entry;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Write a text/JSON file, recording its hash.
|
|
127
|
+
*
|
|
128
|
+
* @param rel - POSIX package path
|
|
129
|
+
* @param content - File content
|
|
130
|
+
* @returns The recorded entry
|
|
131
|
+
*/
|
|
132
|
+
async writeText(rel, content) {
|
|
133
|
+
const dest = this.abs(rel);
|
|
134
|
+
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
135
|
+
const buf = Buffer.from(content, 'utf8');
|
|
136
|
+
await fs.writeFile(dest, buf);
|
|
137
|
+
const entry = { path: rel, sha256: createHash('sha256').update(buf).digest('hex'), bytes: buf.length };
|
|
138
|
+
this.entries.set(rel, entry);
|
|
139
|
+
return entry;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Write a JSON file.
|
|
143
|
+
*
|
|
144
|
+
* @param rel - POSIX package path
|
|
145
|
+
* @param value - Value to serialise
|
|
146
|
+
* @returns The recorded entry
|
|
147
|
+
*/
|
|
148
|
+
async writeJson(rel, value) {
|
|
149
|
+
return this.writeText(rel, JSON.stringify(value, null, 2));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Remove a file again (secret-scan exclusion).
|
|
153
|
+
*
|
|
154
|
+
* @param rel - POSIX package path
|
|
155
|
+
*/
|
|
156
|
+
async remove(rel) {
|
|
157
|
+
this.entries.delete(rel);
|
|
158
|
+
await fs.rm(this.abs(rel), { force: true });
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Whether a package path is in the area.
|
|
162
|
+
*
|
|
163
|
+
* @param rel - POSIX package path
|
|
164
|
+
* @returns True when present
|
|
165
|
+
*/
|
|
166
|
+
has(rel) {
|
|
167
|
+
return this.entries.has(rel);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Every recorded file, sorted by path.
|
|
171
|
+
*
|
|
172
|
+
* @returns File entries
|
|
173
|
+
*/
|
|
174
|
+
files() {
|
|
175
|
+
return [...this.entries.values()].sort((a, b) => (a.path < b.path ? -1 : 1));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Total bytes of the recorded files.
|
|
179
|
+
*
|
|
180
|
+
* @returns Sum of sizes
|
|
181
|
+
*/
|
|
182
|
+
totalBytes() {
|
|
183
|
+
let sum = 0;
|
|
184
|
+
for (const e of this.entries.values())
|
|
185
|
+
sum += e.bytes;
|
|
186
|
+
return sum;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** File extensions that are rewritten and scanned as text. */
|
|
190
|
+
const TEXT_EXTENSIONS = new Set(['.md', '.json', '.txt', '.yaml', '.yml', '.csv', '.tsv', '.html', '.xml', '.toml', '.ini', '.env', '.sh', '.ts', '.js', '.py', '.sql', '.mdx', '.cfg', '.conf']);
|
|
191
|
+
/**
|
|
192
|
+
* Whether a path looks like a text file by its extension.
|
|
193
|
+
*
|
|
194
|
+
* @param file - File path or name
|
|
195
|
+
* @returns True for known text extensions and extension-less names
|
|
196
|
+
*/
|
|
197
|
+
export function hasTextExtension(file) {
|
|
198
|
+
const ext = path.extname(file).toLowerCase();
|
|
199
|
+
return ext === '' || TEXT_EXTENSIONS.has(ext);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Whether a buffer looks like text (no NUL byte in the first 8 KB).
|
|
203
|
+
*
|
|
204
|
+
* @param head - First bytes of a file
|
|
205
|
+
* @returns True when no NUL is found
|
|
206
|
+
*/
|
|
207
|
+
export function looksLikeText(head) {
|
|
208
|
+
const n = Math.min(head.length, 8000);
|
|
209
|
+
for (let i = 0; i < n; i++)
|
|
210
|
+
if (head[i] === 0)
|
|
211
|
+
return false;
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Replace a path prefix wherever it appears as a path in a text: followed by
|
|
216
|
+
* `/`, a quote, whitespace, end of text or other non-path characters.
|
|
217
|
+
*
|
|
218
|
+
* @param text - Text to rewrite
|
|
219
|
+
* @param from - Source path (no trailing slash)
|
|
220
|
+
* @param to - Target path
|
|
221
|
+
* @returns Rewritten text and the number of replacements
|
|
222
|
+
*/
|
|
223
|
+
export function rewritePathPrefix(text, from, to) {
|
|
224
|
+
const source = from.replace(/\/+$/, '');
|
|
225
|
+
const dest = to.replace(/\/+$/, '');
|
|
226
|
+
if (!source || source === dest || !text.includes(source))
|
|
227
|
+
return { text, count: 0 };
|
|
228
|
+
let count = 0;
|
|
229
|
+
let out = '';
|
|
230
|
+
let index = 0;
|
|
231
|
+
for (;;) {
|
|
232
|
+
const hit = text.indexOf(source, index);
|
|
233
|
+
if (hit < 0)
|
|
234
|
+
break;
|
|
235
|
+
const before = hit === 0 ? '' : text[hit - 1];
|
|
236
|
+
const after = text[hit + source.length] ?? '';
|
|
237
|
+
// Not part of a longer path: the character before is not a path character
|
|
238
|
+
// and the character after does not continue the final segment.
|
|
239
|
+
const startsPath = before === '' || !/[A-Za-z0-9._~-]/.test(before);
|
|
240
|
+
// A full stop ends a sentence, not the folder name, when whitespace or the end follows it.
|
|
241
|
+
const next = text[hit + source.length + 1] ?? '';
|
|
242
|
+
const endsPath = after === '' || !/[A-Za-z0-9._~-]/.test(after) || (after === '.' && (next === '' || /[\s"')\]]/.test(next)));
|
|
243
|
+
out += text.slice(index, hit);
|
|
244
|
+
if (startsPath && endsPath) {
|
|
245
|
+
out += dest;
|
|
246
|
+
count += 1;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
out += source;
|
|
250
|
+
}
|
|
251
|
+
index = hit + source.length;
|
|
252
|
+
}
|
|
253
|
+
out += text.slice(index);
|
|
254
|
+
return { text: out, count };
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Turn a name into a folder-safe slug.
|
|
258
|
+
*
|
|
259
|
+
* @param name - Project or team name
|
|
260
|
+
* @returns Lowercase slug of letters, digits, dot, dash and underscore
|
|
261
|
+
*/
|
|
262
|
+
export function slugify(name) {
|
|
263
|
+
const slug = name
|
|
264
|
+
.normalize('NFKD')
|
|
265
|
+
.replace(/[^\p{L}\p{N}._-]+/gu, '-')
|
|
266
|
+
.replace(/^-+|-+$/g, '')
|
|
267
|
+
.toLowerCase();
|
|
268
|
+
return slug.length > 0 ? slug.slice(0, 60) : 'project';
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Whether a path exists.
|
|
272
|
+
*
|
|
273
|
+
* @param target - Absolute path
|
|
274
|
+
* @returns True when it can be stat'ed
|
|
275
|
+
*/
|
|
276
|
+
export async function pathExists(target) {
|
|
277
|
+
return fs.stat(target).then(() => true, () => false);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Write a file atomically (temp file in the same directory, then rename), so a
|
|
281
|
+
* crash never leaves half a file. Accepts bytes, so binaries survive.
|
|
282
|
+
*
|
|
283
|
+
* @param dest - Destination path (its folder is created)
|
|
284
|
+
* @param content - Bytes to write
|
|
285
|
+
*/
|
|
286
|
+
export async function writeFileAtomic(dest, content) {
|
|
287
|
+
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
288
|
+
const temp = `${dest}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;
|
|
289
|
+
try {
|
|
290
|
+
await fs.writeFile(temp, content, { flag: 'wx' });
|
|
291
|
+
await fs.rename(temp, dest);
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
await fs.rm(temp, { force: true }).catch(() => undefined);
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=team-move-fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-fs.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git side of the team move: read a repository's state on the source, and put
|
|
3
|
+
* a repository back at a recorded branch and commit on the target.
|
|
4
|
+
*
|
|
5
|
+
* Code never travels in the package. The source records where each project's
|
|
6
|
+
* repository lives (remote, branch, head, dirty) and refuses to move while
|
|
7
|
+
* work exists only on that machine; the target fetches the code itself with
|
|
8
|
+
* its own git credentials.
|
|
9
|
+
*
|
|
10
|
+
* @module services/team-move/team-move-git
|
|
11
|
+
*/
|
|
12
|
+
import type { PackageRepo } from './team-move.types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Run git in a directory.
|
|
15
|
+
*
|
|
16
|
+
* @param cwd - Working directory
|
|
17
|
+
* @param args - Git arguments
|
|
18
|
+
* @param timeoutMs - Kill after this long
|
|
19
|
+
* @returns Trimmed stdout
|
|
20
|
+
* @throws Error with git's stderr
|
|
21
|
+
*/
|
|
22
|
+
export declare function git(cwd: string, args: string[], timeoutMs?: number): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Read the state of the repository a project lives in.
|
|
25
|
+
*
|
|
26
|
+
* `.crewly/` is ignored when judging "dirty": Crewly's own data goes through
|
|
27
|
+
* the package, so it must not block a move. The remote is read as configured
|
|
28
|
+
* (`git config`), not through `url.*.insteadOf` rewrites, which are local to
|
|
29
|
+
* this machine.
|
|
30
|
+
*
|
|
31
|
+
* @param project - Project identity
|
|
32
|
+
* @param project.id - Project id
|
|
33
|
+
* @param project.name - Project name
|
|
34
|
+
* @param project.path - Absolute project path
|
|
35
|
+
* @returns Repo record (never throws)
|
|
36
|
+
*/
|
|
37
|
+
export declare function inspectRepo(project: {
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
path: string;
|
|
41
|
+
}): Promise<PackageRepo>;
|
|
42
|
+
/**
|
|
43
|
+
* Describe what the owner has to push or commit before a move.
|
|
44
|
+
*
|
|
45
|
+
* @param repos - Repos from {@link inspectRepo}
|
|
46
|
+
* @returns One line per repo that blocks the move (empty when none)
|
|
47
|
+
*/
|
|
48
|
+
export declare function describeBlockingRepos(repos: readonly PackageRepo[]): string[];
|
|
49
|
+
/** Outcome of {@link restoreRepo}. */
|
|
50
|
+
export interface RestoreRepoResult {
|
|
51
|
+
ok: boolean;
|
|
52
|
+
branch: string | null;
|
|
53
|
+
headSha: string | null;
|
|
54
|
+
/** Non-fatal notes (e.g. the recorded commit is not on the remote). */
|
|
55
|
+
warnings: string[];
|
|
56
|
+
error?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Put a repository at the recorded remote, branch and commit. Works for an
|
|
60
|
+
* empty folder, a folder that only holds `.crewly/` and an existing clone.
|
|
61
|
+
* Never discards local changes and never prompts for credentials.
|
|
62
|
+
*
|
|
63
|
+
* @param dest - Target folder (created when missing)
|
|
64
|
+
* @param repo - Recorded state from the source
|
|
65
|
+
* @param timeoutMs - Per git network call
|
|
66
|
+
* @returns Result (never throws)
|
|
67
|
+
*/
|
|
68
|
+
export declare function restoreRepo(dest: string, repo: Pick<PackageRepo, 'remoteUrl' | 'branch' | 'headSha'>, timeoutMs?: number): Promise<RestoreRepoResult>;
|
|
69
|
+
//# sourceMappingURL=team-move-git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-git.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-git.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAaxD;;;;;;;;GAQG;AACH,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CAY5G;AAYD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAkC3G;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAS7E;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,EAC3D,SAAS,GAAE,MAA2C,GACrD,OAAO,CAAC,iBAAiB,CAAC,CAiD5B"}
|