@autocode-cli/autocode 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/server/dashboard/pages/autocreate.js +3 -3
  2. package/dist/server/dashboard/pages/changelog.d.ts.map +1 -1
  3. package/dist/server/dashboard/pages/changelog.js +20 -11
  4. package/dist/server/dashboard/pages/changelog.js.map +1 -1
  5. package/dist/server/dashboard/pages/column-edit.js +2 -2
  6. package/dist/server/dashboard/pages/column-prompt.d.ts.map +1 -1
  7. package/dist/server/dashboard/pages/column-prompt.js +21 -0
  8. package/dist/server/dashboard/pages/column-prompt.js.map +1 -1
  9. package/dist/server/dashboard/pages/column-terminal.d.ts.map +1 -1
  10. package/dist/server/dashboard/pages/column-terminal.js +21 -0
  11. package/dist/server/dashboard/pages/column-terminal.js.map +1 -1
  12. package/dist/server/dashboard/pages/issue-graph.d.ts.map +1 -1
  13. package/dist/server/dashboard/pages/issue-graph.js +70 -22
  14. package/dist/server/dashboard/pages/issue-graph.js.map +1 -1
  15. package/dist/server/dashboard/pages/issue-shared.d.ts.map +1 -1
  16. package/dist/server/dashboard/pages/issue-shared.js +54 -122
  17. package/dist/server/dashboard/pages/issue-shared.js.map +1 -1
  18. package/dist/server/dashboard/pages/issue-view.js +1 -1
  19. package/dist/server/dashboard/pages/new-issue.d.ts.map +1 -1
  20. package/dist/server/dashboard/pages/new-issue.js +34 -128
  21. package/dist/server/dashboard/pages/new-issue.js.map +1 -1
  22. package/dist/server/dashboard/pages/pipeline-configurator.d.ts.map +1 -1
  23. package/dist/server/dashboard/pages/pipeline-configurator.js +39 -183
  24. package/dist/server/dashboard/pages/pipeline-configurator.js.map +1 -1
  25. package/dist/server/dashboard/pages/stats-page.d.ts.map +1 -1
  26. package/dist/server/dashboard/pages/stats-page.js +43 -109
  27. package/dist/server/dashboard/pages/stats-page.js.map +1 -1
  28. package/dist/server/dashboard/scripts/index.d.ts.map +1 -1
  29. package/dist/server/dashboard/scripts/index.js +48 -253
  30. package/dist/server/dashboard/scripts/index.js.map +1 -1
  31. package/dist/server/dashboard/shared/header.d.ts +88 -0
  32. package/dist/server/dashboard/shared/header.d.ts.map +1 -0
  33. package/dist/server/dashboard/shared/header.js +209 -0
  34. package/dist/server/dashboard/shared/header.js.map +1 -0
  35. package/dist/server/dashboard/shared/i18n-script.d.ts +45 -0
  36. package/dist/server/dashboard/shared/i18n-script.d.ts.map +1 -0
  37. package/dist/server/dashboard/shared/i18n-script.js +204 -0
  38. package/dist/server/dashboard/shared/i18n-script.js.map +1 -0
  39. package/dist/server/dashboard/shared/index.d.ts +19 -0
  40. package/dist/server/dashboard/shared/index.d.ts.map +1 -0
  41. package/dist/server/dashboard/shared/index.js +22 -0
  42. package/dist/server/dashboard/shared/index.js.map +1 -0
  43. package/dist/server/dashboard/shared/translations.d.ts +515 -0
  44. package/dist/server/dashboard/shared/translations.d.ts.map +1 -0
  45. package/dist/server/dashboard/shared/translations.js +591 -0
  46. package/dist/server/dashboard/shared/translations.js.map +1 -0
  47. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"new-issue.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/new-issue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAw9BzD"}
1
+ {"version":3,"file":"new-issue.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/new-issue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAy3BzD"}
@@ -2,6 +2,7 @@
2
2
  * New issue page generator
3
3
  */
4
4
  import { getColumns } from '../../../core/column.js';
5
+ import { generateI18nScript, generateLangSwitcher } from '../shared/index.js';
5
6
  /**
6
7
  * Generate the new issue page
7
8
  */
@@ -62,7 +63,7 @@ export function generateNewIssuePage(lang) {
62
63
  font-size: 18px;
63
64
  font-weight: 600;
64
65
  }
