project-auto-wizard 0.1.5

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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/bin/project-auto-wizard.js +19 -0
  4. package/package.json +36 -0
  5. package/payload/coderabbit.yaml +19 -0
  6. package/payload/config/breaking-changes.json +1 -0
  7. package/payload/config/wizard-prompts.yml +62 -0
  8. package/payload/scripts/changelog_manager.py +726 -0
  9. package/payload/scripts/version_manager.py +617 -0
  10. package/payload/version.yml.template +48 -0
  11. package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +303 -0
  12. package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +293 -0
  13. package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +289 -0
  14. package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +192 -0
  15. package/payload/workflows/common/secret-backup/PROJECT-COMMON-SECRET-FILE-UPLOAD.yaml +209 -0
  16. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +591 -0
  17. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +700 -0
  18. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +308 -0
  19. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +992 -0
  20. package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +689 -0
  21. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +987 -0
  22. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +471 -0
  23. package/payload/workflows/flutter/PROJECT-FLUTTER-SUH-LAB-APP-BUILD-TRIGGER.yaml +500 -0
  24. package/payload/workflows/next/PROJECT-NEXT-CI.yaml +185 -0
  25. package/payload/workflows/next/PROJECT-NEXT-CICD.yaml +271 -0
  26. package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +81 -0
  27. package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +2191 -0
  28. package/payload/workflows/python/PROJECT-PYTHON-SIMPLE-CICD.yaml +386 -0
  29. package/payload/workflows/react/PROJECT-REACT-CI.yaml +194 -0
  30. package/payload/workflows/react/PROJECT-REACT-CICD.yaml +255 -0
  31. package/payload/workflows/spring/PROJECT-SPRING-GITHUB-PACKAGES-PUBLISH.yml +84 -0
  32. package/payload/workflows/spring/nexus/PROJECT-SPRING-NEXUS-CI.yml +316 -0
  33. package/payload/workflows/spring/nexus/PROJECT-SPRING-NEXUS-PUBLISH.yml +58 -0
  34. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-NGINX-CICD.yaml +535 -0
  35. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-TRAEFIK-CICD.yaml +437 -0
  36. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +2277 -0
  37. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-SIMPLE-CICD.yaml +425 -0
  38. package/src/cli/args.js +95 -0
  39. package/src/cli/help.js +27 -0
  40. package/src/commands/full.js +53 -0
  41. package/src/commands/interactive.js +276 -0
  42. package/src/commands/revert.js +60 -0
  43. package/src/commands/version.js +31 -0
  44. package/src/commands/workflows.js +49 -0
  45. package/src/context.js +26 -0
  46. package/src/core/assets.js +47 -0
  47. package/src/core/branches.js +60 -0
  48. package/src/core/branding.js +15 -0
  49. package/src/core/breaking-check.js +65 -0
  50. package/src/core/breaking.js +26 -0
  51. package/src/core/copy/coderabbit.js +26 -0
  52. package/src/core/copy/gitignore.js +55 -0
  53. package/src/core/copy/readme.js +30 -0
  54. package/src/core/copy/simple.js +23 -0
  55. package/src/core/copy/workflows.js +233 -0
  56. package/src/core/detect-fs.js +106 -0
  57. package/src/core/detect.js +62 -0
  58. package/src/core/fsutil.js +46 -0
  59. package/src/core/options-ask.js +99 -0
  60. package/src/core/paths-resolve.js +261 -0
  61. package/src/core/paths.js +16 -0
  62. package/src/core/version-yml.js +190 -0
  63. package/src/core/wizard-env.js +101 -0
  64. package/src/core/wizard-labels.js +107 -0
  65. package/src/index.js +162 -0
  66. package/src/ui/ansi.js +26 -0
  67. package/src/ui/banner.js +29 -0
  68. package/src/ui/env-plan.js +207 -0
  69. package/src/ui/prompts.js +99 -0
  70. package/src/ui/readline-engine.js +257 -0
  71. package/src/ui/status-cards.js +56 -0
  72. package/src/ui/summary.js +127 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Twin-Fang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,139 @@
