engineering-memory 1.11.28 → 1.11.30

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "engineering-memory",
3
- "version": "1.11.28",
3
+ "version": "1.11.30",
4
4
  "description": "Installs the Engineering Memory skill and its local MCP bridge. Sign in after installing; your organization and project are resolved from your account.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -1,3 +1,3 @@
1
1
  {
2
- "gitHead": "7ca14a854db07f8fda3823f303e8a7a6accbebff"
2
+ "gitHead": "36588e4f0edd74e5ca4f7ebb8c8f77a41a2af925"
3
3
  }
@@ -71,6 +71,18 @@ export const endpoints = {
71
71
  taskDeliveryDeliver: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/delivery/deliver`,
72
72
  taskDeliveryCancel: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/delivery/cancel`,
73
73
  taskReviewRequest: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/review-request`,
74
+ reviewQueue: (projectId) => `/projects/${projectId}/reviews`,
75
+ review: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/review`,
76
+ reviewRounds: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/review/rounds`,
77
+ reviewRoundResult: (projectId, roundId) => `/projects/${projectId}/review-rounds/${roundId}/result`,
78
+ reviewRoundRules: (projectId, roundId) => `/projects/${projectId}/review-rounds/${roundId}/rules`,
79
+ reviewFindingRejection: (projectId, findingId) => `/projects/${projectId}/review-findings/${findingId}/rejection`,
80
+ reviewPass: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/review/pass`,
81
+ reviewSkip: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/review/skip`,
82
+ reviewExemption: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/review/exemption`,
83
+ reviewRoundComment: (projectId, roundId) => `/projects/${projectId}/review-rounds/${roundId}/comment`,
84
+ reviewComment: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/review/comment`,
85
+ reviewProviderFailure: (projectId, taskId) => `/projects/${projectId}/tasks/${taskId}/review/provider-failure`,
74
86
  projectSetup: '/projects/setup',
75
87
  projectList: '/projects',
76
88
  projectResolve: '/projects/resolve',
@@ -429,6 +429,19 @@ export class GitInspector {
429
429
  const result = await this.runner.run('git', ['merge-base', '--is-ancestor', ancestor, descendant], { cwd: repoRoot });
430
430
  return result.exitCode === 0;
431
431
  }
432
+ async mergeBase(repoRoot, left, right) {
433
+ return await this.gitValue(repoRoot, ['merge-base', left, right]);
434
+ }
435
+ async changedFiles(repoRoot, base, head) {
436
+ const result = await this.runner.run('git', ['diff', '--name-status', '-z', '--no-renames', base, head, '--'], { cwd: repoRoot });
437
+ if (result.exitCode !== 0)
438
+ throw new Error(`Git diff failed: ${result.stderr.trim()}`);
439
+ const tokens = result.stdout.split('\0').filter(Boolean);
440
+ const files = [];
441
+ for (let index = 0; index + 1 < tokens.length; index += 2)
442
+ files.push({ status: tokens[index], path: normalizeGitPath(tokens[index + 1]) });
443
+ return files;
444
+ }
432
445
  async remoteRefContaining(repoRoot, commit) {
433
446
  return await this.gitValue(repoRoot, [
434
447
  'for-each-ref',
@@ -35,6 +35,10 @@ export const bundledTexts = {
35
35
  'delivery.commit_push_draft_pr.label': 'Commit, push and draft PR/MR',
36
36
  'delivery.commit_push_pr.description': 'Push the branch and open a request ready for review.',
37
37
  'delivery.commit_push_pr.label': 'Commit, push and PR/MR',
38
+ 'delivery.commit_push_pr_unreviewed.description': 'The PR/MR opens ready for the team; no code review is recorded.',
39
+ 'delivery.commit_push_pr_unreviewed.label': 'Commit, push and PR/MR without review',
40
+ 'delivery.commit_push_review_pr.description': 'The PR/MR opens as a draft and becomes ready once the code review ends.',
41
+ 'delivery.commit_push_review_pr.label': 'Commit, push and PR/MR, reviewed first',
38
42
  'delivery.context': 'The task is verified and closed. This choice determines where the code goes; approval to publish memory does not authorize Git delivery.',
39
43
  'delivery.defer.description': 'Keep the task closed and preserve its files without Git delivery.',
40
44
  'delivery.defer.label': 'Keep it for now',
@@ -42,6 +46,9 @@ export const bundledTexts = {
42
46
  'delivery.example': 'Commit keeps work on the local branch. PR/MR pushes that branch and opens it for team review.',
43
47
  'delivery.message': 'How should we deliver these changes?',
44
48
  'delivery.recorded': 'Already answered in Engineering Memory',
49
+ 'delivery.reviewFix': 'These changes fix the review findings of {task}, so they go onto its open PR/MR branch; no new PR/MR is opened.',
50
+ 'delivery.reviewOptional': 'Code review is optional in this project: choose a reviewed PR/MR or one without review.',
51
+ 'delivery.reviewRequired': 'This project reviews code before a PR/MR is ready: the PR/MR opens as a draft and becomes ready after the review.',
45
52
  'forgetWorktree.context': 'A checkout that cannot be read is still counted against the worktree limit although nothing can use it; forgetting it frees that slot. No file in the folder is touched or deleted, and the branch stays.',
46
53
  'forgetWorktree.example': 'After this, {task} no longer appears in the worktree list and the {folder} folder stays on disk exactly as it is.',
47
54
  'forgetWorktree.forget': 'Stop tracking it; leave the files alone',
@@ -263,6 +270,47 @@ export const bundledTexts = {
263
270
  'reviewBatch.untitled': 'untitled {kind}',
264
271
  'reviewBatch.unversioned': 'Written without a source inspection: {titles}. Tasks that read memory by source version will not see them until an inspection retains them.',
265
272
  'reviewBatch.why': 'Why',
273
+ 'reviewComment.exempted': 'Engineering Memory code review of {task}: exempted. Reason: {reason}',
274
+ 'reviewComment.findingsOf': 'Findings of round {round}:',
275
+ 'reviewComment.fixed': 'fixed in {commit}',
276
+ 'reviewComment.open': 'still open',
277
+ 'reviewComment.passed': 'Engineering Memory code review of {task}: passed after {rounds, plural, one {# round} other {# rounds}}',
278
+ 'reviewComment.rejected': 'rejected: {reason}',
279
+ 'reviewComment.round': 'Engineering Memory code review of {task}, round {round}: {count, plural, one {# finding} other {# findings}}',
280
+ 'reviewComment.rule': 'rule {rule}',
281
+ 'reviewComment.skipped': 'Engineering Memory code review of {task}: skipped',
282
+ 'reviewConclude.confirm.description': 'The review ends as described above.',
283
+ 'reviewConclude.confirm.label': 'Yes, end it',
284
+ 'reviewConclude.defer.description': 'The review stays open; nothing is recorded.',
285
+ 'reviewConclude.defer.label': 'Not now',
286
+ 'reviewConclude.example': 'After this, the PR/MR can be made ready for the team.',
287
+ 'reviewConclude.exempted.context': 'Review is required here, so only an owner or maintainer can exempt a delivery, with a written reason that stays with the review.',
288
+ 'reviewConclude.exempted.message': 'Exempt {task} from review?',
289
+ 'reviewConclude.passed.context': 'The fix was pushed and no finding is open. Without a new round, the last round’s result stands.',
290
+ 'reviewConclude.passed.message': 'End the review of {task} as passed?',
291
+ 'reviewConclude.reasonTitle': 'Reason',
292
+ 'reviewConclude.skipped.context': 'Code review is not required in this project, so it can be skipped. Engineering Memory records that it was skipped and by whom.',
293
+ 'reviewConclude.skipped.message': 'Skip the review of {task}?',
294
+ 'reviewPolicy.context': 'The setting applies to the whole project from now on; work already delivered keeps its review state. On GitHub, Engineering Memory records the setting but GitHub does not enforce it.',
295
+ 'reviewPolicy.current': 'Current setting',
296
+ 'reviewPolicy.example': 'With Required, a finished task’s PR/MR opens as a draft, an agent reviews it against the project’s rules, and it becomes ready once each finding is fixed or rejected with a reason.',
297
+ 'reviewPolicy.keep.description': 'Nothing changes.',
298
+ 'reviewPolicy.keep.label': 'Leave it as it is',
299
+ 'reviewPolicy.message': 'Should code be reviewed before a PR/MR is ready?',
300
+ 'reviewPolicy.none.description': 'Deliveries work as they do today, with no code review step.',
301
+ 'reviewPolicy.none.label': 'No review',
302
+ 'reviewPolicy.optional.description': 'The delivery question offers a reviewed PR/MR or one without review; a review can be skipped at any time.',
303
+ 'reviewPolicy.optional.label': 'Optional',
304
+ 'reviewPolicy.required.description': 'Every PR/MR is reviewed before it is ready; only an owner or maintainer can exempt one, with a written reason.',
305
+ 'reviewPolicy.required.label': 'Required',
306
+ 'reviewReject.context': 'A rejected finding needs a written reason. The reason stays with the review, where the team sees it.',
307
+ 'reviewReject.example': 'For example: “This rule is for screens, and this file is a test helper.”',
308
+ 'reviewReject.keep.description': 'The finding stays open.',
309
+ 'reviewReject.keep.label': 'Keep the finding',
310
+ 'reviewReject.message': 'Reject this review finding?',
311
+ 'reviewReject.reasonTitle': 'Reason',
312
+ 'reviewReject.reject.description': 'The finding no longer holds the review back.',
313
+ 'reviewReject.reject.label': 'Reject with this reason',
266
314
  'reworkPlan.approve.description': 'The work items are created now, exactly as listed. Implementing each phase still starts separately.',
267
315
  'reworkPlan.approve.label': 'Create these work items',
268
316
  'reworkPlan.branch': 'branch',
@@ -357,6 +405,7 @@ export const bundledTexts = {
357
405
  'taskStart.base.other': 'Another branch on origin',
358
406
  'taskStart.base.otherDetail': 'Enter it below.',
359
407
  'taskStart.continuePlan': "Continue {branch}, the branch of this work item's confirmed plan",
408
+ 'taskStart.continueReview': 'Continue {branch}, the branch of the PR/MR of {task} under review',
360
409
  'taskStart.example': 'A worktree keeps this task in its own folder.',
361
410
  'taskStart.keepContext': 'Continue on the current branch.',
362
411
  'taskStart.location.busy': 'Task {task} is still running in another client in this folder, so the new branch cannot start here. Once it is paused there, this folder can be chosen too.',
@@ -461,6 +510,10 @@ export const bundledTexts = {
461
510
  'delivery.commit_push_draft_pr.label': 'Commit, push ve taslak PR/MR',
462
511
  'delivery.commit_push_pr.description': 'Dalı gönder ve incelemeye hazır bir istek aç.',
463
512
  'delivery.commit_push_pr.label': 'Commit, push ve PR/MR',
513
+ 'delivery.commit_push_pr_unreviewed.description': 'PR/MR ekibe hazır açılır; kod incelemesi kaydedilmez.',
514
+ 'delivery.commit_push_pr_unreviewed.label': 'Commit, push ve incelemesiz PR/MR',
515
+ 'delivery.commit_push_review_pr.description': 'PR/MR taslak açılır; kod incelemesi bitince hazıra alınır.',
516
+ 'delivery.commit_push_review_pr.label': 'Commit, push ve PR/MR (önce incelenir)',
464
517
  'delivery.context': 'Görev doğrulandı ve kapandı. Bu seçim kodun nereye gönderileceğini belirler; hafıza değişikliklerini yayımlama onayı bunun yerine geçmez.',
465
518
  'delivery.defer.description': 'Görev kapalı kalır; dosyalar korunur, Git teslimi yapılmaz.',
466
519
  'delivery.defer.label': 'Şimdilik beklet',
@@ -468,6 +521,9 @@ export const bundledTexts = {
468
521
  'delivery.example': 'Commit yerel dalda kalır. PR/MR seçersen değişiklikler uzak dala gönderilir ve ekip incelemesine açılır.',
469
522
  'delivery.message': 'Değişiklikleri nasıl teslim edelim?',
470
523
  'delivery.recorded': 'Engineering Memory’de verilmiş cevap',
524
+ 'delivery.reviewFix': 'Bu değişiklikler {task} incelemesindeki bulguları düzeltir; açık PR/MR dalına gider, yeni PR/MR açılmaz.',
525
+ 'delivery.reviewOptional': 'Bu projede kod incelemesi isteğe bağlı: incelenen ya da incelemesiz bir PR/MR seçebilirsin.',
526
+ 'delivery.reviewRequired': 'Bu projede PR/MR hazır olmadan önce kod incelenir: PR/MR taslak açılır, inceleme bitince hazıra alınır.',
471
527
  'forgetWorktree.context': 'Okunamayan bir çalışma kopyası hiçbir işe yaramadığı hâlde worktree sınırına sayılmaya devam eder; takipten çıkarılırsa o yer boşalır. Klasördeki hiçbir dosyaya dokunulmaz, hiçbiri silinmez; dal da kalır.',
472
528
  'forgetWorktree.example': 'Bundan sonra {task} worktree listesinde görünmez, {folder} klasörü ise diskte olduğu gibi kalır.',
473
529
  'forgetWorktree.forget': 'Takip etmeyi bırak; dosyalara dokunma',
@@ -689,6 +745,47 @@ export const bundledTexts = {
689
745
  'reviewBatch.untitled': 'başlıksız {kind}',
690
746
  'reviewBatch.unversioned': 'Kaynak incelemesi yapılmadan yazılanlar: {titles}. Hafızayı kaynak sürümüne göre okuyan görevler, bir inceleme bunları saklayana kadar görmez.',
691
747
  'reviewBatch.why': 'Nedeni',
748
+ 'reviewComment.exempted': '{task} için Engineering Memory kod incelemesi: muaf tutuldu. Gerekçe: {reason}',
749
+ 'reviewComment.findingsOf': 'Tur {round} bulguları:',
750
+ 'reviewComment.fixed': '{commit} ile düzeltildi',
751
+ 'reviewComment.open': 'hâlâ açık',
752
+ 'reviewComment.passed': '{task} için Engineering Memory kod incelemesi: {rounds, plural, one {# turda} other {# turda}} geçti',
753
+ 'reviewComment.rejected': 'reddedildi: {reason}',
754
+ 'reviewComment.round': '{task} için Engineering Memory kod incelemesi, tur {round}: {count, plural, one {# bulgu} other {# bulgu}}',
755
+ 'reviewComment.rule': 'kural {rule}',
756
+ 'reviewComment.skipped': '{task} için Engineering Memory kod incelemesi: atlandı',
757
+ 'reviewConclude.confirm.description': 'İnceleme yukarıda anlatıldığı gibi sonuçlanır.',
758
+ 'reviewConclude.confirm.label': 'Evet, bitir',
759
+ 'reviewConclude.defer.description': 'İnceleme açık kalır; hiçbir şey kaydedilmez.',
760
+ 'reviewConclude.defer.label': 'Şimdi değil',
761
+ 'reviewConclude.example': 'Bundan sonra PR/MR ekip için hazıra alınabilir.',
762
+ 'reviewConclude.exempted.context': 'Burada inceleme zorunlu; bu yüzden yalnızca sahip ya da bakımcı, incelemeyle birlikte kalacak yazılı bir gerekçeyle muaf tutabilir.',
763
+ 'reviewConclude.exempted.message': '{task} incelemeden muaf tutulsun mu?',
764
+ 'reviewConclude.passed.context': 'Düzeltme gönderildi ve açık bulgu yok. Yeni tur yapılmazsa son turun sonucu geçerli olur.',
765
+ 'reviewConclude.passed.message': '{task} incelemesi geçti olarak bitsin mi?',
766
+ 'reviewConclude.reasonTitle': 'Gerekçe',
767
+ 'reviewConclude.skipped.context': 'Bu projede kod incelemesi zorunlu değil, atlanabilir. Engineering Memory atlandığını ve kimin atladığını kaydeder.',
768
+ 'reviewConclude.skipped.message': '{task} incelemesi atlansın mı?',
769
+ 'reviewPolicy.context': 'Ayar bundan sonra tüm projede geçerli olur; önceden teslim edilen işlerin inceleme durumu değişmez. GitHub’da ayarı Engineering Memory kaydeder, GitHub zorlamaz.',
770
+ 'reviewPolicy.current': 'Şu anki ayar',
771
+ 'reviewPolicy.example': 'Zorunlu seçilirse biten görevin PR/MR’ı taslak açılır, bir ajan projenin kurallarına göre inceler; her bulgu düzeltilince ya da gerekçeyle reddedilince hazıra alınır.',
772
+ 'reviewPolicy.keep.description': 'Hiçbir şey değişmez.',
773
+ 'reviewPolicy.keep.label': 'Olduğu gibi kalsın',
774
+ 'reviewPolicy.message': 'PR/MR hazır olmadan önce kod incelensin mi?',
775
+ 'reviewPolicy.none.description': 'Teslimler bugünkü gibi olur; kod incelemesi adımı yoktur.',
776
+ 'reviewPolicy.none.label': 'İnceleme yok',
777
+ 'reviewPolicy.optional.description': 'Teslim sorusu incelenen ya da incelemesiz PR/MR sunar; inceleme her an atlanabilir.',
778
+ 'reviewPolicy.optional.label': 'İsteğe bağlı',
779
+ 'reviewPolicy.required.description': 'Her PR/MR hazır olmadan önce incelenir; yalnızca sahip ya da bakımcı yazılı gerekçeyle muaf tutabilir.',
780
+ 'reviewPolicy.required.label': 'Zorunlu',
781
+ 'reviewReject.context': 'Reddedilen bulgu için yazılı gerekçe gerekir. Gerekçe incelemeyle birlikte kalır ve ekip görür.',
782
+ 'reviewReject.example': 'Örneğin: “Bu kural ekranlar için; bu dosya bir test yardımcısı.”',
783
+ 'reviewReject.keep.description': 'Bulgu açık kalır.',
784
+ 'reviewReject.keep.label': 'Bulgu kalsın',
785
+ 'reviewReject.message': 'Bu inceleme bulgusu reddedilsin mi?',
786
+ 'reviewReject.reasonTitle': 'Gerekçe',
787
+ 'reviewReject.reject.description': 'Bulgu artık incelemeyi bekletmez.',
788
+ 'reviewReject.reject.label': 'Bu gerekçeyle reddet',
692
789
  'reworkPlan.approve.description': 'İş kalemleri listelendiği gibi şimdi oluşturulur. Aşamaların kodlanması yine ayrı ayrı başlar.',
693
790
  'reworkPlan.approve.label': 'Bu iş kalemlerini oluştur',
694
791
  'reworkPlan.branch': 'dal',
@@ -783,6 +880,7 @@ export const bundledTexts = {
783
880
  'taskStart.base.other': 'origin üzerinde başka dal',
784
881
  'taskStart.base.otherDetail': 'Alttaki alana yaz.',
785
882
  'taskStart.continuePlan': '{branch} dalında devam: bu iş kaleminin onaylı planındaki dal',
883
+ 'taskStart.continueReview': '{branch} dalında devam: {task} için incelenen PR/MR’ın dalı',
786
884
  'taskStart.example': 'Ayrı worktree, işi ayrı klasörde tutar.',
787
885
  'taskStart.keepContext': 'Mevcut dalda devam edilecek.',
788
886
  'taskStart.location.busy': '{task} bu klasörde başka bir oturumda hâlâ çalışıyor; yeni branch burada açılamaz. O oturumda duraklatılırsa bu klasör de seçilebilir.',