projectops 4.44.2 → 4.45.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.
- package/README.md +3 -4
- package/package.json +1 -1
- package/src/commands/full.js +2 -2
- package/src/commands/interactive.js +4 -2
- package/src/commands/version.js +2 -2
- package/src/context.js +2 -0
- package/src/core/options-schema.js +8 -0
- package/src/core/version-yml.js +12 -2
- package/src/index.js +3 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
**Status: actively maintained.** npm `latest` is exactly what is on the `main` branch; work in progress on `develop` is never published. Versions can still ship several times a day. To stay on a version you have tested, run `npx projectops@<version>` ([releases](https://github.com/Cassiiopeia/projectops/releases)).
|
|
10
10
|
|
|
11
11
|
<!-- AUTO-VERSION-SECTION: DO NOT EDIT MANUALLY -->
|
|
12
|
-
## Latest version : v4.44.
|
|
12
|
+
## Latest version : v4.44.2 (2026-10-10)
|
|
13
13
|
|
|
14
14
|
[View full version history](CHANGELOG.md)
|
|
15
15
|
|
|
@@ -49,7 +49,7 @@ This project automates your development workflow on two axes.
|
|
|
49
49
|
| Format every issue by hand | `/pro-github` writes and files an issue from the standard template in one step |
|
|
50
50
|
| Copy the issue URL into commit messages | `/pro-commit` completes the message from the issue context |
|
|
51
51
|
| Write PR descriptions and reports by hand | `/pro-report` analyzes the git diff and generates one |
|
|
52
|
-
| Re-type prompts for every code review or analysis |
|
|
52
|
+
| Re-type prompts for every code review or analysis | 17 Skills give consistent results without re-typing |
|
|
53
53
|
|
|
54
54
|
---
|
|
55
55
|
|
|
@@ -137,8 +137,7 @@ Open a PR from the development branch to `main` and it writes the release notes,
|
|
|
137
137
|
| `/pro-design-brief` | A design request for a screen you built before the mockup exists: state captures, alternatives, copy candidates, and must-keep rules as a board for the designer |
|
|
138
138
|
| `/pro-oss-consult` | Diagnose a GitHub repo as an open-source project: type detection, 6-axis scoring, maturity stage, and edits to About, topics, labels, and files only after approval. One repo or a whole account |
|
|
139
139
|
|
|
140
|
-
> Design, planning, and implementation
|
|
141
|
-
> `/pro-plan`, `/pro-analyze`, and `/pro-implement` are the previous generation of the same roles and only run when invoked explicitly. Together with the 17 in the tables above, that makes 20 in total.
|
|
140
|
+
> Design, planning, and implementation are handled by `superpowers` (brainstorming → writing-plans → executing-plans), not by this plugin.
|
|
142
141
|
|
|
143
142
|
### 📝 Documents and artifacts
|
|
144
143
|
|
package/package.json
CHANGED
package/src/commands/full.js
CHANGED
|
@@ -30,7 +30,7 @@ export function runFull(context, tempDir, targetRoot = ".", hooks = {}) {
|
|
|
30
30
|
force = true, now, today, templateVersion = "unknown",
|
|
31
31
|
deployTarget = "docker-ssh", publishTargets = [], includeSecretBackup = false, aiPrSummary = true,
|
|
32
32
|
changelogProvider = "commit", changelogBaseUrl = "", codeReviewCoderabbit = true,
|
|
33
|
-
deployBranch = "", intent = null, semverAuto = true , appRelease = null, labelStyle = "en", closeOnRelease = null, projectsSync = null, language = "en", excludedWorkflows = null, storeLocales = null } = context;
|
|
33
|
+
deployBranch = "", intent = null, semverAuto = true , appRelease = null, labelStyle = "en", closeOnRelease = null, projectsSync = null, language = "en", excludedWorkflows = null, storeLocales = null, storeLocalesIos = null, storeLocalesPlay = null } = context;
|
|
34
34
|
|
|
35
35
|
// project_paths 마커 계산 (.sh existing_marker_in_dir 등가 — 대표 마커명)
|
|
36
36
|
const pathMarkers = new Map();
|
|
@@ -55,7 +55,7 @@ export function runFull(context, tempDir, targetRoot = ".", hooks = {}) {
|
|
|
55
55
|
...customYml(vyFile),
|
|
56
56
|
updatedBy: resolveUpdatedBy(existsSync(vyFile) ? readFileSync(vyFile, "utf8") : "", targetRoot), // #811
|
|
57
57
|
templateOptions: { templateVersion, deployTarget, publishTargets, includeSecretBackup, aiPrSummary, optionsDate: today,
|
|
58
|
-
changelogProvider, changelogBaseUrl, codeReviewCoderabbit, intent, mode: "full", semverAuto, appRelease, labelStyle, closeOnRelease, projectsSync, language, excludedWorkflows, storeLocales },
|
|
58
|
+
changelogProvider, changelogBaseUrl, codeReviewCoderabbit, intent, mode: "full", semverAuto, appRelease, labelStyle, closeOnRelease, projectsSync, language, excludedWorkflows, storeLocales, storeLocalesIos, storeLocalesPlay },
|
|
59
59
|
})), { version, versionCode });
|
|
60
60
|
|
|
61
61
|
// 2. README 버전 섹션
|
|
@@ -146,6 +146,8 @@ export async function runInteractive(baseCtx, { cwd = process.cwd(), source = {
|
|
|
146
146
|
const closeOnRelease = existing?.options?.closeOnRelease ?? (existing ? null : true); // #771 묻지 않는다
|
|
147
147
|
const excludedWorkflows = existing?.options?.excludedWorkflows ?? null; // #810 저장값 보존
|
|
148
148
|
const storeLocales = existing?.options?.storeLocales ?? null; // #829 저장값 보존
|
|
149
|
+
const storeLocalesIos = existing?.options?.storeLocalesIos ?? null;
|
|
150
|
+
const storeLocalesPlay = existing?.options?.storeLocalesPlay ?? null;
|
|
149
151
|
// Projects 보드 동기화(#716): 묻지 않는다. 저장값 > 이미 설치돼 있으면 유지 > 신규는 제외 (index.js 와 같은 규칙).
|
|
150
152
|
const projectsSync = existing?.options?.projectsSync
|
|
151
153
|
?? existsSync(join(cwd, ".github/workflows/PROJECT-COMMON-PROJECTS-SYNC-MANAGER.yaml"));
|
|
@@ -332,7 +334,7 @@ export async function runInteractive(baseCtx, { cwd = process.cwd(), source = {
|
|
|
332
334
|
const { now, today } = clock || utcNow();
|
|
333
335
|
const ctx = createContext({
|
|
334
336
|
mode, force: true, types, version, versionCode, branch, paths, deployTarget, publishTargets, includeSecretBackup,
|
|
335
|
-
codeReviewCoderabbit, changelogProvider, changelogBaseUrl, deployBranch, intent, semverAuto, appRelease, labelStyle, closeOnRelease, projectsSync, language, excludedWorkflows, storeLocales,
|
|
337
|
+
codeReviewCoderabbit, changelogProvider, changelogBaseUrl, deployBranch, intent, semverAuto, appRelease, labelStyle, closeOnRelease, projectsSync, language, excludedWorkflows, storeLocales, storeLocalesIos, storeLocalesPlay,
|
|
336
338
|
repoName, templateVersion, resolvers, envValues, envUseDefaults, now, today,
|
|
337
339
|
// #502 — version 모드가 기존 full 기록을 강등하지 않도록 (full이 우세)
|
|
338
340
|
recordMode: existing?.templateMode === "full" ? "full" : "version",
|
|
@@ -427,7 +429,7 @@ export async function runInteractive(baseCtx, { cwd = process.cwd(), source = {
|
|
|
427
429
|
migrationGuidePath = appendGuideEntry(cwd, {
|
|
428
430
|
now, mode, types, repoName,
|
|
429
431
|
templateFrom: existing?.templateVersion || "", templateTo: templateVersion,
|
|
430
|
-
options: { deploy: deployTarget, publish: publishTargets, secretBackup: includeSecretBackup, coderabbit: codeReviewCoderabbit, changelogProvider, intent, semverAuto , appRelease, labelStyle, closeOnRelease, projectsSync, language, excludedWorkflows, storeLocales },
|
|
432
|
+
options: { deploy: deployTarget, publish: publishTargets, secretBackup: includeSecretBackup, coderabbit: codeReviewCoderabbit, changelogProvider, intent, semverAuto , appRelease, labelStyle, closeOnRelease, projectsSync, language, excludedWorkflows, storeLocales, storeLocalesIos, storeLocalesPlay },
|
|
431
433
|
branches: { defaultBranch: branch, deployBranch, ready: deployBranchReady, created: deployBranchCreated },
|
|
432
434
|
breaking: breakingReport, migrations: migrationsResult, orphans: orphanReport,
|
|
433
435
|
events: trace.events, counters: { skipped: result?.workflows?.skipped ?? 0 },
|
package/src/commands/version.js
CHANGED
|
@@ -17,7 +17,7 @@ export function runVersion(context, tempDir, targetRoot = ".") {
|
|
|
17
17
|
const { version, types = [], paths = new Map(), branch = "main", versionCode = 1,
|
|
18
18
|
now, today, templateVersion = "unknown", deployTarget = "docker-ssh", publishTargets = [], includeSecretBackup = false,
|
|
19
19
|
changelogProvider = "commit", changelogBaseUrl = "", codeReviewCoderabbit = true,
|
|
20
|
-
deployBranch = "", recordMode = "version", semverAuto = true , appRelease = null, labelStyle = "en", closeOnRelease = null, projectsSync = null, language = null, excludedWorkflows = null, storeLocales = null } = context;
|
|
20
|
+
deployBranch = "", recordMode = "version", semverAuto = true , appRelease = null, labelStyle = "en", closeOnRelease = null, projectsSync = null, language = null, excludedWorkflows = null, storeLocales = null, storeLocalesIos = null, storeLocalesPlay = null } = context;
|
|
21
21
|
|
|
22
22
|
const pathMarkers = new Map();
|
|
23
23
|
for (const [t] of paths) pathMarkers.set(t, markerForType(t));
|
|
@@ -36,7 +36,7 @@ export function runVersion(context, tempDir, targetRoot = ".") {
|
|
|
36
36
|
// mode(#502): version 모드가 기존 full 통합 기록을 "version"으로 강등하지 않도록
|
|
37
37
|
// 호출부가 recordMode로 기존 값을 넘긴다 (full이 우세 — 업데이트 재실행 범위 축소 방지).
|
|
38
38
|
templateOptions: { templateVersion, deployTarget, publishTargets, includeSecretBackup, optionsDate: today,
|
|
39
|
-
changelogProvider, changelogBaseUrl, codeReviewCoderabbit, mode: recordMode, semverAuto, appRelease, labelStyle, closeOnRelease, projectsSync, language, excludedWorkflows, storeLocales },
|
|
39
|
+
changelogProvider, changelogBaseUrl, codeReviewCoderabbit, mode: recordMode, semverAuto, appRelease, labelStyle, closeOnRelease, projectsSync, language, excludedWorkflows, storeLocales, storeLocalesIos, storeLocalesPlay },
|
|
40
40
|
}));
|
|
41
41
|
addVersionSectionToReadme(version, targetRoot);
|
|
42
42
|
copyScripts(tempDir, targetRoot);
|
package/src/context.js
CHANGED
|
@@ -33,6 +33,8 @@ export function createContext(overrides = {}) {
|
|
|
33
33
|
labelStyle: null, // 상태 라벨 표기 (#776). null=미설정(신규 en / 기존 레포 ko)
|
|
34
34
|
excludedWorkflows: null, // 설치하지 않을 워크플로우 파일명 (#810). null=없음
|
|
35
35
|
storeLocales: null, // 스토어 릴리스 노트 언어 (#829). null=미설정 → 현행 동작 유지
|
|
36
|
+
storeLocalesIos: null, // App Store 만 언어 구성이 다를 때 (#829). null=공통 store_locales 를 쓴다
|
|
37
|
+
storeLocalesPlay: null, // Play 만 언어 구성이 다를 때 (#829)
|
|
36
38
|
appRelease: null, // 앱 심사 배포 레포인가 (#553). null=미설정(키 기록 안 함)
|
|
37
39
|
templateVersion: "",
|
|
38
40
|
tempDir: "",
|
|
@@ -111,6 +111,12 @@ export const VERSION_YML = [
|
|
|
111
111
|
{ path: "metadata.template.options.store_locales", parserKey: "storeLocales", type: "string[]",
|
|
112
112
|
description: "Store release-note languages, first is the default (for example [\"ko-KR\", \"en-US\", \"ja-JP\", \"zh-CN\"]). Missing = one text for every store language, as before. Per-language text comes from store_notes in CHANGELOG.json; a language without text gets the default-language text (the stores reject an empty What's New).",
|
|
113
113
|
edit: "by hand" },
|
|
114
|
+
{ path: "metadata.template.options.store_locales_ios", parserKey: "storeLocalesIos", type: "string[]",
|
|
115
|
+
description: "Only when the App Store languages differ from store_locales: the App Store uses this list instead. fastlane deliver ACTIVATES every language folder the app version does not have yet, so a language the App Store listing lacks must not be in this list.",
|
|
116
|
+
edit: "by hand" },
|
|
117
|
+
{ path: "metadata.template.options.store_locales_play", parserKey: "storeLocalesPlay", type: "string[]",
|
|
118
|
+
description: "Only when the Play languages differ from store_locales: Google Play uses this list instead.",
|
|
119
|
+
edit: "by hand" },
|
|
114
120
|
{ path: "metadata.template.options.code_review.coderabbit", parserKey: "codeReviewCoderabbit", type: "boolean", description: "CodeRabbit config installed.", edit: "wizard" },
|
|
115
121
|
{ path: "metadata.template.options.code_review.ai_summary", parserKey: "aiPrSummary", type: "boolean", default: true, description: "AI PR summary workflow installed.", edit: "wizard (--ai-summary)" },
|
|
116
122
|
{ path: "metadata.template.options.changelog.provider", parserKey: "changelogProvider", type: "enum",
|
|
@@ -269,6 +275,8 @@ export const KEY_DETAILS = {
|
|
|
269
275
|
"metadata.template.options.app_release": { when: "Set true by hand for repos whose releases go through App Store / Play Store review.", effect: "The deploy skill (pro-changelog-deploy) treats releases as going through store review: release notes get a review warning banner and are checked more strictly, and the release PR always waits for manual approval instead of automerging.", omitted: "Not set. Never enabled automatically.", caution: "Do not set it on repos that do not ship to a store." },
|
|
270
276
|
"metadata.template.options.excluded_workflows": { when: "Add a file name to stop the update from ever installing that template workflow.", effect: "Listed files are skipped on install and update. Files you deleted yourself are also not restored; a copy of the template is kept in .github/.projectops/incoming/.", omitted: "[]", example: 'excluded_workflows: ["PROJECT-COMMON-TEMPLATE-UTIL-VERSION-SYNC.yml"]' },
|
|
271
277
|
"metadata.template.options.store_locales": { when: "Set it when the store listing has several languages and release notes must not be one Korean text copied into all of them.", effect: "Turns on per-language store release notes (Play Console 'Release notes', App Store 'What's New'). The first entry is the default language. Each other language uses the text in store_notes[<language>] of that version in CHANGELOG.json; a language without text gets the default-language text, because the stores reject an empty What's New.", omitted: "Off: the same text is used for every store language, as before.", example: 'store_locales: ["ko-KR", "en-US", "ja-JP", "zh-CN"]' },
|
|
278
|
+
"metadata.template.options.store_locales_ios": { when: "Set it only when the App Store listing has a different set of languages than Google Play.", effect: "The App Store uses this list instead of store_locales (same rules: first entry is the default language, a language without text gets the default-language text). Needed because fastlane deliver ACTIVATES every language folder the app version does not have, so a language the App Store listing lacks would be added to the app.", omitted: "The App Store uses store_locales.", example: 'store_locales_ios: ["ko-KR", "en-US"]' },
|
|
279
|
+
"metadata.template.options.store_locales_play": { when: "Set it only when Google Play has a different set of languages than the App Store.", effect: "Google Play uses this list instead of store_locales (same rules).", omitted: "Google Play uses store_locales.", example: 'store_locales_play: ["ko-KR", "en-US", "ja-JP"]' },
|
|
272
280
|
"metadata.template.options.code_review.coderabbit": { when: "Edit via --coderabbit / --no-coderabbit.", effect: "Whether .coderabbit.yaml is installed by --mode full. PR review bot only; unrelated to release notes.", omitted: "false" },
|
|
273
281
|
"metadata.template.options.code_review.ai_summary": { when: "Edit via --ai-summary.", effect: "Whether the AI PR summary workflow is installed.", omitted: "true" },
|
|
274
282
|
"metadata.template.options.changelog.provider": { when: "Leave the default. Set only to force one generator.", effect: "Release notes: the PR body is used as is when it already has notes; otherwise a registered AI key (GEMINI_API_KEY, GROQ_API_KEY, MISTRAL_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY) is used; otherwise the commit analysis, which always works and costs nothing. 'copilot' consumes Copilot premium requests, so it is only used when set here.", omitted: "commit (an AI key is still picked up automatically)." },
|
package/src/core/version-yml.js
CHANGED
|
@@ -117,6 +117,7 @@ const COMMENTS = {
|
|
|
117
117
|
deploy: "deploy settings remembered by the wizard (non-sensitive, safe to edit by hand)",
|
|
118
118
|
excluded: "workflow files the update must never install (safe to edit by hand)",
|
|
119
119
|
storeLocales: "store release-note languages, first is the default (missing = one text for every store language)",
|
|
120
|
+
storeLocalesStore: "same, only for this store when its languages differ from store_locales (optional)",
|
|
120
121
|
},
|
|
121
122
|
ko: {
|
|
122
123
|
versionCode: "app build number",
|
|
@@ -133,6 +134,7 @@ const COMMENTS = {
|
|
|
133
134
|
deploy: "마법사가 기억하는 배포 설정 (비민감 / 직접 수정 가능)",
|
|
134
135
|
excluded: "업데이트가 절대 설치하지 않을 워크플로우 파일 (직접 수정 가능)",
|
|
135
136
|
storeLocales: "스토어 릴리스 노트 언어 목록, 첫 항목이 기본 언어 (미기재면 모든 스토어 언어에 같은 문구)",
|
|
137
|
+
storeLocalesStore: "이 스토어만 언어 구성이 store_locales 와 다를 때 쓰는 선택 키",
|
|
136
138
|
},
|
|
137
139
|
};
|
|
138
140
|
const commentsFor = (lang) => COMMENTS[lang === "ko" ? "ko" : "en"];
|
|
@@ -161,7 +163,7 @@ export function resolveUpdatedBy(existingContent = "", cwd = ".") {
|
|
|
161
163
|
export function parseTemplateOptions(content) {
|
|
162
164
|
const out = { deploy: null, publish: null, secretBackup: null,
|
|
163
165
|
changelogProvider: null, changelogBaseUrl: null, codeReviewCoderabbit: null, aiPrSummary: null, projectsSync: null,
|
|
164
|
-
deployBranch: null, intent: null, semverAuto: null, appRelease: null, labelStyle: null, closeOnRelease: null, language: null, excludedWorkflows: null, storeLocales: null };
|
|
166
|
+
deployBranch: null, intent: null, semverAuto: null, appRelease: null, labelStyle: null, closeOnRelease: null, language: null, excludedWorkflows: null, storeLocales: null, storeLocalesIos: null, storeLocalesPlay: null };
|
|
165
167
|
// deploy_branch는 metadata 직속(#456) — template.options 밖이라 별도로 스캔한다.
|
|
166
168
|
for (const line of String(content || "").split("\n")) {
|
|
167
169
|
if (line.startsWith("#")) continue;
|
|
@@ -275,6 +277,12 @@ export function parseTemplateOptions(content) {
|
|
|
275
277
|
out.storeLocales = m[1].split(",").map((s) => s.trim().replace(/^["']|["']$/g, "")).filter(Boolean);
|
|
276
278
|
continue;
|
|
277
279
|
}
|
|
280
|
+
// 스토어마다 지원 언어가 다를 때만 쓰는 선택 키 — 있으면 그 스토어는 공통 store_locales 대신 이것을 쓴다.
|
|
281
|
+
m = line.match(/^\s+store_locales_(ios|play):\s*\[([^\]]*)\]/);
|
|
282
|
+
if (m) {
|
|
283
|
+
out[m[1] === "ios" ? "storeLocalesIos" : "storeLocalesPlay"] = m[2].split(",").map((s) => s.trim().replace(/^["']|["']$/g, "")).filter(Boolean);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
278
286
|
// 프로젝트 성격(#553) — 앱 심사로 이어지는 레포인가. 워크플로우와 스킬이 같은 값을 본다.
|
|
279
287
|
m = line.match(/^\s+app_release:\s*["']?(true|false)["']?/);
|
|
280
288
|
if (m) {
|
|
@@ -559,7 +567,7 @@ export function buildVersionYml({ version, types = [], paths = new Map(), pathMa
|
|
|
559
567
|
if (templateOptions) {
|
|
560
568
|
const { templateVersion = "unknown", deployTarget = "docker-ssh", publishTargets = [], includeSecretBackup = false, optionsDate = today,
|
|
561
569
|
changelogProvider = "commit", changelogBaseUrl = "", codeReviewCoderabbit = true, aiPrSummary = true, intent = null, mode = null,
|
|
562
|
-
semverAuto = true, appRelease = null, labelStyle = null, closeOnRelease = null, projectsSync = null, language = null, excludedWorkflows = null, storeLocales = null } = templateOptions;
|
|
570
|
+
semverAuto = true, appRelease = null, labelStyle = null, closeOnRelease = null, projectsSync = null, language = null, excludedWorkflows = null, storeLocales = null, storeLocalesIos = null, storeLocalesPlay = null } = templateOptions;
|
|
563
571
|
const publishJson = `[${publishTargets.map((t) => `"${t}"`).join(",")}]`;
|
|
564
572
|
// intent(프로젝트 성격, #485) — 미지정이면 deploy/publish에서 역추론해 기록 (재통합 시 진입 질문 생략용)
|
|
565
573
|
const intentVal = intent || inferIntent(deployTarget, publishTargets) || "manual";
|
|
@@ -587,6 +595,8 @@ export function buildVersionYml({ version, types = [], paths = new Map(), pathMa
|
|
|
587
595
|
if (excludedWorkflows && excludedWorkflows.length) out += ` excluded_workflows: [${excludedWorkflows.map((f) => `"${f}"`).join(", ")}] # ${C.excluded}\n`;
|
|
588
596
|
// 스토어 릴리스 노트 언어(#829) — 미지정이면 키를 쓰지 않는다. 전체 재생성이라 다시 쓰지 않으면 사용자가 적은 값이 사라진다.
|
|
589
597
|
if (storeLocales && storeLocales.length) out += ` store_locales: [${storeLocales.map((l) => `"${l}"`).join(", ")}] # ${C.storeLocales}\n`;
|
|
598
|
+
if (storeLocalesIos && storeLocalesIos.length) out += ` store_locales_ios: [${storeLocalesIos.map((l) => `"${l}"`).join(", ")}] # App Store: ${C.storeLocalesStore}\n`;
|
|
599
|
+
if (storeLocalesPlay && storeLocalesPlay.length) out += ` store_locales_play: [${storeLocalesPlay.map((l) => `"${l}"`).join(", ")}] # Play: ${C.storeLocalesStore}\n`;
|
|
590
600
|
if (language) out += ` language: ${language} # ${C.language}\n`;
|
|
591
601
|
if (labelStyle) out += ` label_style: ${labelStyle} # ${C.labelStyle}\n`;
|
|
592
602
|
// 앱 심사 배포 레포 여부(#553) — 미지정이면 키를 쓰지 않는다(기존 레포 무변화).
|
package/src/index.js
CHANGED
|
@@ -263,6 +263,8 @@ async function runCore(argv, { cwd = process.cwd(), source = { type: "git" }, cl
|
|
|
263
263
|
appRelease: existing?.options?.appRelease ?? null,
|
|
264
264
|
excludedWorkflows: existing?.options?.excludedWorkflows ?? null, // #810 저장값 보존
|
|
265
265
|
storeLocales: existing?.options?.storeLocales ?? null, // #829 저장값 보존 (전체 재생성이라 안 넘기면 사라진다)
|
|
266
|
+
storeLocalesIos: existing?.options?.storeLocalesIos ?? null,
|
|
267
|
+
storeLocalesPlay: existing?.options?.storeLocalesPlay ?? null,
|
|
266
268
|
// 상태 라벨 표기(#776): 플래그 > 저장값 > (신규 en / 기존 ko). 기존 레포의 라벨 이름은 업데이트만으로 바뀌지 않는다.
|
|
267
269
|
// 릴리스 시 완료 이슈 닫기(#771): 저장값 보존, 없으면 신규만 true. 기존 레포는 키를 만들지 않아 현행 유지.
|
|
268
270
|
closeOnRelease: existing?.options?.closeOnRelease ?? (existing ? null : true),
|
|
@@ -364,7 +366,7 @@ async function runCore(argv, { cwd = process.cwd(), source = { type: "git" }, cl
|
|
|
364
366
|
migrationGuidePath = appendGuideEntry(cwd, {
|
|
365
367
|
now, mode: opts.mode, types, repoName,
|
|
366
368
|
templateFrom: existing?.templateVersion || "", templateTo: context.templateVersion,
|
|
367
|
-
options: { deploy: deployTarget, publish: publishTargets, secretBackup: context.includeSecretBackup, coderabbit: context.codeReviewCoderabbit, changelogProvider: context.changelogProvider, intent, semverAuto: context.semverAuto , appRelease: context.appRelease, language: context.language, labelStyle: context.labelStyle, closeOnRelease: context.closeOnRelease, projectsSync: context.projectsSync, excludedWorkflows: context.excludedWorkflows, storeLocales: context.storeLocales },
|
|
369
|
+
options: { deploy: deployTarget, publish: publishTargets, secretBackup: context.includeSecretBackup, coderabbit: context.codeReviewCoderabbit, changelogProvider: context.changelogProvider, intent, semverAuto: context.semverAuto , appRelease: context.appRelease, language: context.language, labelStyle: context.labelStyle, closeOnRelease: context.closeOnRelease, projectsSync: context.projectsSync, excludedWorkflows: context.excludedWorkflows, storeLocales: context.storeLocales, storeLocalesIos: context.storeLocalesIos, storeLocalesPlay: context.storeLocalesPlay },
|
|
368
370
|
branches: { defaultBranch: branch, deployBranch: context.deployBranch || "develop", ready: null, created: null },
|
|
369
371
|
breaking: breakingReport, migrations: migrationsResult, orphans: { cleaned: [], pending: orphanPending },
|
|
370
372
|
events: trace.events, counters: { skipped: result?.workflows?.skipped ?? 0 },
|