projectops 4.2.6 → 4.2.8

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.2.5 (2026-07-10)
10
+ ## 최신 버전 : v4.2.7 (2026-07-10)
11
11
 
12
12
  [전체 버전 기록 보기](CHANGELOG.md)
13
13
 
@@ -20,17 +20,17 @@
20
20
  이 프로젝트는 두 축으로 개발 워크플로우를 자동화합니다.
21
21
 
22
22
  **① GitHub Actions** — main 푸시 한 번으로 버전 관리, 체인지로그, CI/CD 배포까지 자동 처리
23
- **② Agent Skills** — `/issue`, `/commit`, `/report` 등 AI가 이슈 작성부터 커밋 메시지, 구현 보고서까지 대신 생성
23
+ **② Agent Skills** — `/github`, `/commit`, `/report` 등 AI가 이슈 작성부터 커밋 메시지, 구현 보고서까지 대신 생성
24
24
 
25
25
  | 기존 방식 | Projectops |
26
26
  |----------|---------------------|
27
27
  | 버전 수동 관리, 태그 직접 생성 | 릴리스(develop→main PR) 시 patch 버전 자동 증가 + 태그 생성 |
28
28
  | 체인지로그 직접 작성 (30분+) | CodeRabbit AI가 PR마다 자동 생성 |
29
29
  | CI/CD 처음부터 설정 | 프로젝트 타입별 워크플로우 즉시 구성 |
30
- | 이슈 매번 형식 맞춰 작성 (5분+) | `/pro-issue` 한 번에 표준 템플릿 생성 |
30
+ | 이슈 매번 형식 맞춰 작성 (5분+) | `/pro-github` 한 번에 표준 템플릿 생성 + 등록 |
31
31
  | 커밋 메시지 이슈 URL 수동 복사 | `/pro-commit` 이슈 컨텍스트 기반 자동 완성 |
32
32
  | PR 설명/보고서 직접 작성 | `/pro-report` git diff 분석 후 자동 생성 |
33
- | 코드 리뷰·분석 매번 프롬프트 입력 | 25종 Skills로 일관된 결과, 매번 재입력 불필요 |
33
+ | 코드 리뷰·분석 매번 프롬프트 입력 | 24종 Skills로 일관된 결과, 매번 재입력 불필요 |
34
34
 
35
35
  ---
36
36
 
@@ -40,7 +40,7 @@ Agent Skills가 개발 사이클 전체를 커버합니다.
40
40
 
41
41
  ```mermaid
42
42
  flowchart TD
43
- A([작업 시작]) --> B["/pro-issue\n이슈 등록 + GitHub 자동 생성"]
43
+ A([작업 시작]) --> B["/pro-github\n이슈 등록 + GitHub 자동 생성"]
44
44
  B --> C["/pro-init-worktree\nworktree + 민감파일 자동 복사"]
45
45
  C --> D{작업 유형}
46
46
 
@@ -93,22 +93,7 @@ npx projectops
93
93
 
94
94
  > Node.js 20.12+ 만 있으면 별도 설치 없이 대화형 마법사가 실행됩니다. 비대화형: `npx projectops --mode full --type spring,react --force`
95
95
 
96
- <details>
97
- <summary>대안 — 스크립트 직접 실행 (Node 없이, <b>deprecated</b>)</summary>
98
-
99
- > ⚠️ **`template_integrator.sh` / `.ps1`은 deprecated입니다 (#458).** 실행하면 `npx projectops`로 안내하며, 다음 minor에서 제거될 수 있습니다. Node 20.12+를 쓸 수 있으면 위의 `npx projectops`를 사용하세요.
100
-
101
- ```bash
102
- # macOS / Linux
103
- bash <(curl -fsSL "https://raw.githubusercontent.com/Cassiiopeia/projectops/main/template_integrator.sh")
104
- ```
105
-
106
- ```powershell
107
- # Windows PowerShell
108
- $wc=New-Object Net.WebClient;$wc.Encoding=[Text.Encoding]::UTF8;iex $wc.DownloadString("https://raw.githubusercontent.com/Cassiiopeia/projectops/main/template_integrator.ps1")
109
- ```
110
-
111
- </details>
96
+ > ⚠️ 구 `template_integrator.sh` / `.ps1`은 **지원 종료(EOF)** 되었습니다 (#458). 실행하면 `npx projectops` 안내만 출력하며, 다음 minor에서 파일이 제거됩니다.
112
97
 
113
98
  ### Agent Skills만 설치
114
99
 
@@ -137,14 +122,7 @@ Codex plugin marketplace를 사용할 수 없는 환경에서는 [Skills 가이
137
122
  npx projectops --mode skills
138
123
  ```