65
- .lang-selector {
66
+ .lang-switcher {
66
67
  display: flex;
67
68
  gap: 4px;
68
69
  }
@@ -385,10 +386,7 @@ export function generateNewIssuePage(lang) {
385
386
  <header class="header">
386
387
  <a href="/" class="back-btn">← Dashboard</a>
387
388
  <h1 class="title" id="page-title" data-i18n="newIssue.title">New Issue</h1>
388
- <div class="lang-selector" id="lang-selector">
389
- <button class="lang-btn" data-lang="en">EN</button>
390
- <button class="lang-btn" data-lang="fr">FR</button>
391
- </div>
389
+ ${generateLangSwitcher()}
392
390
  </header>
393
391
 
394
392
  <div class="container">
@@ -497,117 +495,39 @@ export function generateNewIssuePage(lang) {
497
495
  </div>
498
496
 
499
497
  <script>
500
- const STORAGE_KEY = 'autocode-lang';
501
- let currentLang = localStorage.getItem(STORAGE_KEY) || 'fr';
502
- let selectedLabels = [];
498
+ ${generateI18nScript({
499
+ keys: [
500
+ // New issue page keys
501
+ 'newIssue.title', 'newIssue.titleLabel', 'newIssue.titlePlaceholder',
502
+ 'newIssue.description', 'newIssue.descriptionPlaceholder',
503
+ 'newIssue.priority', 'newIssue.releaseType', 'newIssue.column',
504
+ 'newIssue.labels', 'newIssue.selectLabel', 'newIssue.acceptanceCriteria',
505
+ 'newIssue.addCriteria',
506
+ // Priority keys
507
+ 'priority.p0', 'priority.p1', 'priority.p2', 'priority.p3',
508
+ // Semver keys
509
+ 'semver.patch', 'semver.minor', 'semver.major', 'semver.none',
510
+ // Button keys
511
+ 'btn.cancel', 'btn.createIssue', 'btn.creating',
512
+ 'btn.autocomplete', 'btn.autocompleting',
513
+ // Notification keys
514
+ 'notify.created', 'notify.error', 'notify.titleRequired',
515
+ 'notify.autocompleteSuccess', 'notify.autocompleteTitleRequired',
516
+ 'notify.micNotSupported', 'notify.micError', 'notify.micErrorNetwork',
517
+ 'notify.micErrorNotAllowed', 'notify.micErrorNoSpeech', 'notify.micRetrying',
518
+ // Mic keys
519
+ 'mic.title', 'mic.titleRecording', 'mic.notSupported',
520
+ // Countdown keys
521
+ 'countdown.autocompletingIn', 'countdown.cancel', 'countdown.now', 'countdown.seconds',
522
+ ],
523
+ onLangChangeCallback: 'onLangChange',
524
+ })}
503
525
 
504
- const translations = {
505
- en: {
506
- 'newIssue.title': 'New Issue',
507
- 'newIssue.titleLabel': 'Title *',
508
- 'newIssue.titlePlaceholder': 'E.g.: Fix the login bug',
509
- 'newIssue.description': 'Description',
510
- 'newIssue.descriptionPlaceholder': 'Describe the context and details...',
511
- 'newIssue.priority': 'Priority',
512
- 'newIssue.releaseType': 'Release type',
513
- 'newIssue.column': 'Target column',
514
- 'newIssue.labels': 'Labels',
515
- 'newIssue.selectLabel': 'Select a label...',
516
- 'newIssue.acceptanceCriteria': 'Acceptance criteria',
517
- 'newIssue.addCriteria': 'Add criteria',
518
- 'priority.p0': 'P0 - Critical',
519
- 'priority.p1': 'P1 - High',
520
- 'priority.p2': 'P2 - Normal',
521
- 'priority.p3': 'P3 - Low',
522
- 'semver.patch': 'Patch (x.x.X) - Bug fix',
523
- 'semver.minor': 'Minor (x.X.0) - Feature',
524
- 'semver.major': 'Major (X.0.0) - Breaking',
525
- 'semver.none': 'No deployment',
526
- 'btn.cancel': 'Cancel',
527
- 'btn.createIssue': 'Create issue',
528
- 'btn.creating': 'Creating...',
529
- 'btn.autocomplete': 'AutoComplete',
530
- 'btn.autocompleting': 'Generating...',
531
- 'notify.created': 'Issue created successfully!',
532
- 'notify.error': 'Error',
533
- 'notify.titleRequired': 'Title is required',
534
- 'notify.autocompleteSuccess': 'Fields auto-filled!',
535
- 'notify.autocompleteTitleRequired': 'Enter a title first',
536
- 'mic.title': 'Speech to text',
537
- 'mic.titleRecording': 'Recording... Click to stop',
538
- 'mic.notSupported': 'Speech recognition not supported',
539
- 'notify.micNotSupported': 'Speech recognition is not supported by your browser',
540
- 'notify.micError': 'Speech recognition error',
541
- 'notify.micErrorNetwork': 'Network error: Speech recognition requires an internet connection. Make sure you are connected and try again.',
542
- 'notify.micErrorNotAllowed': 'Microphone access denied. Please allow microphone access in your browser settings.',
543
- 'notify.micErrorNoSpeech': 'No speech detected. Please speak louder or closer to the microphone.',
544
- 'notify.micRetrying': 'Network error, retrying...',
545
- 'countdown.autocompletingIn': 'AutoComplete in',
546
- 'countdown.cancel': 'Cancel',
547
- 'countdown.now': 'Now',
548
- 'countdown.seconds': 's'
549
- },
550
- fr: {
551
- 'newIssue.title': 'Nouveau ticket',
552
- 'newIssue.titleLabel': 'Titre *',
553
- 'newIssue.titlePlaceholder': 'Ex: Corriger le bug de connexion',
554
- 'newIssue.description': 'Description',
555
- 'newIssue.descriptionPlaceholder': 'Décrivez le contexte et les détails...',
556
- 'newIssue.priority': 'Priorité',
557
- 'newIssue.releaseType': 'Type de release',
558
- 'newIssue.column': 'Colonne cible',
559
- 'newIssue.labels': 'Labels',
560
- 'newIssue.selectLabel': 'Sélectionner un label...',
561
- 'newIssue.acceptanceCriteria': "Critères d'acceptation",
562
- 'newIssue.addCriteria': 'Ajouter un critère',
563
- 'priority.p0': 'P0 - Critique',
564
- 'priority.p1': 'P1 - Haute',
565
- 'priority.p2': 'P2 - Normale',
566
- 'priority.p3': 'P3 - Basse',
567
- 'semver.patch': 'Patch (x.x.X) - Correction',
568
- 'semver.minor': 'Minor (x.X.0) - Fonctionnalité',
569
- 'semver.major': 'Major (X.0.0) - Rupture',
570
- 'semver.none': 'Pas de déploiement',
571
- 'btn.cancel': 'Annuler',
572
- 'btn.createIssue': 'Créer le ticket',
573
- 'btn.creating': 'Création...',
574
- 'btn.autocomplete': 'AutoComplete',
575
- 'btn.autocompleting': 'Génération...',
576
- 'notify.created': 'Ticket créé avec succès !',
577
- 'notify.error': 'Erreur',
578
- 'notify.titleRequired': 'Le titre est requis',
579
- 'notify.autocompleteSuccess': 'Champs remplis automatiquement !',
580
- 'notify.autocompleteTitleRequired': 'Entrez un titre d\\'abord',
581
- 'mic.title': 'Dictée vocale',
582
- 'mic.titleRecording': 'Enregistrement... Cliquer pour arrêter',
583
- 'mic.notSupported': 'Reconnaissance vocale non supportée',
584
- 'notify.micNotSupported': 'La reconnaissance vocale n\\'est pas supportée par votre navigateur',
585
- 'notify.micError': 'Erreur de reconnaissance vocale',
586
- 'notify.micErrorNetwork': 'Erreur réseau : La reconnaissance vocale nécessite une connexion internet. Vérifiez votre connexion et réessayez.',
587
- 'notify.micErrorNotAllowed': 'Accès au microphone refusé. Veuillez autoriser l\\'accès au microphone dans les paramètres de votre navigateur.',
588
- 'notify.micErrorNoSpeech': 'Aucune parole détectée. Parlez plus fort ou rapprochez-vous du microphone.',
589
- 'notify.micRetrying': 'Erreur réseau, nouvelle tentative...',
590
- 'countdown.autocompletingIn': 'AutoComplete dans',
591
- 'countdown.cancel': 'Annuler',
592
- 'countdown.now': 'Maintenant',
593
- 'countdown.seconds': 's'
594
- }
595
- };
596
-
597
- function t(key) {
598
- return translations[currentLang]?.[key] || translations['en'][key] || key;
599
- }
526
+ let selectedLabels = [];
600
527
 
601
- function updateLangUI() {
602
- document.querySelectorAll('.lang-btn').forEach(btn => {
603
- btn.classList.toggle('active', btn.dataset.lang === currentLang);
604
- });
605
- document.querySelectorAll('[data-i18n]').forEach(el => {
606
- el.textContent = t(el.dataset.i18n);
607
- });
608
- document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
609
- el.placeholder = t(el.dataset.i18nPlaceholder);
610
- });
528
+ // Callback called after language switch
529
+ function onLangChange() {
530
+ updateMicButton();
611
531
  }
612
532
 
613
533
  function addLabel(select) {
@@ -704,19 +624,6 @@ export function generateNewIssuePage(lang) {
704
624
  setTimeout(() => notification.className = 'notification', 3000);
705
625
  }
706
626
 
707
- // Language switcher
708
- document.querySelectorAll('.lang-btn').forEach(btn => {
709
- btn.addEventListener('click', () => {
710
- const newLang = btn.dataset.lang;
711
- if (newLang !== currentLang) {
712
- currentLang = newLang;
713
- localStorage.setItem(STORAGE_KEY, newLang);
714
- updateLangUI();
715
- updateMicButton();
716
- }
717
- });
718
- });
719
-
720
627
  async function autocomplete() {
721
628
  const title = document.getElementById('issue-title').value.trim();
722
629
  if (!title) {
@@ -983,7 +890,6 @@ export function generateNewIssuePage(lang) {
983
890
  }
984
891
 
985
892
  // Init
986
- updateLangUI();
987
893
  updateMicButton();
988
894
  </script>
989
895
  </body>
@@ -1 +1 @@
1
- {"version":3,"file":"new-issue.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/new-issue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAErE,OAAO;cACK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAkbJ,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,kBAAkB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAgiBjJ,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"new-issue.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/new-issue.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-configurator.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/pipeline-configurator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+3DrE"}
1
+ {"version":3,"file":"pipeline-configurator.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/pipeline-configurator.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8BH;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAstDrE"}
@@ -1,6 +1,31 @@
1
1
  /**
2
2
  * Pipeline configurator page generator
3
3
  */
4
+ import { generateI18nScript, generateLangSwitcher } from '../shared/index.js';
5
+ // Pipeline-specific translation keys
6
+ const pipelineKeys = [
7
+ 'pipeline.backBtn', 'pipeline.title', 'pipeline.titleSpan', 'pipeline.savePipeline',
8
+ 'pipeline.activateSync', 'pipeline.pipelines', 'pipeline.newPipeline', 'pipeline.noSelected',
9
+ 'pipeline.noSelectedDesc', 'pipeline.createFirst', 'pipeline.pipelineName', 'pipeline.version',
10
+ 'pipeline.delete', 'pipeline.description', 'pipeline.descPlaceholder', 'pipeline.definition',
11
+ 'pipeline.definitionDesc', 'pipeline.action', 'pipeline.actionDesc', 'pipeline.finish',
12
+ 'pipeline.finishDesc', 'pipeline.catalog', 'pipeline.catalogHint', 'pipeline.addColumn',
13
+ 'pipeline.syncPreview', 'pipeline.createNewPipeline', 'pipeline.create', 'pipeline.cancel',
14
+ 'pipeline.addColumnTitle', 'pipeline.addColumnDesc', 'pipeline.columnName', 'pipeline.segment',
15
+ 'pipeline.segmentDefinition', 'pipeline.segmentAction', 'pipeline.segmentFinish',
16
+ 'pipeline.describeColumn', 'pipeline.generateClaude', 'pipeline.generating', 'pipeline.promptPreview',
17
+ 'pipeline.loading', 'pipeline.noPrompt', 'pipeline.columnBelongsTo', 'pipeline.segmentLabel',
18
+ 'pipeline.cannotMoveBetween', 'pipeline.columnExists', 'pipeline.pipelineSaved',
19
+ 'pipeline.pipelineCreated', 'pipeline.pipelineDeleted', 'pipeline.pipelineActivated',
20
+ 'pipeline.fillAllFields', 'pipeline.enterPipelineName', 'pipeline.keyExists',
21
+ 'pipeline.confirmDelete', 'pipeline.selectPipeline', 'pipeline.selectPipelineDesc',
22
+ 'pipeline.columnAdded', 'pipeline.errorFillFields', 'pipeline.errorColumnExists',
23
+ 'pipeline.errorGeneric', 'pipeline.applyColumn', 'pipeline.removeColumn', 'pipeline.columnApplied',
24
+ 'pipeline.columnRemoved', 'pipeline.selectPipelineFirst', 'pipeline.analyze', 'pipeline.analysisTitle',
25
+ 'pipeline.analyzing', 'pipeline.analysisError', 'pipeline.close', 'pipeline.autocreateTitle',
26
+ 'pipeline.autocreateDesc', 'pipeline.autocreateBtn', 'pipeline.analyzeSectionTitle',
27
+ 'pipeline.analyzeSectionDesc', 'pipeline.analyzeSectionBtn',
28
+ ];
4
29
  /**
5
30
  * Generate the pipeline configurator page
6
31
  */
@@ -576,10 +601,7 @@ export function generatePipelineConfiguratorPage(lang) {
576
601
  <header class="header">
577
602
  <a href="/" class="back-btn">← Dashboard</a>
578
603
  <h1 class="title"><span>Pipeline</span> Configurator</h1>
579
- <div class="lang-switcher" id="lang-switcher">
580
- <button class="lang-btn" data-lang="en">EN</button>
581
- <button class="lang-btn" data-lang="fr">FR</button>
582
- </div>
604
+ ${generateLangSwitcher()}
583
605
  <button class="btn btn-success" id="savePipelineBtn" disabled>Save Pipeline</button>
584
606
  <button class="btn btn-primary" id="activateBtn" disabled>Activate & Sync</button>
585
607
  </header>
@@ -788,166 +810,21 @@ export function generatePipelineConfiguratorPage(lang) {
788
810
  </div>
789
811
 
790
812
  <script>
791
- // Translations
792
- const translations = {
793
- en: {
794
- backBtn: '← Dashboard',
795
- title: 'Configurator',
796
- titleSpan: 'Pipeline',
797
- savePipeline: 'Save Pipeline',
798
- activateSync: 'Activate & Sync',
799
- pipelines: 'Pipelines',
800
- newPipeline: '+ New Pipeline',
801
- noSelected: 'No Pipeline Selected',
802
- noSelectedDesc: 'Select a pipeline from the list or create a new one.',
803
- createFirst: 'Create First Pipeline',
804
- pipelineName: 'Pipeline Name',
805
- version: 'Version',
806
- delete: 'Delete',
807
- description: 'Description (optional)',
808
- descPlaceholder: 'Short description of this pipeline',
809
- definition: 'DEFINITION',
810
- definitionDesc: 'Qualification and preparation columns',
811
- action: 'ACTION',
812
- actionDesc: 'Implementation and validation columns',
813
- finish: 'FINISH',
814
- finishDesc: 'Finalization and deployment columns',
815
- catalog: 'Column Catalog',
816
- catalogHint: '(drag columns to segments above)',
817
- addColumn: '+ Add Column',
818
- syncPreview: 'Sync Preview',
819
- createNewPipeline: 'Create New Pipeline',
820
- create: 'Create',
821
- cancel: 'Cancel',
822
- addColumnTitle: 'Add New Column to Catalog',
823
- addColumnDesc: 'Describe your idea and Claude will generate the prompt in EN/FR.',
824
- columnName: 'Column Name',
825
- segment: 'Segment',
826
- segmentDefinition: 'Definition (preparation)',
827
- segmentAction: 'Action (implementation)',
828
- segmentFinish: 'Finish (deployment)',
829
- describeColumn: 'Describe what this column should do',
830
- generateClaude: 'Generate with Claude',
831
- generating: 'Generating...',
832
- promptPreview: 'Column Prompt',
833
- loading: 'Loading...',
834
- noPrompt: '(No prompt available for this column)',
835
- columnBelongsTo: 'This column belongs to the',
836
- segmentLabel: 'segment',
837
- cannotMoveBetween: 'Columns cannot be moved between segments',
838
- columnExists: 'Column already exists in this segment',
839
- pipelineSaved: 'Pipeline saved!',
840
- pipelineCreated: 'Pipeline created!',
841
- pipelineDeleted: 'Pipeline deleted',
842
- pipelineActivated: 'Pipeline activated and synced!',
843
- fillAllFields: 'Please fill in all fields',
844
- enterPipelineName: 'Please enter a pipeline name',
845
- keyExists: 'A pipeline with this key already exists',
846
- confirmDelete: 'Are you sure you want to delete this pipeline?',
847
- selectPipeline: 'Select a Pipeline',
848
- selectPipelineDesc: 'Click on a pipeline from the list to edit it.',
849
- columnAdded: 'Column added to catalog!',
850
- errorFillFields: 'Please fill in all fields',
851
- errorColumnExists: 'A column with this name already exists in the catalog. Please choose a different name.',
852
- errorGeneric: 'An error occurred. Please try again.',
853
- applyColumn: 'Apply',
854
- removeColumn: 'Remove',
855
- columnApplied: 'Column applied!',
856
- columnRemoved: 'Column removed!',
857
- selectPipelineFirst: 'Please select a pipeline first',
858
- analyze: 'Analyze',
859
- analysisTitle: 'Pipeline Analysis',
860
- analyzing: 'Analyzing pipeline configuration...',
861
- analysisError: 'Analysis failed',
862
- close: 'Close',
863
- autocreateTitle: 'Autocreate',
864
- autocreateDesc: 'Analyze your project and generate relevant columns automatically',
865
- autocreateBtn: 'Analyze Project',
866
- analyzeSectionTitle: 'Analyze Pipeline',
867
- analyzeSectionDesc: 'Review your current pipeline configuration with Claude',
868
- analyzeSectionBtn: 'Analyze',
869
- },
870
- fr: {
871
- backBtn: '← Tableau de bord',
872
- title: 'Configurateur',
873
- titleSpan: 'Pipeline',
874
- savePipeline: 'Sauvegarder',
875
- activateSync: 'Activer & Sync',
876
- pipelines: 'Pipelines',
877
- newPipeline: '+ Nouveau Pipeline',
878
- noSelected: 'Aucun Pipeline Sélectionné',
879
- noSelectedDesc: 'Sélectionnez un pipeline dans la liste ou créez-en un nouveau.',
880
- createFirst: 'Créer le Premier Pipeline',
881
- pipelineName: 'Nom du Pipeline',
882
- version: 'Version',
883
- delete: 'Supprimer',
884
- description: 'Description (optionnel)',
885
- descPlaceholder: 'Brève description de ce pipeline',
886
- definition: 'DÉFINITION',
887
- definitionDesc: 'Colonnes de qualification et préparation',
888
- action: 'ACTION',
889
- actionDesc: "Colonnes d'implémentation et validation",
890
- finish: 'FINALISATION',
891
- finishDesc: 'Colonnes de finalisation et déploiement',
892
- catalog: 'Catalogue de Colonnes',
893
- catalogHint: '(glissez les colonnes vers les segments ci-dessus)',
894
- addColumn: '+ Ajouter Colonne',
895
- syncPreview: 'Aperçu Sync',
896
- createNewPipeline: 'Créer un Nouveau Pipeline',
897
- create: 'Créer',
898
- cancel: 'Annuler',
899
- addColumnTitle: 'Ajouter une Nouvelle Colonne au Catalogue',
900
- addColumnDesc: 'Décrivez votre idée et Claude générera le prompt en EN/FR.',
901
- columnName: 'Nom de la Colonne',
902
- segment: 'Segment',
903
- segmentDefinition: 'Définition (préparation)',
904
- segmentAction: 'Action (implémentation)',
905
- segmentFinish: 'Finalisation (déploiement)',
906
- describeColumn: 'Décrivez ce que cette colonne doit faire',
907
- generateClaude: 'Générer avec Claude',
908
- generating: 'Génération...',
909
- promptPreview: 'Prompt de la Colonne',
910
- loading: 'Chargement...',
911
- noPrompt: '(Aucun prompt disponible pour cette colonne)',
912
- columnBelongsTo: 'Cette colonne appartient au segment',
913
- segmentLabel: '',
914
- cannotMoveBetween: 'Les colonnes ne peuvent pas être déplacées entre segments',
915
- columnExists: 'La colonne existe déjà dans ce segment',
916
- pipelineSaved: 'Pipeline sauvegardé !',
917
- pipelineCreated: 'Pipeline créé !',
918
- pipelineDeleted: 'Pipeline supprimé',
919
- pipelineActivated: 'Pipeline activé et synchronisé !',
920
- fillAllFields: 'Veuillez remplir tous les champs',
921
- enterPipelineName: 'Veuillez entrer un nom de pipeline',
922
- keyExists: 'Un pipeline avec cette clé existe déjà',
923
- confirmDelete: 'Êtes-vous sûr de vouloir supprimer ce pipeline ?',
924
- selectPipeline: 'Sélectionnez un Pipeline',
925
- selectPipelineDesc: 'Cliquez sur un pipeline de la liste pour le modifier.',
926
- columnAdded: 'Colonne ajoutée au catalogue !',
927
- errorFillFields: 'Veuillez remplir tous les champs',
928
- errorColumnExists: 'Une colonne avec ce nom existe déjà dans le catalogue. Veuillez choisir un autre nom.',
929
- errorGeneric: 'Une erreur est survenue. Veuillez réessayer.',
930
- applyColumn: 'Appliquer',
931
- removeColumn: 'Retirer',
932
- columnApplied: 'Colonne appliquée !',
933
- columnRemoved: 'Colonne retirée !',
934
- selectPipelineFirst: 'Veuillez d\\'abord sélectionner un pipeline',
935
- analyze: 'Analyser',
936
- analysisTitle: 'Analyse du Pipeline',
937
- analyzing: 'Analyse de la configuration du pipeline...',
938
- analysisError: 'Échec de l\\'analyse',
939
- close: 'Fermer',
940
- autocreateTitle: 'Autocreate',
941
- autocreateDesc: 'Analysez votre projet et générez automatiquement des colonnes pertinentes',
942
- autocreateBtn: 'Analyser le projet',
943
- analyzeSectionTitle: 'Analyser le Pipeline',
944
- analyzeSectionDesc: 'Passez en revue votre configuration de pipeline actuelle avec Claude',
945
- analyzeSectionBtn: 'Analyser',
946
- }
947
- };
813
+ ${generateI18nScript({
814
+ keys: pipelineKeys,
815
+ onLangChangeCallback: 'onPipelineLangChange',
816
+ })}
948
817
 
818
+ // Wrapper for backward compatibility - prepends 'pipeline.' to keys
819
+ const tBase = t;
949
820
  function t(key) {
950
- return translations[currentLang]?.[key] || translations['en'][key] || key;
821
+ return tBase('pipeline.' + key);
822
+ }
823
+
824
+ // Callback after language change
825
+ function onPipelineLangChange() {
826
+ currentPromptLang = currentLang;
827
+ updateUILanguage();
951
828
  }
952
829
 
953
830
  function updateUILanguage() {
@@ -1801,26 +1678,6 @@ export function generatePipelineConfiguratorPage(lang) {
1801
1678
  document.getElementById('newPipelineKeyPreview').textContent = key || '-';
1802
1679
  });
1803
1680
 
1804
- // Language switcher
1805
- function initLangSwitcher() {
1806
- const buttons = document.querySelectorAll('#lang-switcher .lang-btn');
1807
- buttons.forEach(btn => {
1808
- if (btn.dataset.lang === currentLang) {
1809
- btn.classList.add('active');
1810
- }
1811
- btn.addEventListener('click', () => {
1812
- currentLang = btn.dataset.lang;
1813
- localStorage.setItem('autocode-lang', currentLang);
1814
- buttons.forEach(b => b.classList.remove('active'));
1815
- btn.classList.add('active');
1816
- // Update default prompt language
1817
- currentPromptLang = currentLang;
1818
- // Update all UI text
1819
- updateUILanguage();
1820
- });
1821
- });
1822
- }
1823
-
1824
1681
  // =============== Pipeline Analysis ===============
1825
1682
 
1826
1683
  // Simple markdown to HTML renderer
@@ -1918,7 +1775,6 @@ export function generatePipelineConfiguratorPage(lang) {
1918
1775
  updateUILanguage();
1919
1776
  updateEmptyState();
1920
1777
  });
1921
- initLangSwitcher();
1922
1778
  updateUILanguage();
1923
1779
  </script>
1924
1780
  </body>
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-configurator.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/pipeline-configurator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAAC,IAAY;IAC3D,OAAO;cACK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA43DV,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"pipeline-configurator.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/pipeline-configurator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stats-page.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/stats-page.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAumB1C"}
1
+ {"version":3,"file":"stats-page.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/stats-page.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAoiB1C"}