engineering-memory 1.11.27 → 1.11.29
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 +1 -1
- package/runtime/build.json +1 -1
- package/runtime/dist/src/config.js +9 -0
- package/runtime/dist/src/git/git-inspector.js +40 -8
- package/runtime/dist/src/localization/catalogue.generated.js +124 -0
- package/runtime/dist/src/mcp/delivery-tools.js +241 -50
- package/runtime/dist/src/mcp/review-tools.js +369 -0
- package/runtime/dist/src/mcp/tool-annotations.js +11 -0
- package/runtime/dist/src/mcp/tool-definitions.js +18 -0
- package/runtime/dist/src/mcp/worktree-tools.js +12 -1
- package/runtime/dist/src/providers/gitlab-token-page.js +226 -0
- package/runtime/dist/src/providers/gitlab.js +421 -0
- package/runtime/dist/src/runtime/api-client.js +7 -0
- package/runtime/dist/src/runtime/bridge-service.js +366 -3
- package/runtime/dist/src/runtime/create-bridge-service.js +16 -2
- package/runtime/dist/src/runtime/merge-request-sync.js +322 -0
- package/runtime/dist/src/runtime/principal-state.js +4 -1
- package/runtime/dist/src/runtime/review-masking.js +31 -0
- package/runtime/dist/src/runtime/task-start.js +12 -6
- package/skill/references/lifecycle.md +12 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "engineering-memory",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.29",
|
|
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",
|
package/runtime/build.json
CHANGED
|
@@ -71,6 +71,15 @@ 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`,
|
|
74
83
|
projectSetup: '/projects/setup',
|
|
75
84
|
projectList: '/projects',
|
|
76
85
|
projectResolve: '/projects/resolve',
|
|
@@ -280,14 +280,7 @@ export class GitInspector {
|
|
|
280
280
|
const upstream = branch
|
|
281
281
|
? await this.gitValue(repoRoot, ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'])
|
|
282
282
|
: null;
|
|
283
|
-
const
|
|
284
|
-
const remotes = listed.exitCode === 0 ? listed.stdout.split(/\r?\n/).filter(Boolean) : [];
|
|
285
|
-
const configured = (branch &&
|
|
286
|
-
(await this.gitValue(repoRoot, ['config', '--get', `branch.${branch}.pushRemote`]))) ||
|
|
287
|
-
(await this.gitValue(repoRoot, ['config', '--get', 'remote.pushDefault'])) ||
|
|
288
|
-
(branch && (await this.gitValue(repoRoot, ['config', '--get', `branch.${branch}.remote`]))) ||
|
|
289
|
-
'origin';
|
|
290
|
-
const remote = remotes.includes(configured) ? configured : null;
|
|
283
|
+
const remote = await this.pushRemote(repoRoot, branch);
|
|
291
284
|
const pushUrl = remote
|
|
292
285
|
? await this.gitValue(repoRoot, ['remote', 'get-url', '--push', remote])
|
|
293
286
|
: null;
|
|
@@ -308,6 +301,32 @@ export class GitInspector {
|
|
|
308
301
|
headCommit: await this.gitValue(repoRoot, ['rev-parse', '--verify', '-q', 'HEAD']),
|
|
309
302
|
};
|
|
310
303
|
}
|
|
304
|
+
async branchPushUrl(repoRoot, branch) {
|
|
305
|
+
await this.validateBranch(repoRoot, branch);
|
|
306
|
+
const remote = await this.pushRemote(repoRoot, branch);
|
|
307
|
+
const pushUrl = remote
|
|
308
|
+
? await this.gitValue(repoRoot, ['remote', 'get-url', '--push', remote])
|
|
309
|
+
: null;
|
|
310
|
+
return pushUrl ? withoutCredentials(pushUrl) : null;
|
|
311
|
+
}
|
|
312
|
+
async branchCommit(repoRoot, branch) {
|
|
313
|
+
await this.validateBranch(repoRoot, branch);
|
|
314
|
+
const result = await this.runner.run('git', ['log', '-1', '--format=%H%x00%s', `refs/heads/${branch}`, '--'], { cwd: repoRoot });
|
|
315
|
+
const [commit, subject] = result.stdout.trim().split('\0');
|
|
316
|
+
return result.exitCode === 0 && commit && /^([a-f0-9]{40}|[a-f0-9]{64})$/.test(commit)
|
|
317
|
+
? { commit, subject: subject ?? '' }
|
|
318
|
+
: null;
|
|
319
|
+
}
|
|
320
|
+
async pushRemote(repoRoot, branch) {
|
|
321
|
+
const listed = await this.runner.run('git', ['remote'], { cwd: repoRoot });
|
|
322
|
+
const remotes = listed.exitCode === 0 ? listed.stdout.split(/\r?\n/).filter(Boolean) : [];
|
|
323
|
+
const configured = (branch &&
|
|
324
|
+
(await this.gitValue(repoRoot, ['config', '--get', `branch.${branch}.pushRemote`]))) ||
|
|
325
|
+
(await this.gitValue(repoRoot, ['config', '--get', 'remote.pushDefault'])) ||
|
|
326
|
+
(branch && (await this.gitValue(repoRoot, ['config', '--get', `branch.${branch}.remote`]))) ||
|
|
327
|
+
'origin';
|
|
328
|
+
return remotes.includes(configured) ? configured : null;
|
|
329
|
+
}
|
|
311
330
|
async protectedBranchNames(repoRoot) {
|
|
312
331
|
const names = new Set(['main', 'master', 'develop', 'prod']);
|
|
313
332
|
const fallback = await this.defaultBranch(repoRoot);
|
|
@@ -410,6 +429,19 @@ export class GitInspector {
|
|
|
410
429
|
const result = await this.runner.run('git', ['merge-base', '--is-ancestor', ancestor, descendant], { cwd: repoRoot });
|
|
411
430
|
return result.exitCode === 0;
|
|
412
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
|
+
}
|
|
413
445
|
async remoteRefContaining(repoRoot, commit) {
|
|
414
446
|
return await this.gitValue(repoRoot, [
|
|
415
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',
|
|
@@ -63,6 +70,28 @@ export const bundledTexts = {
|
|
|
63
70
|
'gitPreferences.save': 'Save this choice',
|
|
64
71
|
'gitPreferences.saved': 'This branch is recorded as the project default now, for every member.',
|
|
65
72
|
'gitPreferences.unchanged': 'Nothing changes. This role stays as it is and can be answered another time.',
|
|
73
|
+
'gitlabToken.address': 'GitLab address',
|
|
74
|
+
'gitlabToken.addressHint': 'The address you open GitLab with in the browser, such as https://gitlab.example.com, with the path if GitLab runs under one.',
|
|
75
|
+
'gitlabToken.certificate': 'This computer does not trust the certificate of {address}. If your company uses its own certificate, set the NODE_EXTRA_CA_CERTS environment variable to its file and restart the coding agent.',
|
|
76
|
+
'gitlabToken.expired': 'This link has expired or was already used. Ask the coding agent for a new one.',
|
|
77
|
+
'gitlabToken.failed': 'The request could not be handled. Try again in a moment.',
|
|
78
|
+
'gitlabToken.gitlabError': 'GitLab answered with an error ({status}), so the token was not saved. Try again in a moment.',
|
|
79
|
+
'gitlabToken.intro': "Engineering Memory opens and follows your merge requests on this GitLab from this computer. The token is kept on this computer in the operating system's protected credential storage; it is not sent to Engineering Memory's server or to the coding agent.",
|
|
80
|
+
'gitlabToken.invalidAddress': 'Enter the address as https://host, with a path if GitLab runs under one. Plain http works only for a GitLab on this computer, and an address given as an IP number cannot be used.',
|
|
81
|
+
'gitlabToken.missingToken': 'Enter the token.',
|
|
82
|
+
'gitlabToken.noApiScope': 'GitLab accepted the token, but it has no access to the API. Create a token with the api scope, or read_api for following merge requests only.',
|
|
83
|
+
'gitlabToken.notGitLab': '{address} does not answer like GitLab. Check the address, including any path GitLab runs under.',
|
|
84
|
+
'gitlabToken.redirected': "{address} answered with a redirect, so it is probably not GitLab's own address. Check https and any path GitLab runs under.",
|
|
85
|
+
'gitlabToken.rejected': 'GitLab did not accept this token. Check that it was copied completely and has not expired or been revoked.',
|
|
86
|
+
'gitlabToken.remove': 'Remove the saved token',
|
|
87
|
+
'gitlabToken.removed': 'No token for this GitLab address is saved on this computer any more. You can close this page.',
|
|
88
|
+
'gitlabToken.save': 'Check and save',
|
|
89
|
+
'gitlabToken.saved': 'Saved. GitLab accepted the token. You can close this page and go back to the coding agent.',
|
|
90
|
+
'gitlabToken.savedReadOnly': 'Saved. GitLab accepted the token, but it can only read: Engineering Memory can follow merge requests with it and cannot open them. To open them too, save a token with the api scope.',
|
|
91
|
+
'gitlabToken.title': 'GitLab token for Engineering Memory',
|
|
92
|
+
'gitlabToken.token': 'Personal access token',
|
|
93
|
+
'gitlabToken.tokenHint': 'Create it in GitLab under Preferences, Access tokens. With the api scope Engineering Memory can open merge requests; read_api is enough for following them.',
|
|
94
|
+
'gitlabToken.unreachable': 'This computer cannot reach {address}. If GitLab is only reachable from your company network, connect to it (for example through the VPN) and try again.',
|
|
66
95
|
'inspection.defer': 'Not now',
|
|
67
96
|
'inspection.deferDetail': 'Nothing is inspected and nothing is written. Your answer is recorded, so inspecting this source later is a new request.',
|
|
68
97
|
'inspection.example': 'When the inspection finishes, a memory record is proposed for each screen, service and flow, and you decide which of them get published.',
|
|
@@ -241,6 +270,38 @@ export const bundledTexts = {
|
|
|
241
270
|
'reviewBatch.untitled': 'untitled {kind}',
|
|
242
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.',
|
|
243
272
|
'reviewBatch.why': 'Why',
|
|
273
|
+
'reviewConclude.confirm.description': 'The review ends as described above.',
|
|
274
|
+
'reviewConclude.confirm.label': 'Yes, end it',
|
|
275
|
+
'reviewConclude.defer.description': 'The review stays open; nothing is recorded.',
|
|
276
|
+
'reviewConclude.defer.label': 'Not now',
|
|
277
|
+
'reviewConclude.example': 'After this, the PR/MR can be made ready for the team.',
|
|
278
|
+
'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.',
|
|
279
|
+
'reviewConclude.exempted.message': 'Exempt {task} from review?',
|
|
280
|
+
'reviewConclude.passed.context': 'The fix was pushed and no finding is open. Without a new round, the last round’s result stands.',
|
|
281
|
+
'reviewConclude.passed.message': 'End the review of {task} as passed?',
|
|
282
|
+
'reviewConclude.reasonTitle': 'Reason',
|
|
283
|
+
'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.',
|
|
284
|
+
'reviewConclude.skipped.message': 'Skip the review of {task}?',
|
|
285
|
+
'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.',
|
|
286
|
+
'reviewPolicy.current': 'Current setting',
|
|
287
|
+
'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.',
|
|
288
|
+
'reviewPolicy.keep.description': 'Nothing changes.',
|
|
289
|
+
'reviewPolicy.keep.label': 'Leave it as it is',
|
|
290
|
+
'reviewPolicy.message': 'Should code be reviewed before a PR/MR is ready?',
|
|
291
|
+
'reviewPolicy.none.description': 'Deliveries work as they do today, with no code review step.',
|
|
292
|
+
'reviewPolicy.none.label': 'No review',
|
|
293
|
+
'reviewPolicy.optional.description': 'The delivery question offers a reviewed PR/MR or one without review; a review can be skipped at any time.',
|
|
294
|
+
'reviewPolicy.optional.label': 'Optional',
|
|
295
|
+
'reviewPolicy.required.description': 'Every PR/MR is reviewed before it is ready; only an owner or maintainer can exempt one, with a written reason.',
|
|
296
|
+
'reviewPolicy.required.label': 'Required',
|
|
297
|
+
'reviewReject.context': 'A rejected finding needs a written reason. The reason stays with the review, where the team sees it.',
|
|
298
|
+
'reviewReject.example': 'For example: “This rule is for screens, and this file is a test helper.”',
|
|
299
|
+
'reviewReject.keep.description': 'The finding stays open.',
|
|
300
|
+
'reviewReject.keep.label': 'Keep the finding',
|
|
301
|
+
'reviewReject.message': 'Reject this review finding?',
|
|
302
|
+
'reviewReject.reasonTitle': 'Reason',
|
|
303
|
+
'reviewReject.reject.description': 'The finding no longer holds the review back.',
|
|
304
|
+
'reviewReject.reject.label': 'Reject with this reason',
|
|
244
305
|
'reworkPlan.approve.description': 'The work items are created now, exactly as listed. Implementing each phase still starts separately.',
|
|
245
306
|
'reworkPlan.approve.label': 'Create these work items',
|
|
246
307
|
'reworkPlan.branch': 'branch',
|
|
@@ -335,6 +396,7 @@ export const bundledTexts = {
|
|
|
335
396
|
'taskStart.base.other': 'Another branch on origin',
|
|
336
397
|
'taskStart.base.otherDetail': 'Enter it below.',
|
|
337
398
|
'taskStart.continuePlan': "Continue {branch}, the branch of this work item's confirmed plan",
|
|
399
|
+
'taskStart.continueReview': 'Continue {branch}, the branch of the PR/MR of {task} under review',
|
|
338
400
|
'taskStart.example': 'A worktree keeps this task in its own folder.',
|
|
339
401
|
'taskStart.keepContext': 'Continue on the current branch.',
|
|
340
402
|
'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.',
|
|
@@ -439,6 +501,10 @@ export const bundledTexts = {
|
|
|
439
501
|
'delivery.commit_push_draft_pr.label': 'Commit, push ve taslak PR/MR',
|
|
440
502
|
'delivery.commit_push_pr.description': 'Dalı gönder ve incelemeye hazır bir istek aç.',
|
|
441
503
|
'delivery.commit_push_pr.label': 'Commit, push ve PR/MR',
|
|
504
|
+
'delivery.commit_push_pr_unreviewed.description': 'PR/MR ekibe hazır açılır; kod incelemesi kaydedilmez.',
|
|
505
|
+
'delivery.commit_push_pr_unreviewed.label': 'Commit, push ve incelemesiz PR/MR',
|
|
506
|
+
'delivery.commit_push_review_pr.description': 'PR/MR taslak açılır; kod incelemesi bitince hazıra alınır.',
|
|
507
|
+
'delivery.commit_push_review_pr.label': 'Commit, push ve PR/MR (önce incelenir)',
|
|
442
508
|
'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.',
|
|
443
509
|
'delivery.defer.description': 'Görev kapalı kalır; dosyalar korunur, Git teslimi yapılmaz.',
|
|
444
510
|
'delivery.defer.label': 'Şimdilik beklet',
|
|
@@ -446,6 +512,9 @@ export const bundledTexts = {
|
|
|
446
512
|
'delivery.example': 'Commit yerel dalda kalır. PR/MR seçersen değişiklikler uzak dala gönderilir ve ekip incelemesine açılır.',
|
|
447
513
|
'delivery.message': 'Değişiklikleri nasıl teslim edelim?',
|
|
448
514
|
'delivery.recorded': 'Engineering Memory’de verilmiş cevap',
|
|
515
|
+
'delivery.reviewFix': 'Bu değişiklikler {task} incelemesindeki bulguları düzeltir; açık PR/MR dalına gider, yeni PR/MR açılmaz.',
|
|
516
|
+
'delivery.reviewOptional': 'Bu projede kod incelemesi isteğe bağlı: incelenen ya da incelemesiz bir PR/MR seçebilirsin.',
|
|
517
|
+
'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.',
|
|
449
518
|
'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.',
|
|
450
519
|
'forgetWorktree.example': 'Bundan sonra {task} worktree listesinde görünmez, {folder} klasörü ise diskte olduğu gibi kalır.',
|
|
451
520
|
'forgetWorktree.forget': 'Takip etmeyi bırak; dosyalara dokunma',
|
|
@@ -467,6 +536,28 @@ export const bundledTexts = {
|
|
|
467
536
|
'gitPreferences.save': 'Bu tercihi kaydet',
|
|
468
537
|
'gitPreferences.saved': 'Bu dal şimdi proje varsayılanı olarak kaydedilir; ekipteki herkes onu görür.',
|
|
469
538
|
'gitPreferences.unchanged': 'Hiçbir şey değişmez. Bu rol olduğu gibi kalır, sonra yeniden sorulabilir.',
|
|
539
|
+
'gitlabToken.address': 'GitLab adresi',
|
|
540
|
+
'gitlabToken.addressHint': "GitLab'ı tarayıcıda açtığın adres, örneğin https://gitlab.example.com. GitLab bir yol altında çalışıyorsa yolu da ekle.",
|
|
541
|
+
'gitlabToken.certificate': 'Bu bilgisayar {address} adresinin sertifikasına güvenmiyor. Şirketin kendi sertifikasını kullanıyorsa NODE_EXTRA_CA_CERTS ortam değişkenini o sertifika dosyasına ayarla ve kod ajanını yeniden başlat.',
|
|
542
|
+
'gitlabToken.expired': 'Bu bağlantının süresi dolmuş ya da daha önce kullanılmış. Kod ajanından yeni bir bağlantı iste.',
|
|
543
|
+
'gitlabToken.failed': 'İstek işlenemedi. Biraz sonra tekrar dene.',
|
|
544
|
+
'gitlabToken.gitlabError': 'GitLab hatayla cevap verdi ({status}); token kaydedilmedi. Biraz sonra tekrar dene.',
|
|
545
|
+
'gitlabToken.intro': "Engineering Memory bu GitLab'daki merge request'lerini bu bilgisayardan açar ve takip eder. Token bu bilgisayarda, işletim sisteminin koruduğu kimlik bilgisi deposunda saklanır; Engineering Memory'nin sunucusuna da kod ajanına da gönderilmez.",
|
|
546
|
+
'gitlabToken.invalidAddress': 'Adresi https://sunucu biçiminde gir; GitLab bir yol altında çalışıyorsa yolu da ekle. Düz http yalnızca bu bilgisayardaki bir GitLab için geçerli; IP numarasıyla verilen bir adres kullanılamaz.',
|
|
547
|
+
'gitlabToken.missingToken': "Token'ı gir.",
|
|
548
|
+
'gitlabToken.noApiScope': "GitLab token'ı kabul etti ama token'ın API erişimi yok. api yetkili bir token oluştur; yalnızca takip için read_api yeterli.",
|
|
549
|
+
'gitlabToken.notGitLab': "{address} GitLab gibi cevap vermiyor. Adresi, GitLab'ın çalıştığı yol dahil kontrol et.",
|
|
550
|
+
'gitlabToken.redirected': "{address} yönlendirmeyle cevap verdi; büyük olasılıkla GitLab'ın kendi adresi değil. https'i ve GitLab'ın çalıştığı yolu kontrol et.",
|
|
551
|
+
'gitlabToken.rejected': "GitLab bu token'ı kabul etmedi. Tamamen kopyalandığını, süresinin dolmadığını ve iptal edilmediğini kontrol et.",
|
|
552
|
+
'gitlabToken.remove': "Kayıtlı token'ı sil",
|
|
553
|
+
'gitlabToken.removed': 'Bu GitLab adresi için bu bilgisayarda artık kayıtlı bir token yok. Bu sayfayı kapatabilirsin.',
|
|
554
|
+
'gitlabToken.save': 'Kontrol et ve kaydet',
|
|
555
|
+
'gitlabToken.saved': "Kaydedildi. GitLab token'ı kabul etti. Bu sayfayı kapatıp kod ajanına dönebilirsin.",
|
|
556
|
+
'gitlabToken.savedReadOnly': "Kaydedildi. GitLab token'ı kabul etti ama bu token yalnızca okuyabiliyor: Engineering Memory merge request'leri takip edebilir, açamaz. Açabilmesi için api yetkili bir token kaydet.",
|
|
557
|
+
'gitlabToken.title': "Engineering Memory için GitLab token'ı",
|
|
558
|
+
'gitlabToken.token': "Kişisel erişim token'ı (personal access token)",
|
|
559
|
+
'gitlabToken.tokenHint': "GitLab'da Preferences > Access tokens bölümünden oluşturabilirsin. api yetkisiyle Engineering Memory merge request açabilir; yalnızca takip için read_api yeterli.",
|
|
560
|
+
'gitlabToken.unreachable': "Bu bilgisayar {address} adresine ulaşamıyor. GitLab'a yalnızca şirket ağından ulaşılıyorsa ağa bağlan (örneğin VPN ile) ve tekrar dene.",
|
|
470
561
|
'inspection.defer': 'Şimdilik başlatma',
|
|
471
562
|
'inspection.deferDetail': 'İnceleme başlamaz, hiçbir şey yazılmaz. Cevabın kaydedilir; bu kaynağı sonra incelemek yeni bir istek olur.',
|
|
472
563
|
'inspection.example': 'İnceleme bitince her ekran, servis ve akış için birer hafıza kaydı önerilir; hangilerinin yayınlanacağına sen karar verirsin.',
|
|
@@ -645,6 +736,38 @@ export const bundledTexts = {
|
|
|
645
736
|
'reviewBatch.untitled': 'başlıksız {kind}',
|
|
646
737
|
'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.',
|
|
647
738
|
'reviewBatch.why': 'Nedeni',
|
|
739
|
+
'reviewConclude.confirm.description': 'İnceleme yukarıda anlatıldığı gibi sonuçlanır.',
|
|
740
|
+
'reviewConclude.confirm.label': 'Evet, bitir',
|
|
741
|
+
'reviewConclude.defer.description': 'İnceleme açık kalır; hiçbir şey kaydedilmez.',
|
|
742
|
+
'reviewConclude.defer.label': 'Şimdi değil',
|
|
743
|
+
'reviewConclude.example': 'Bundan sonra PR/MR ekip için hazıra alınabilir.',
|
|
744
|
+
'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.',
|
|
745
|
+
'reviewConclude.exempted.message': '{task} incelemeden muaf tutulsun mu?',
|
|
746
|
+
'reviewConclude.passed.context': 'Düzeltme gönderildi ve açık bulgu yok. Yeni tur yapılmazsa son turun sonucu geçerli olur.',
|
|
747
|
+
'reviewConclude.passed.message': '{task} incelemesi geçti olarak bitsin mi?',
|
|
748
|
+
'reviewConclude.reasonTitle': 'Gerekçe',
|
|
749
|
+
'reviewConclude.skipped.context': 'Bu projede kod incelemesi zorunlu değil, atlanabilir. Engineering Memory atlandığını ve kimin atladığını kaydeder.',
|
|
750
|
+
'reviewConclude.skipped.message': '{task} incelemesi atlansın mı?',
|
|
751
|
+
'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.',
|
|
752
|
+
'reviewPolicy.current': 'Şu anki ayar',
|
|
753
|
+
'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.',
|
|
754
|
+
'reviewPolicy.keep.description': 'Hiçbir şey değişmez.',
|
|
755
|
+
'reviewPolicy.keep.label': 'Olduğu gibi kalsın',
|
|
756
|
+
'reviewPolicy.message': 'PR/MR hazır olmadan önce kod incelensin mi?',
|
|
757
|
+
'reviewPolicy.none.description': 'Teslimler bugünkü gibi olur; kod incelemesi adımı yoktur.',
|
|
758
|
+
'reviewPolicy.none.label': 'İnceleme yok',
|
|
759
|
+
'reviewPolicy.optional.description': 'Teslim sorusu incelenen ya da incelemesiz PR/MR sunar; inceleme her an atlanabilir.',
|
|
760
|
+
'reviewPolicy.optional.label': 'İsteğe bağlı',
|
|
761
|
+
'reviewPolicy.required.description': 'Her PR/MR hazır olmadan önce incelenir; yalnızca sahip ya da bakımcı yazılı gerekçeyle muaf tutabilir.',
|
|
762
|
+
'reviewPolicy.required.label': 'Zorunlu',
|
|
763
|
+
'reviewReject.context': 'Reddedilen bulgu için yazılı gerekçe gerekir. Gerekçe incelemeyle birlikte kalır ve ekip görür.',
|
|
764
|
+
'reviewReject.example': 'Örneğin: “Bu kural ekranlar için; bu dosya bir test yardımcısı.”',
|
|
765
|
+
'reviewReject.keep.description': 'Bulgu açık kalır.',
|
|
766
|
+
'reviewReject.keep.label': 'Bulgu kalsın',
|
|
767
|
+
'reviewReject.message': 'Bu inceleme bulgusu reddedilsin mi?',
|
|
768
|
+
'reviewReject.reasonTitle': 'Gerekçe',
|
|
769
|
+
'reviewReject.reject.description': 'Bulgu artık incelemeyi bekletmez.',
|
|
770
|
+
'reviewReject.reject.label': 'Bu gerekçeyle reddet',
|
|
648
771
|
'reworkPlan.approve.description': 'İş kalemleri listelendiği gibi şimdi oluşturulur. Aşamaların kodlanması yine ayrı ayrı başlar.',
|
|
649
772
|
'reworkPlan.approve.label': 'Bu iş kalemlerini oluştur',
|
|
650
773
|
'reworkPlan.branch': 'dal',
|
|
@@ -739,6 +862,7 @@ export const bundledTexts = {
|
|
|
739
862
|
'taskStart.base.other': 'origin üzerinde başka dal',
|
|
740
863
|
'taskStart.base.otherDetail': 'Alttaki alana yaz.',
|
|
741
864
|
'taskStart.continuePlan': '{branch} dalında devam: bu iş kaleminin onaylı planındaki dal',
|
|
865
|
+
'taskStart.continueReview': '{branch} dalında devam: {task} için incelenen PR/MR’ın dalı',
|
|
742
866
|
'taskStart.example': 'Ayrı worktree, işi ayrı klasörde tutar.',
|
|
743
867
|
'taskStart.keepContext': 'Mevcut dalda devam edilecek.',
|
|
744
868
|
'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.',
|