139
124
 
140
- <details>
141
- <summary>대안 — 스크립트 직접 실행 (Node 없이)</summary>
142
-
143
- ```bash
144
- bash <(curl -fsSL "https://raw.githubusercontent.com/Cassiiopeia/projectops/main/template_integrator.sh") --mode skills
145
- ```
146
125
 
147
- </details>
148
126
 
149
127
  > Claude Code는 `/projectops:` 자동완성, Gemini는 extension, Codex는 plugin marketplace를 우선 사용합니다. 자세한 설치 방식은 [Skills 가이드](docs/SKILLS.md)를 확인하세요.
150
128
 
@@ -154,7 +132,7 @@ bash <(curl -fsSL "https://raw.githubusercontent.com/Cassiiopeia/projectops/main
154
132
 
155
133
  | 기능 | 설명 | 문서 |
156
134
  |------|------|------|
157
- | **Agent Skills** | Claude Code, Cursor, Gemini CLI, Codex CLI에서 쓰는 25종 AI DevOps Skills | [상세](docs/SKILLS.md) |
135
+ | **Agent Skills** | Claude Code, Cursor, Gemini CLI, Codex CLI에서 쓰는 24종 AI DevOps Skills | [상세](docs/SKILLS.md) |
158
136
  | **버전 자동화** | 릴리스(develop→main PR) 시 patch 버전 자동 증가 + Git 태그 | [상세](docs/VERSION-CONTROL.md) |
159
137
  | **AI 체인지로그** | CodeRabbit 리뷰 기반 CHANGELOG 자동 생성 | [상세](docs/CHANGELOG-AUTOMATION.md) |
160
138
  | **PR Preview** | 댓글 한 줄로 임시 서버 배포, 닫으면 자동 삭제 | [상세](docs/PR-PREVIEW.md) |
@@ -165,18 +143,17 @@ bash <(curl -fsSL "https://raw.githubusercontent.com/Cassiiopeia/projectops/main
165
143
 
166
144
  ---
167
145
 
168
- ## Agent Skills (25종)
146
+ ## Agent Skills (24종)
169
147
 
170
148
  ### 🔄 개발 사이클 자동화
171
149
 
172
150
  | 스킬 | 용도 |
173
151
  |------|------|
174
- | `/pro-issue` | 설명 한 줄 → GitHub 이슈 템플릿 자동 작성 + 등록 |
175
152
  | `/pro-init-worktree` | Git worktree 생성 + 민감 파일 자동 복사 |
176
153
  | `/pro-commit` | 이슈 컨텍스트 기반 커밋 메시지 자동 완성 (superpowers 준수) |
177
154
  | `/pro-report` | git diff 분석 → 구현 보고서 생성 + GitHub 댓글 자동 포스팅 |
178
155
  | `/pro-changelog-deploy` | develop push → main 릴리스 PR 생성 + 릴리스 노트 작성 + automerge |
179
- | `/pro-github` | GitHub 이슈/PR/댓글 독립 조회 관리 |
156
+ | `/pro-github` | GitHub 전반: 이슈 생성(설명 한 줄 → 템플릿 작성+등록)/조회/수정/댓글/라벨/담당자, PR 생성/머지/조회, 레포 탐색, Actions/Secret 관리 |
180
157
 
181
158
  ### 📊 분석형 (코드 수정 없음)
182
159
 
@@ -271,7 +248,7 @@ Settings → Actions → General
271
248
 
272
249
  | 문서 | 설명 |
273
250
  |------|------|
274
- | [Agent Skills 가이드](docs/SKILLS.md) | 25종 Skills 용도, 사용법, 전체 개발 사이클 흐름 |
251
+ | [Agent Skills 가이드](docs/SKILLS.md) | 24종 Skills 용도, 사용법, 전체 개발 사이클 흐름 |
275
252
  | [통합 스크립트 가이드](docs/TEMPLATE-INTEGRATOR.md) | 기존 프로젝트에 템플릿 통합 |
276
253
  | [버전 관리](docs/VERSION-CONTROL.md) | version.yml, 자동 버전 증가 |
277
254
  | [체인지로그 자동화](docs/CHANGELOG-AUTOMATION.md) | CodeRabbit 연동, AI 문서화 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectops",
3
- "version": "4.2.6",
3
+ "version": "4.2.8",
4
4
  "description": "ProjectOps — 완전 자동화 GitHub 프로젝트 관리 템플릿 통합 CLI",
5
5
  "keywords": [
6
6
  "devops",
@@ -7,11 +7,16 @@ import { exists, copyFileSync, copyDirSync } from "../fsutil.js";
7
7
 
8
8
  // 버전관리/릴리스노트 스크립트만 무조건 덮어쓰기 + chmod +x.
9
9
  // version_manager는 .sh(위임 shim) + .py(실 로직) 한 쌍 — 둘 다 복사해야 동작 (#448).
10
+ // changelog provider 사다리(.py 5종, #455)는 RELEASE-CHANGELOG 워크플로우 fallback-summary가
11
+ // 호출하므로 함께 복사해야 사용자 프로젝트에서 릴리스 노트 생성이 동작한다.
10
12
  export function copyScripts(tempDir, targetRoot = ".") {
11
13
  const scripts = [
12
14
  "version_manager.sh", "version_manager.py",
13
15
  "changelog_manager.py",
14
16
  "truncate_release_notes.sh", "truncate_release_notes.py",
17
+ "changelog_providers/_common.py", "changelog_providers/ladder.py",
18
+ "changelog_providers/commit.py", "changelog_providers/github_ai.py",
19
+ "changelog_providers/openai_compatible.py",
15
20
  ];
16
21
  let copied = 0;
17
22
  for (const s of scripts) {
@@ -3,7 +3,7 @@
3
3
  import { existsSync, readFileSync, readdirSync } from "node:fs";
4
4
  import { join, basename } from "node:path";
5
5
  import { execFileSync } from "node:child_process";
6
- import { detectTypesFromMarkers, detectVersionFromFiles } from "./detect.js";
6
+ import { detectTypesFromMarkers, detectVersionFromFiles, suggestTypesByExtScan } from "./detect.js";
7
7
  import { parseExisting } from "./version-yml.js";
8
8
 
9
9
  const hasFile = (root) => (rel) => existsSync(join(root, rel));
@@ -17,14 +17,44 @@ function gitOut(root, args) {
17
17
  } catch { return ""; }
18
18
  }
19
19
 
20
+ // 확장자 스캔용 파일 목록 (.sh suggest_types_by_scan find 등가 — depth≤3, vendor 폴더 프루닝).
21
+ const SCAN_PRUNE = new Set([
22
+ "node_modules", ".git", "build", "dist", ".dart_tool",
23
+ "android", "ios", ".gradle", "venv", ".venv", "__pycache__",
24
+ ]);
25
+ export function listScanFiles(root, maxDepth = 3) {
26
+ const files = [];
27
+ const walk = (rel, depth) => {
28
+ if (depth > maxDepth) return;
29
+ let entries;
30
+ try { entries = readdirSync(join(root, rel), { withFileTypes: true }); } catch { return; }
31
+ for (const e of entries) {
32
+ const childRel = rel ? `${rel}/${e.name}` : e.name;
33
+ if (e.isDirectory()) {
34
+ if (!SCAN_PRUNE.has(e.name)) walk(childRel, depth + 1);
35
+ } else {
36
+ files.push(childRel);
37
+ }
38
+ }
39
+ };
40
+ walk("", 1);
41
+ return files;
42
+ }
43
+
20
44
  // 타입 감지 — version.yml의 project_types 최우선(source of truth), 없으면 마커 스캔.
45
+ // 마커도 전혀 없으면(basic 폴백) 확장자 빈도 스캔으로 2차 추천 (.sh suggest_types_by_scan 등가, #458).
21
46
  export function detectTypes(root) {
22
47
  const vy = join(root, "version.yml");
23
48
  if (existsSync(vy)) {
24
49
  const { types } = parseExisting(readFileSync(vy, "utf8"));
25
50
  if (types.length) return types; // basic 포함, 명시돼 있으면 그대로
26
51
  }
27
- return detectTypesFromMarkers({ has: hasFile(root), read: readFile(root) });
52
+ const byMarkers = detectTypesFromMarkers({ has: hasFile(root), read: readFile(root) });
53
+ if (byMarkers.length === 1 && byMarkers[0] === "basic") {
54
+ const scanned = suggestTypesByExtScan(listScanFiles(root));
55
+ if (scanned.length) return scanned; // 추천값 — 마법사 확인/수정 루프에서 사용자가 확정
56
+ }
57
+ return byMarkers;
28
58
  }
29
59
 
30
60
  // 버전 감지 — .sh detect_version 순서. jq 유무는 command 존재로 판정.
@@ -60,3 +60,19 @@ export function markerForType(type) {
60
60
  export function extraMarkers(type) {
61
61
  return { python: ["setup.py", "requirements.txt"], spring: ["build.gradle.kts", "pom.xml"] }[type] || [];
62
62
  }
63
+
64
+ // 확장자 빈도 스캔 추천 (.sh suggest_types_by_scan 2단계 등가, #458 npx 이식).
65
+ // 마커가 전혀 없을 때(=basic 폴백)만 쓰는 2차 추천. files = 프루닝된 상대경로 목록.
66
+ // 임계: dart≥1→flutter, java+kt+gradle≥3→spring, tsx+jsx≥3→react, py≥3→python,
67
+ // 아무것도 없고 ts+js≥3→node. 반환은 메뉴 정의 순서로 정렬.
68
+ export function suggestTypesByExtScan(files) {
69
+ const count = (re) => files.filter((f) => re.test(f)).length;
70
+ const found = new Set();
71
+ if (count(/\.dart$/) >= 1) found.add("flutter");
72
+ if (count(/\.java$/) + count(/\.kt$/) + count(/\.gradle$/) >= 3) found.add("spring");
73
+ if (count(/\.tsx$/) + count(/\.jsx$/) >= 3) found.add("react");
74
+ if (count(/\.py$/) >= 3) found.add("python");
75
+ if (found.size === 0 && count(/\.ts$/) + count(/\.js$/) >= 3) found.add("node");
76
+ const order = ["spring", "flutter", "react", "react-native", "react-native-expo", "node", "python"];
77
+ return order.filter((t) => found.has(t));
78
+ }
@@ -1,6 +1,7 @@
1
- // 템플릿 다운로드 후 제거하는 항목 .sh download_template 내부 배열과 동기화
2
- // ⚠️ CLAUDE.md "3곳 동시 수정" 규칙의 4번째 동기화 지점:
3
- // template_initializer.sh / template_integrator.sh / .ps1 / 이 파일
1
+ // 템플릿 다운로드 후 제거하는 항목 (복사 제외 목록).
2
+ // ⚠️ CLAUDE.md "템플릿 전용 파일 추가" 규칙의 동기화 지점:
3
+ // template_initializer.sh(삭제) / 이 파일(복사 제외)
4
+ // (구 template_integrator.sh/.ps1의 배열은 #458 EOF로 소멸 — 여기가 유일한 복사 제외 지점)
4
5
  export const DOCS_TO_REMOVE = [
5
6
  "CONTRIBUTING.md",
6
7
  "CLAUDE.md",