Files
calendar/specs
Udit TakkarGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>Udit TakkarUdit Takkar
4081d11fbe feat: workflow auto translation (#27087)
* feat: workflow auto translation

* tests: add unit tests

* refactor: tests and workflow

* fix: type err

* fix: type err

* fix: remove redundant index on WorkflowStepTranslation

The @@index on [workflowStepId, field, targetLocale] duplicates the @@unique
constraint on the same columns. A unique index already provides efficient
lookups, so the separate @@index adds storage overhead and write latency
without benefit.

Addresses Cubic AI review feedback (confidence 9/10).

Co-Authored-By: unknown <>

* fix: correct locale mapping when translation API returns null

Map translations with their corresponding locales before filtering to
preserve correct locale-to-translation associations. Previously, filtering
out null translations would reindex the array, causing incorrect locale
mappings when any translation in the batch failed.

Also fixes pre-existing lint warnings:
- Move exports to end of file
- Add explicit return type to processTranslations
- Replace ternary with if-else for upsertMany selection

Co-Authored-By: udit@cal.com <udit222001@gmail.com>

* fix: address review feedback for workflow auto-translation

- Add change detection before creating translation tasks
- Rename userLocale to sourceLocale in task props for clarity
- Show source language in UI with new translation key
- Extract SUPPORTED_LOCALES to shared translationConstants.ts
- Fix locale mapping bug in translateEventTypeData.ts
- Add WhatsApp translation support
- Abstract translation lookup into shared translationLookup.ts helper
- Restore if-else readability for SCANNING_WORKFLOW_STEPS

Co-authored-by: Udit Takkar <udit.takkar@cal.com>
Co-Authored-By: unknown <>

* fix: update test to use sourceLocale instead of userLocale

Co-Authored-By: unknown <>

* refactor: feedback

* fix: handle first time

* fix: tests

* fix: tests

* fix: address Cubic AI review feedback (confidence 9/10 issues)

- WhatsApp translation: Apply variable substitution using getSMSMessageWithVariables
  and clear contentSid when using translated body to ensure Twilio uses the
  translated text instead of the original template

- update.handler.ts: Change sourceLocale assignment from ?? to || for consistency
  with tasker payload behavior (line 481)

- ITranslationService.ts: Rename methods from plural to singular naming:
  - getWorkflowStepTranslations -> getWorkflowStepTranslation
  - getEventTypeTranslations -> getEventTypeTranslation
  Updated all call sites and tests accordingly

Co-Authored-By: unknown <>

* fix: address Cubic AI review feedback (confidence 9/10+ issues)

- Fix getSMSMessageWithVariables to handle WHATSAPP_ATTENDEE action for
  locale and timezone (confidence 9/10)
- Remove WhatsApp translation feature that set contentSid to undefined
  since Twilio ignores body parameter for WhatsApp and requires
  pre-approved Message Templates (confidence 10/10)

Co-Authored-By: unknown <>

* fix: translatio

* Add tests: packages/features/eventTypeTranslation/repositories/EventTypeTranslationRepository.test.ts

Generated by Paragon from proposal for PR #27087

* Add tests: packages/features/tasker/tasks/translateWorkflowStepData.test.ts

Generated by Paragon from proposal for PR #27087

* chore: nit

* chore: verfied atg

* fix: set sourceLocale for new steps, add shouldDirty to checkbox, remove spec docs

- Set sourceLocale fallback in addedSteps mapping to fix stale detection mismatch
- Add { shouldDirty: true } to autoTranslateEnabled checkbox onChange
- Remove specs/workflow-translation/ directory (planning docs, not for repo)

Co-authored-by: Udit Takkar <udit.07.takkar@gmail.com>
Co-Authored-By: unknown <>

* chore: add specs back

* fix: type error

* fix: type error

* fix: type err

* fix: tests

* refactor: feedback

* fix: type err

* refactor

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Udit Takkar <udit.takkar@cal.com>
Co-authored-by: Udit Takkar <udit.07.takkar@gmail.com>
2026-02-25 01:03:55 +05:30
..

Spec-First Development

This folder contains design documents for features in development. Claude reads these to understand what to build and track progress.

How It Works

  1. Before implementing a feature, create a spec folder with design docs
  2. Claude reads the design before writing any code
  3. Progress is tracked in implementation.md for session continuity
  4. Decisions are recorded in decisions.md for future reference
  5. Docs are generated with screenshots when feature is complete

Starting a New Feature

cp -r specs/_templates specs/{feature-name}

Then tell Claude:

"I want to build {feature}. Here's my idea: [description].
Review the codebase and fill in specs/{feature}/design.md"

File Structure

Each feature has:

File/Folder Purpose
CLAUDE.md Instructions for Claude when working on this feature
design.md Source of truth - what to build and how
implementation.md Progress tracking - what's done, in progress, blocked
decisions.md Architecture Decision Records (ADRs)
prompts.md Reusable prompts for common tasks
future-work.md Deferred ideas and enhancements
docs/ Internal documentation with screenshots
docs/screenshots/ Screenshots captured during development

Session Continuity

When starting a new Claude session:

"Continue working on {feature}"

Claude will read implementation.md to pick up where it left off.

Generating Documentation

When a feature is ready for documentation:

"Generate docs with screenshots for {feature}"

Claude will:

  1. Open the feature in browser
  2. Take screenshots of key UI states
  3. Save to specs/{feature}/docs/screenshots/
  4. Update specs/{feature}/docs/README.md

Promoting to Public Docs

When internal docs are ready for customers:

"Promote {feature} docs to public"

Claude will:

  1. Copy content to docs/{feature}.mdx (Mintlify format)
  2. Move screenshots to docs/images/{feature}/
  3. Update docs/mint.json navigation
  4. Adjust language for customer audience

The Most Important Rule

Every PR must be reviewable in under 10 minutes:

  • Max 5-7 files changed (excluding tests)
  • Max 500 lines changed
  • One focused change per PR

If your change is bigger, split it into multiple PRs.