1
+ # project-auto-wizard
2
+
3
+ > **One command DevOps** — `npx` 한 줄로 어떤 프로젝트든 GitHub-native AI 릴리스 자동화를 설치하는 마법사
4
+
5
+ ```bash
6
+ npx project-auto-wizard
7
+ ```
8
+
9
+ <!-- TODO: 30초 데모 GIF (docs/assets/demo.gif) -->
10
+ <!-- TODO: 3분 데모 YouTube 링크 -->
11
+
12
+ [![npm](https://img.shields.io/npm/v/project-auto-wizard)](https://www.npmjs.com/package/project-auto-wizard)
13
+ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
14
+ [![node](https://img.shields.io/badge/node-%3E%3D20.12-brightgreen)](package.json)
15
+
16
+ <!-- AUTO-VERSION-SECTION: DO NOT EDIT MANUALLY -->
17
+ ## 최신 버전 : v0.1.4 (2026-07-09)
18
+
19
+ [전체 버전 기록 보기](CHANGELOG.md)
20
+
21
+ ---
22
+
23
+ ## 왜 만들었나
24
+
25
+ 새 프로젝트를 시작할 때마다 반복되는 일: CI/CD 파이프라인, 버전 관리, 체인지로그, 릴리스 자동화 셋업에 **반나절**.
26
+ project-auto-wizard는 이걸 **한 줄, 3분**으로 줄입니다.
27
+
28
+ ```bash
29
+ npx project-auto-wizard # 대화형 마법사
30
+ npx project-auto-wizard --mode full --force --type spring,react # CI에서 비대화형
31
+ ```
32
+
33
+ ## 무엇을 설치하나 — 3축
34
+
35
+ | 축 | 내용 |
36
+ |---|---|
37
+ | ① **npx 마법사** | 마커 파일로 프로젝트 타입 자동 감지 — **9타입 + 멀티타입 + 모노레포 경로**까지. 질문은 최소한만 |
38
+ | ② **GitHub-native AI Release Automation** | 릴리스 PR을 열면: 버전 확정 → **AI가 릴리스 노트 작성** → CHANGELOG 갱신 → automerge → tag + GitHub Release. **API 키 0개** (GitHub Models) |
39
+ | ③ **타입별 CI/CD 워크플로우** | Spring(무중단 배포 포함)·Flutter(스토어 배포)·React·Next·Python 등 타입에 맞는 GitHub Actions 자동 배치 |
40
+
41
+ ### 지원 프로젝트 타입
42
+
43
+ `spring` `flutter` `react` `next` `node` `python` `react-native` `react-native-expo` `basic`
44
+
45
+ - **멀티타입**: `--type spring,react,python` — 한 레포에 여러 타입 공존
46
+ - **모노레포**: `--paths "flutter=app,react=client"` — 타입별 서브폴더 지정 (마커 파일 자동 감지)
47
+
48
+ ## API 키 0개 AI — 요약 엔진 체인
49
+
50
+ 릴리스 노트는 4단 엔진 체인으로 생성됩니다. **어떤 단계가 실패해도 릴리스는 절대 막히지 않습니다.**
51
+
52
+ ```mermaid
53
+ flowchart LR
54
+ A["CodeRabbit PR 요약<br/>(opt-in, 30s×10 폴링)"] -->|"미도착/미사용"| B["사용자 지정 AI<br/>(AI_API_KEY)"]
55
+ B -->|"키 없음/실패"| C["GitHub Models<br/>(GITHUB_TOKEN만, 무료)"]
56
+ C -->|"rate limit/실패"| D["규칙 기반 fallback<br/>(항상 성공)"]
57
+ ```
58
+
59
+ - 기본값은 **GitHub Models** — Actions의 `GITHUB_TOKEN` + `permissions: models: read`만으로 동작. **비용 0, 설정 0.**
60
+ - `AI_API_KEY`/`AI_API_BASE_URL`/`AI_MODEL` secret으로 OpenAI-호환 엔드포인트(Groq, Gemini 호환 모드, Ollama 등) 교체 가능.
61
+ - 규칙 fallback 3단: 프로젝트 컨벤션 → Conventional Commits → 무형식 bullet. 커밋 컨벤션이 없어도 동작.
62
+
63
+ ## 릴리스 흐름
64
+
65
+ ```mermaid
66
+ flowchart LR
67
+ subgraph pr-flow ["pr-flow (기본)"]
68
+ D1[develop push] --> PR[develop→main 릴리스 PR]
69
+ PR --> V["버전 확정 (patch+1)"]
70
+ V --> AI[AI 릴리스 노트]
71
+ AI --> CL[CHANGELOG.json/md 갱신]
72
+ CL --> AM[automerge]
73
+ AM --> TAG["tag vX.Y.Z + GitHub Release"]
74
+ end
75
+ ```
76
+
77
+ - **pr-flow** (기본): `VERSION-CONTROL`(main 직접 push 안전망) + `AUTO-CHANGELOG-CONTROL`(릴리스 PR) + `RELEASE-PUBLISH`(tag+Release) 3종 설치
78
+ - **trunk-based** (릴리스 브랜치 = 개발 브랜치): `RELEASE-PUBLISH` 하나가 main push마다 버전확정 → 체인지로그 → tag → Release를 순차 처리
79
+ - 마법사가 브랜치를 묻고(`--main-branch`/`--develop-branch`) 없으면 **생성 + push**까지. 선택은 `version.yml`에 저장되어 업데이트 시 재질문 없음
80
+
81
+ ## 설치 옵션
82
+
83
+ ```
84
+ npx project-auto-wizard [옵션]
85
+
86
+ -m, --mode MODE full | version | workflows (기본: 대화형)
87
+ -t, --type CSV spring,react,... (미지정 시 자동 감지)
88
+ --project-version V 초기 버전 (미지정 시 자동 감지)
89
+ --paths "t=p,..." 모노레포 타입별 경로
90
+ --main-branch B 릴리스 브랜치 (기본: 감지된 default branch)
91
+ --develop-branch B 개발 브랜치 (기본: develop)
92
+ --nexus Nexus 라이브러리 publish 워크플로우 포함
93
+ --secret-backup Secret 서버 백업 워크플로우 포함
94
+ --coderabbit CodeRabbit PR 요약을 릴리스 노트 1순위로
95
+ --force 전 질문 생략 (CI용)
96
+ ```
97
+
98
+ ## 설치 후 확인할 것
99
+
100
+ | 항목 | 내용 |
101
+ |---|---|
102
+ | **`WORKFLOW_PAT` secret** (권장) | automerge 후 후속 워크플로우(tag/Release)가 이어지려면 PAT가 필요합니다 — `GITHUB_TOKEN`으로 머지하면 GitHub 정책상 후속 워크플로우가 트리거되지 않습니다. Settings → Secrets → Actions에 `WORKFLOW_PAT` (scopes: `repo`, `workflow`) 등록. 없으면 `GITHUB_TOKEN`으로 동작하되 Release 발행은 수동 재실행이 필요할 수 있습니다 |
103
+ | **Workflow permissions** | Settings → Actions → Workflow permissions: **Read and write** |
104
+ | **GitHub Models** | 기본 활성 — 별도 설정 불필요. 조직 정책으로 차단된 경우 자동으로 규칙 fallback |
105
+
106
+ ## 설계 원칙
107
+
108
+ - **payload 단일 진실**: 마법사가 설치하는 모든 자산은 npm 패키지 동봉 `payload/` 하나에서 나옵니다. 템플릿 레포 clone 없음, 네트워크 접근 0, 설치 재현성 100%
109
+ - **크로스플랫폼 무결점**: 마법사는 Node, 설치되는 스크립트는 전부 Python. bash/PowerShell 이중 유지·macOS bash 3.2 함정을 **설계로 제거**
110
+ - **graceful degradation**: AI 실패 → 다음 엔진 → 규칙 fallback. 릴리스가 도구 때문에 막히는 일은 없습니다
111
+ - **표준 존중**: GitHub 기본 라벨·Releases·Conventional Commits — 커스텀 발명 대신 생태계 표준 위에 구축
112
+ - **멱등성**: 같은 명령을 다시 실행해도 안전 — unchanged 파일은 건너뛰고, 충돌은 3지선(유지/백업 후 교체/참고본 추가)으로 처리
113
+
114
+ ## 아키텍처
115
+
116
+ ```mermaid
117
+ flowchart TB
118
+ CLI["npx project-auto-wizard<br/>(Node CLI — 감지·질문·치환)"] --> P["payload/ (단일 진실)"]
119
+ P --> W[".github/workflows/*<br/>(브랜치 placeholder 치환 설치)"]
120
+ P --> S[".github/scripts/*.py<br/>(version_manager · changelog_manager)"]
121
+ P --> V["version.yml<br/>(버전·타입·경로·브랜치·옵션 기록)"]
122
+ W --> R["릴리스 자동화<br/>(AI 요약 엔진 체인)"]
123
+ S --> R
124
+ V --> R
125
+ ```
126
+
127
+ ## 개발
128
+
129
+ ```bash
130
+ npm test # node --test + python unittest (py 51 + node 59)
131
+ npm run test:node
132
+ npm run test:py
133
+ ```
134
+
135
+ 이 레포 자체가 project-auto-wizard로 관리됩니다 (도그푸딩) — `.github/workflows/PROJECT-COMMON-*`는 마법사가 설치한 산출물입니다.
136
+
137
+ ## License
138
+
139
+ [MIT](LICENSE)
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ // project-auto-wizard CLI 엔트리 — argv를 src/index.js의 run()에 넘긴다.
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+
6
+ const [nodeMajor, nodeMinor] = process.versions.node.split(".").map(Number);
7
+ if (nodeMajor < 20 || (nodeMajor === 20 && nodeMinor < 12)) {
8
+ console.error(`Node.js 20.12 이상이 필요합니다 (현재: ${process.versions.node})`);
9
+ process.exit(1);
10
+ }
11
+
12
+ const here = dirname(fileURLToPath(import.meta.url));
13
+ const indexPath = join(here, "..", "src", "index.js");
14
+ const { run } = await import(pathToFileURL(indexPath).href);
15
+
16
+ const code = await run(process.argv.slice(2), { cwd: process.cwd() });
17
+ // process.exit() 금지 — fetch(undici) keep-alive 소켓·타이머와 경합해
18
+ // Windows libuv assertion(src/win/async.c)으로 비정상 종료(127)한다. 실측 확인.
19
+ process.exitCode = code;
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "project-auto-wizard",
3
+ "version": "0.1.5",
4
+ "description": "One command DevOps: npx wizard that installs GitHub-native AI Release Automation into any project",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "project-auto-wizard": "bin/project-auto-wizard.js"
9
+ },
10
+ "engines": {
11
+ "node": ">=20.12"
12
+ },
13
+ "files": [
14
+ "bin/",
15
+ "src/",
16
+ "payload/"
17
+ ],
18
+ "scripts": {
19
+ "test": "npm run test:node && npm run test:py",
20
+ "test:node": "node --test \"tests/node/**/*.test.js\"",
21
+ "test:py": "python -m unittest discover -s tests/py -v"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/Twin-Fang/project-auto-wizard.git"
26
+ },
27
+ "keywords": [
28
+ "devops",
29
+ "automation",
30
+ "github-actions",
31
+ "cli",
32
+ "release-automation",
33
+ "changelog",
34
+ "wizard"
35
+ ]
36
+ }
@@ -0,0 +1,19 @@
1
+ # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
2
+ language: "ko-KR"
3
+ early_access: false
4
+ reviews:
5
+ profile: "chill"
6
+ request_changes_workflow: false
7
+ high_level_summary: true
8
+ poem: false
9
+ review_status: true
10
+ collapse_walkthrough: false
11
+ auto_review:
12
+ enabled: true
13
+ drafts: false
14
+ base_branches: ["main"]
15
+ chat:
16
+ auto_reply: true
17
+ issue_enrichment:
18
+ auto_enrich:
19
+ enabled: false
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1,62 @@
1
+ # @wizard ask 마커의 사용자 질문 문구.
2
+ # 형식 1 (구형, 지원 유지): KEY: "라벨"
3
+ # 형식 2 (신규 블록): KEY 아래 label/help/example 들여쓰기 2칸
4
+ # 형식 3 (타입 오버라이드): "{type}.KEY" 키로 타입별 문구 분리
5
+ # 조회 우선순위: {type}.KEY -> KEY -> 구형 -> 폴백(KEY명)
6
+ # 기본값/resolver는 여기 두지 않는다(@wizard 마커 소관).
7
+
8
+ PROJECT_NAME:
9
+ label: "서비스 식별자 (영문 슬러그)"
10
+ help: "Docker 컨테이너명·이미지명·배포 도메인 prefix에 그대로 사용됩니다. 소문자-하이픈 권장."
11
+ example: "my-service"
12
+
13
+ flutter.APP_ARTIFACT_NAME:
14
+ label: "앱 산출물 이름 (영문)"
15
+ help: "빌드된 APK 파일명·아티팩트명·빌드 히스토리 파일명에 사용됩니다."
16
+ example: "my-app"
17
+
18
+ SERVICE_DOMAIN:
19
+ label: "서비스 도메인"
20
+ help: "배포 후 외부에서 접속할 운영 도메인입니다. 실제 보유한 도메인으로 바꿔야 합니다."
21
+ example: "api.example.com"
22
+
23
+ JAVA_VERSION:
24
+ label: "빌드 JDK 버전"
25
+ help: "GitHub Actions 빌드 러너의 JDK 버전입니다. Spring은 보통 21, Flutter Android는 17."
26
+ example: "21"
27
+
28
+ DEPLOY_PORT:
29
+ label: "외부 노출 포트"
30
+ help: "호스트(서버)에서 컨테이너로 연결할 포트입니다. 다른 서비스와 겹치지 않게 정하세요."
31
+ example: "8080"
32
+
33
+ VOLUME_HOST_PATH:
34
+ label: "호스트(NAS) 볼륨 경로"
35
+ help: "서버에 데이터를 영구 저장할 실제 디렉토리 경로입니다."
36
+ example: "/volume1/projects/my-service"
37
+
38
+ VOLUME_CONTAINER_PATH:
39
+ label: "컨테이너 내부 마운트 경로"
40
+ help: "컨테이너 안에서 위 볼륨이 보일 위치입니다."
41
+ example: "/mnt/my-service"
42
+
43
+ SSH_AUTH_METHOD:
44
+ label: "SSH 인증 방식"
45
+ help: "배포 서버 접속 방식입니다. 둘 중 하나를 그대로 입력하세요."
46
+ example: "password 또는 key"
47
+
48
+ # workflow filename (partial match) -> human readable short name
49
+ # wizard uses this to build "[usage]" in env questions.
50
+ _workflow_names:
51
+ NONSTOP-NGINX: "무중단배포(Nginx)"
52
+ NONSTOP-TRAEFIK: "무중단배포(Traefik)"
53
+ PR-PREVIEW: "PR 프리뷰"
54
+ SIMPLE-CICD: "단일 서버 배포"
55
+ REACT-CICD: "프론트 배포"
56
+ REACT-CI: "프론트 빌드"
57
+ NEXT-CICD: "프론트 배포"
58
+ NEXT-CI: "프론트 빌드"
59
+ PYTHON-CI: "빌드 검증"
60
+ FLUTTER-ANDROID-SELFHOSTED: "안드로이드 자체배포"
61
+ FLUTTER-ANDROID-PLAYSTORE: "플레이스토어 배포"
62
+ FLUTTER-ANDROID-FIREBASE: "Firebase 배포"