projectops 4.3.0 → 4.4.1
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 +1 -1
- package/package.json +1 -1
- package/src/commands/full.js +2 -2
- package/src/commands/interactive.js +2 -1
- package/src/commands/version.js +2 -2
- package/src/context.js +1 -0
- package/src/core/copy/simple.js +2 -0
- package/src/core/version-yml.js +12 -2
- package/src/index.js +3 -0
package/README.md
CHANGED
package/package.json
CHANGED
package/src/commands/full.js
CHANGED
|
@@ -25,7 +25,7 @@ export function runFull(context, tempDir, targetRoot = ".", hooks = {}) {
|
|
|
25
25
|
force = true, now, today, templateVersion = "unknown",
|
|
26
26
|
deployTarget = "docker-ssh", publishTargets = [], includeSecretBackup = false,
|
|
27
27
|
changelogProvider = "github-ai", changelogBaseUrl = "", codeReviewCoderabbit = true,
|
|
28
|
-
deployBranch = "", intent = null, semverAuto = true } = context;
|
|
28
|
+
deployBranch = "", intent = null, semverAuto = true , appRelease = null } = context;
|
|
29
29
|
|
|
30
30
|
// project_paths 마커 계산 (.sh existing_marker_in_dir 등가 — 대표 마커명)
|
|
31
31
|
const pathMarkers = new Map();
|
|
@@ -42,7 +42,7 @@ export function runFull(context, tempDir, targetRoot = ".", hooks = {}) {
|
|
|
42
42
|
version, types, paths, pathMarkers, branch, deployBranch, versionCode, now, today,
|
|
43
43
|
deployValues,
|
|
44
44
|
templateOptions: { templateVersion, deployTarget, publishTargets, includeSecretBackup, optionsDate: today,
|
|
45
|
-
changelogProvider, changelogBaseUrl, codeReviewCoderabbit, intent, mode: "full", semverAuto },
|
|
45
|
+
changelogProvider, changelogBaseUrl, codeReviewCoderabbit, intent, mode: "full", semverAuto, appRelease },
|
|
46
46
|
}));
|
|
47
47
|
|
|
48
48
|
// 2. README 버전 섹션
|
|
@@ -113,6 +113,7 @@ export async function runInteractive(baseCtx, { cwd = process.cwd(), source = {
|
|
|
113
113
|
// semver 자동 승격(#546) — 질문하지 않는다(#485 질문 부담 축소 방향 유지).
|
|
114
114
|
// 저장값이 있으면 보존, 없으면 신규 통합만 ON. 기존 레포는 업데이트만으로 버전이 튀지 않는다.
|
|
115
115
|
const semverAuto = existing?.options?.semverAuto ?? (existing ? false : true);
|
|
116
|
+
const appRelease = existing?.options?.appRelease ?? null; // #553 저장값 보존 (묻지 않음)
|
|
116
117
|
const showOptional = mode === "full" || mode === "workflows";
|
|
117
118
|
const realTty = process.stdout.isTTY === true;
|
|
118
119
|
|
|
@@ -281,7 +282,7 @@ export async function runInteractive(baseCtx, { cwd = process.cwd(), source = {
|
|
|
281
282
|
const { now, today } = clock || utcNow();
|
|
282
283
|
const ctx = createContext({
|
|
283
284
|
mode, force: true, types, version, versionCode, branch, paths, deployTarget, publishTargets, includeSecretBackup,
|
|
284
|
-
codeReviewCoderabbit, changelogProvider, changelogBaseUrl, deployBranch, intent, semverAuto,
|
|
285
|
+
codeReviewCoderabbit, changelogProvider, changelogBaseUrl, deployBranch, intent, semverAuto, appRelease,
|
|
285
286
|
repoName, templateVersion, resolvers, envValues, envUseDefaults, now, today,
|
|
286
287
|
// #502 — version 모드가 기존 full 기록을 강등하지 않도록 (full이 우세)
|
|
287
288
|
recordMode: existing?.templateMode === "full" ? "full" : "version",
|
package/src/commands/version.js
CHANGED
|
@@ -14,7 +14,7 @@ export function runVersion(context, tempDir, targetRoot = ".") {
|
|
|
14
14
|
const { version, types = [], paths = new Map(), branch = "main", versionCode = 1,
|
|
15
15
|
now, today, templateVersion = "unknown", deployTarget = "docker-ssh", publishTargets = [], includeSecretBackup = false,
|
|
16
16
|
changelogProvider = "github-ai", changelogBaseUrl = "", codeReviewCoderabbit = true,
|
|
17
|
-
deployBranch = "", recordMode = "version", semverAuto = true } = context;
|
|
17
|
+
deployBranch = "", recordMode = "version", semverAuto = true , appRelease = null } = context;
|
|
18
18
|
|
|
19
19
|
const pathMarkers = new Map();
|
|
20
20
|
for (const [t] of paths) pathMarkers.set(t, markerForType(t));
|
|
@@ -25,7 +25,7 @@ export function runVersion(context, tempDir, targetRoot = ".") {
|
|
|
25
25
|
// mode(#502): version 모드가 기존 full 통합 기록을 "version"으로 강등하지 않도록
|
|
26
26
|
// 호출부가 recordMode로 기존 값을 넘긴다 (full이 우세 — 업데이트 재실행 범위 축소 방지).
|
|
27
27
|
templateOptions: { templateVersion, deployTarget, publishTargets, includeSecretBackup, optionsDate: today,
|
|
28
|
-
changelogProvider, changelogBaseUrl, codeReviewCoderabbit, mode: recordMode, semverAuto },
|
|
28
|
+
changelogProvider, changelogBaseUrl, codeReviewCoderabbit, mode: recordMode, semverAuto, appRelease },
|
|
29
29
|
}));
|
|
30
30
|
addVersionSectionToReadme(version, targetRoot);
|
|
31
31
|
copyScripts(tempDir, targetRoot);
|
package/src/context.js
CHANGED
|
@@ -26,6 +26,7 @@ export function createContext(overrides = {}) {
|
|
|
26
26
|
deployBranch: "", // 릴리스 PR head 브랜치 (#456). 빈 값=metadata.deploy_branch 미출력
|
|
27
27
|
intent: null, // 프로젝트 성격 (#485 — app/library/both/none/manual). null=미설정(역추론)
|
|
28
28
|
semverAuto: null, // semver 자동 승격 (#546). null=미설정(신규 통합 true / 기존 레포 false)
|
|
29
|
+
appRelease: null, // 앱 심사 배포 레포인가 (#553). null=미설정(키 기록 안 함)
|
|
29
30
|
templateVersion: "",
|
|
30
31
|
tempDir: "",
|
|
31
32
|
deployValues: new Map(), // "type.KEY" -> value
|
package/src/core/copy/simple.js
CHANGED
|
@@ -18,6 +18,8 @@ export function copyScripts(tempDir, targetRoot = ".") {
|
|
|
18
18
|
"issue_helper.py",
|
|
19
19
|
// 릴리스 워크플로우가 PAT 없이 머지한 뒤 후속 워크플로우를 깨울 때 호출 (#551).
|
|
20
20
|
"dispatch_downstream.py",
|
|
21
|
+
// AI PR SUMMARY 워크플로우가 요약 댓글을 작성·갱신할 때 호출 (#553).
|
|
22
|
+
"pr_summary_comment.py",
|
|
21
23
|
"changelog_providers/_common.py", "changelog_providers/ladder.py",
|
|
22
24
|
"changelog_providers/commit.py", "changelog_providers/github_ai.py",
|
|
23
25
|
"changelog_providers/openai_compatible.py",
|
package/src/core/version-yml.js
CHANGED
|
@@ -57,7 +57,7 @@ const HEADER = `# ==============================================================
|
|
|
57
57
|
export function parseTemplateOptions(content) {
|
|
58
58
|
const out = { deploy: null, publish: null, secretBackup: null,
|
|
59
59
|
changelogProvider: null, changelogBaseUrl: null, codeReviewCoderabbit: null,
|
|
60
|
-
deployBranch: null, intent: null, semverAuto: null };
|
|
60
|
+
deployBranch: null, intent: null, semverAuto: null, appRelease: null };
|
|
61
61
|
// deploy_branch는 metadata 직속(#456) — template.options 밖이라 별도로 스캔한다.
|
|
62
62
|
for (const line of String(content || "").split("\n")) {
|
|
63
63
|
if (line.startsWith("#")) continue;
|
|
@@ -131,6 +131,12 @@ export function parseTemplateOptions(content) {
|
|
|
131
131
|
out.semverAuto = m[1] === "true";
|
|
132
132
|
continue;
|
|
133
133
|
}
|
|
134
|
+
// 프로젝트 성격(#553) — 앱 심사로 이어지는 레포인가. 워크플로우와 스킬이 같은 값을 본다.
|
|
135
|
+
m = line.match(/^\s+app_release:\s*["']?(true|false)["']?/);
|
|
136
|
+
if (m) {
|
|
137
|
+
out.appRelease = m[1] === "true";
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
134
140
|
m = line.match(/^\s+npm_publish:\s*(.+)/);
|
|
135
141
|
if (m) {
|
|
136
142
|
const v = strip(m[1]);
|
|
@@ -308,7 +314,7 @@ export function buildVersionYml({ version, types = [], paths = new Map(), pathMa
|
|
|
308
314
|
if (templateOptions) {
|
|
309
315
|
const { templateVersion = "unknown", deployTarget = "docker-ssh", publishTargets = [], includeSecretBackup = false, optionsDate = today,
|
|
310
316
|
changelogProvider = "github-ai", changelogBaseUrl = "", codeReviewCoderabbit = true, intent = null, mode = null,
|
|
311
|
-
semverAuto = true } = templateOptions;
|
|
317
|
+
semverAuto = true, appRelease = null } = templateOptions;
|
|
312
318
|
const publishJson = `[${publishTargets.map((t) => `"${t}"`).join(",")}]`;
|
|
313
319
|
// intent(프로젝트 성격, #485) — 미지정이면 deploy/publish에서 역추론해 기록 (재통합 시 진입 질문 생략용)
|
|
314
320
|
const intentVal = intent || inferIntent(deployTarget, publishTargets) || "manual";
|
|
@@ -326,6 +332,10 @@ export function buildVersionYml({ version, types = [], paths = new Map(), pathMa
|
|
|
326
332
|
out += ` secret_backup: ${includeSecretBackup}\n`;
|
|
327
333
|
// semver 자동 승격(#546) — 릴리스 시 커밋 제목으로 major/minor/patch 결정. false면 항상 patch.
|
|
328
334
|
out += ` semver_auto: ${semverAuto} # 커밋 제목으로 버전 승격 폭 결정 (false면 항상 patch)\n`;
|
|
335
|
+
// 앱 심사 배포 레포 여부(#553) — 미지정이면 키를 쓰지 않는다(기존 레포 무변화).
|
|
336
|
+
if (appRelease !== null) {
|
|
337
|
+
out += ` app_release: ${appRelease} # 앱스토어·플레이스토어 심사로 이어지는 배포인가\n`;
|
|
338
|
+
}
|
|
329
339
|
out += ` code_review:\n`;
|
|
330
340
|
out += ` coderabbit: ${codeReviewCoderabbit}\n`;
|
|
331
341
|
out += ` changelog:\n`;
|
package/src/index.js
CHANGED
|
@@ -144,6 +144,9 @@ export async function run(argv, { cwd = process.cwd(), source = { type: "git" },
|
|
|
144
144
|
// semver 자동 승격(#546): 저장값 → (기존 통합 레포면 false / 신규면 true).
|
|
145
145
|
// 이미 통합된 레포의 버전이 업데이트만으로 예고 없이 minor로 튀지 않게 하는 안전장치다.
|
|
146
146
|
semverAuto: existing?.options?.semverAuto ?? (existing ? false : true),
|
|
147
|
+
// 앱 심사 배포 레포 여부(#553): 저장값만 보존한다. 마법사가 묻지 않으므로 새로 켜지 않는다
|
|
148
|
+
// (사용자가 version.yml에 직접 쓰거나 스킬이 기록한 값을 그대로 유지).
|
|
149
|
+
appRelease: existing?.options?.appRelease ?? null,
|
|
147
150
|
repoName,
|
|
148
151
|
// 실 resolver 4종 (.sh resolve_token 등가 — spring-app-yml 스텁 제거)
|
|
149
152
|
resolvers: makeResolvers(cwd, repoName, paths),
|