projectops 4.0.4 → 4.1.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 CHANGED
@@ -7,7 +7,7 @@
7
7
  > 이슈 등록부터 커밋, 보고서, 배포까지. 개발자는 코드만 작성하세요.
8
8
 
9
9
  <!-- AUTO-VERSION-SECTION: DO NOT EDIT MANUALLY -->
10
- ## 최신 버전 : v4.0.3 (2026-07-08)
10
+ ## 최신 버전 : v4.0.4 (2026-07-08)
11
11
 
12
12
  [전체 버전 기록 보기](CHANGELOG.md)
13
13
 
@@ -218,8 +218,7 @@ bash <(curl -fsSL "https://raw.githubusercontent.com/Cassiiopeia/projectops/main
218
218
  |------|----------|-------|
219
219
  | `spring` | build.gradle | SSH+Docker 배포, Nexus |
220
220
  | `flutter` | pubspec.yaml | TestFlight, Play Store |
221
- | `react` | package.json | Docker |
222
- | `next` | package.json | Docker |
221
+ | `react` (Next.js 포함) | package.json | Docker |
223
222
  | `node` | package.json | Docker |
224
223
  | `python` | pyproject.toml | SSH+Docker 배포 |
225
224
  | `react-native` | Info.plist + build.gradle | — |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectops",
3
- "version": "4.0.4",
3
+ "version": "4.1.1",
4
4
  "description": "ProjectOps — 완전 자동화 GitHub 프로젝트 관리 템플릿 통합 CLI (구 SUH-DEVOPS-TEMPLATE 마법사)",
5
5
  "keywords": [
6
6
  "devops",
package/src/cli/help.js CHANGED
@@ -8,8 +8,9 @@ export const HELP_TEXT = `projectops — GitHub 프로젝트 자동화 템플릿
8
8
  -m, --mode MODE 통합 모드 (full | version | workflows | issues | skills)
9
9
  기본: interactive (대화형)
10
10
  -t, --type CSV 프로젝트 타입 csv (예: spring,react,python)
11
- 지원: spring flutter next react react-native
11
+ 지원: spring flutter react react-native
12
12
  react-native-expo node python basic
13
+ (next는 react로 흡수됨 — Next.js 프로젝트는 react 사용)
13
14
  --project-version V 통합 대상의 초기 버전 (예: 1.0.0). 미지정 시 자동 감지
14
15
  --paths "t=p,..." 타입별 프로젝트 경로 (모노레포). 예: flutter=app,react=client
15
16
  --nexus / --no-nexus Nexus 라이브러리 publish 워크플로우 포함/제외
package/src/context.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // 마법사 전역 상태를 하나의 객체로 명시화 (bash 전역 변수군 대체)
2
+ // next 타입은 v4.1.0에서 react로 흡수됨 (breaking)
2
3
  export const VALID_TYPES = [
3
- "spring", "flutter", "next", "react",
4
+ "spring", "flutter", "react",
4
5
  "react-native", "react-native-expo", "node", "python", "basic",
5
6
  ];
6
7
 
@@ -6,8 +6,8 @@ export function classifyPackageText(raw) {
6
6
  if (s.includes("@react-native") || s.includes("react-native")) {
7
7
  return s.includes("expo") ? "react-native-expo" : "react-native";
8
8
  }
9
- if (s.includes('"next"')) return "next";
10
- if (s.includes('"react"')) return "react";
9
+ // next 타입은 v4.1.0에서 react로 흡수 — "next" 의존성이 있어도 react로 판정
10
+ if (s.includes('"react"') || s.includes('"next"')) return "react";
11
11
  return "node";
12
12
  }
13
13
 
@@ -18,7 +18,7 @@ const isCancel = (v) => typeof v === "symbol";
18
18
  // 타입의 대표 마커 파일명 (.sh marker_for_type L1220~1229 등가).
19
19
  // detect.js는 미지 타입에 package.json을 기본 반환하지만 .sh는 빈 문자열 — 등가를 위해 래핑.
20
20
  const KNOWN_MARKER_TYPES = new Set([
21
- "flutter", "react", "next", "node", "react-native", "react-native-expo", "python", "spring",
21
+ "flutter", "react", "node", "react-native", "react-native-expo", "python", "spring",
22
22
  ]);
23
23
  export function markerForType(type) {
24
24
  return KNOWN_MARKER_TYPES.has(type) ? baseMarkerForType(type) : "";
@@ -78,7 +78,7 @@ export function findTypePathCandidates(root, type) {
78
78
 
79
79
  const namesByType = {
80
80
  flutter: ["pubspec.yaml"],
81
- react: ["package.json"], next: ["package.json"], node: ["package.json"],
81
+ react: ["package.json"], node: ["package.json"],
82
82
  "react-native": ["package.json"],
83
83
  "react-native-expo": ["app.json"],
84
84
  python: ["pyproject.toml", "setup.py", "requirements.txt"],
@@ -12,7 +12,7 @@ const HEADER = `# ==============================================================
12
12
  # 사용법:
13
13
  # 1. version: "1.0.0" - 사용자에게 표시되는 버전
14
14
  # 2. version_code: 1 - Play Store/App Store 빌드 번호 (1부터 자동 증가)
15
- # 3. project_type: 프로젝트 타입 지정
15
+ # 3. project_types: 프로젝트 타입 배열 — 첫 항목이 primary
16
16
  # 4. project_paths: 타입별 프로젝트 폴더 (레포 루트 기준 상대경로, 모노레포용)
17
17
  #
18
18
  # 자동 버전 업데이트:
@@ -35,7 +35,7 @@ const HEADER = `# ==============================================================
35
35
  # - .github/workflows/PROJECT-AUTO-CHANGELOG-CONTROL.yaml
36
36
  #
37
37
  # 주의사항:
38
- # - project_type은 최초 설정 후 변경하지 마세요
38
+ # - project_types는 최초 설정 후 변경하지 마세요
39
39
  # - 버전은 항상 높은 버전으로 자동 동기화됩니다
40
40
  # ===================================================================
41
41
  `;
@@ -125,20 +125,19 @@ export function parseExisting(content) {
125
125
  }
126
126
 
127
127
  // version.yml 전체 생성 (.sh create_version_yml + save_template_options 신규 케이스 등가).
128
- // opts: { version, types:[], primaryType?, paths:Map, pathMarkers?:Map, branch, versionCode, now, today, templateOptions? }
128
+ // opts: { version, types:[], paths:Map, pathMarkers?:Map, branch, versionCode, now, today, templateOptions? }
129
+ // primary 타입은 별도 키 없이 project_types[0]이다 (v4.1.0 SSOT — 단수 project_type 키 제거).
129
130
  // now = "YYYY-MM-DD HH:MM:SS" (UTC) — 결정성 위해 주입
130
131
  // today = "YYYY-MM-DD" (UTC)
131
132
  // pathMarkers = Map<type, markerFilename> (project_paths 주석용)
132
133
  // templateOptions = { templateVersion, includeNexus, includeSecretBackup, optionsDate } (template 블록)
133
- export function buildVersionYml({ version, types = [], primaryType, paths = new Map(), pathMarkers = new Map(), branch = "main", versionCode = 1, now, today, templateOptions = null, deployValues = new Map() }) {
134
+ export function buildVersionYml({ version, types = [], paths = new Map(), pathMarkers = new Map(), branch = "main", versionCode = 1, now, today, templateOptions = null, deployValues = new Map() }) {
134
135
  const typesJson = types.length ? `[${types.map((t) => `"${t}"`).join(",")}]` : `["basic"]`;
135
- const primary = primaryType || types[0] || "basic";
136
136
 
137
137
  let out = HEADER + "\n";
138
138
  out += `version: "${version}"\n`;
139
139
  out += `version_code: ${versionCode} # app build number\n`;
140
140
  out += `project_types: ${typesJson} # 멀티타입 배열 — 첫 항목이 primary, 직접 편집 가능\n`;
141
- out += `project_type: "${primary}" # project_types[0] 자동 미러 — 직접 수정 금지 (spring, flutter, next, react, react-native, react-native-expo, node, python, basic)\n`;
142
141
 
143
142
  // project_paths 블록. pathMarkers: Map<type, markerFilename> (있으면 " type: "path" # path/marker" 주석).
144
143
  if (paths.size) {
package/src/ui/prompts.js CHANGED
@@ -48,7 +48,7 @@ export async function editMenu({ showOptional = false } = {}) {
48
48
 
49
49
  // 타입 멀티선택.
50
50
  export async function selectTypes(current = []) {
51
- const all = ["spring", "flutter", "next", "react", "react-native", "react-native-expo", "node", "python", "basic"];
51
+ const all = ["spring", "flutter", "react", "react-native", "react-native-expo", "node", "python", "basic"];
52
52
  return engine.multiselect({
53
53
  message: "프로젝트 타입을 선택하세요 (Space 토글, Enter 확정)",
54
54
  options: all.map((t) => ({ value: t, label: t })),