pattyeng 1.0.3 → 1.0.6

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 (99) hide show
  1. package/README.md +90 -55
  2. package/bin/pattyeng.js +20 -14
  3. package/lib/skills.js +170 -0
  4. package/lib/upgrade.js +46 -0
  5. package/package.json +5 -3
  6. package/skills/.system/.codex-system-skills.marker +1 -0
  7. package/skills/.system/imagegen/LICENSE.txt +201 -0
  8. package/skills/.system/imagegen/SKILL.md +356 -0
  9. package/skills/.system/imagegen/agents/openai.yaml +6 -0
  10. package/skills/.system/imagegen/assets/imagegen-small.svg +5 -0
  11. package/skills/.system/imagegen/assets/imagegen.png +0 -0
  12. package/skills/.system/imagegen/references/cli.md +242 -0
  13. package/skills/.system/imagegen/references/codex-network.md +33 -0
  14. package/skills/.system/imagegen/references/image-api.md +90 -0
  15. package/skills/.system/imagegen/references/prompting.md +118 -0
  16. package/skills/.system/imagegen/references/sample-prompts.md +433 -0
  17. package/skills/.system/imagegen/scripts/image_gen.py +995 -0
  18. package/skills/.system/imagegen/scripts/remove_chroma_key.py +440 -0
  19. package/skills/.system/openai-docs/LICENSE.txt +201 -0
  20. package/skills/.system/openai-docs/SKILL.md +167 -0
  21. package/skills/.system/openai-docs/agents/openai.yaml +14 -0
  22. package/skills/.system/openai-docs/assets/openai-small.svg +3 -0
  23. package/skills/.system/openai-docs/assets/openai.png +0 -0
  24. package/skills/.system/openai-docs/references/latest-model.md +37 -0
  25. package/skills/.system/openai-docs/references/prompting-guide.md +244 -0
  26. package/skills/.system/openai-docs/references/upgrade-guide.md +181 -0
  27. package/skills/.system/openai-docs/scripts/fetch-codex-manual.mjs +598 -0
  28. package/skills/.system/openai-docs/scripts/resolve-latest-model-info.js +147 -0
  29. package/skills/.system/plugin-creator/SKILL.md +243 -0
  30. package/skills/.system/plugin-creator/agents/openai.yaml +6 -0
  31. package/skills/.system/plugin-creator/assets/plugin-creator-small.svg +3 -0
  32. package/skills/.system/plugin-creator/assets/plugin-creator.png +0 -0
  33. package/skills/.system/plugin-creator/references/installing-and-updating.md +143 -0
  34. package/skills/.system/plugin-creator/references/plugin-json-spec.md +194 -0
  35. package/skills/.system/plugin-creator/scripts/create_basic_plugin.py +324 -0
  36. package/skills/.system/plugin-creator/scripts/read_marketplace_name.py +48 -0
  37. package/skills/.system/plugin-creator/scripts/update_plugin_cachebuster.py +78 -0
  38. package/skills/.system/plugin-creator/scripts/validate_plugin.py +586 -0
  39. package/skills/.system/skill-creator/SKILL.md +416 -0
  40. package/skills/.system/skill-creator/agents/openai.yaml +5 -0
  41. package/skills/.system/skill-creator/assets/skill-creator-small.svg +3 -0
  42. package/skills/.system/skill-creator/assets/skill-creator.png +0 -0
  43. package/skills/.system/skill-creator/license.txt +202 -0
  44. package/skills/.system/skill-creator/references/openai_yaml.md +49 -0
  45. package/skills/.system/skill-creator/scripts/generate_openai_yaml.py +226 -0
  46. package/skills/.system/skill-creator/scripts/init_skill.py +400 -0
  47. package/skills/.system/skill-creator/scripts/quick_validate.py +101 -0
  48. package/skills/.system/skill-installer/LICENSE.txt +202 -0
  49. package/skills/.system/skill-installer/SKILL.md +58 -0
  50. package/skills/.system/skill-installer/agents/openai.yaml +5 -0
  51. package/skills/.system/skill-installer/assets/skill-installer-small.svg +3 -0
  52. package/skills/.system/skill-installer/assets/skill-installer.png +0 -0
  53. package/skills/.system/skill-installer/scripts/github_utils.py +21 -0
  54. package/skills/.system/skill-installer/scripts/install-skill-from-github.py +308 -0
  55. package/skills/.system/skill-installer/scripts/list-skills.py +107 -0
  56. package/skills/cap/SKILL.md +77 -0
  57. package/skills/caveman/SKILL.md +49 -0
  58. package/skills/code-review/SKILL.md +46 -0
  59. package/skills/codebook/SKILL.md +184 -0
  60. package/skills/doc-review/SKILL.md +147 -0
  61. package/skills/feature-research/SKILL.md +34 -0
  62. package/skills/file-op/SKILL.md +116 -0
  63. package/skills/grill-me/SKILL.md +10 -0
  64. package/skills/grill-with-docs/ADR-FORMAT.md +47 -0
  65. package/skills/grill-with-docs/CONTEXT-FORMAT.md +60 -0
  66. package/skills/grill-with-docs/SKILL.md +88 -0
  67. package/skills/handoff/SKILL.md +17 -0
  68. package/skills/improve-codebase/SKILL.md +79 -0
  69. package/skills/linear/SKILL.md +107 -0
  70. package/skills/next-step/SKILL.md +61 -0
  71. package/skills/no-reinvent/SKILL.md +131 -0
  72. package/skills/no-wall/SKILL.md +146 -0
  73. package/skills/online/SKILL.md +54 -0
  74. package/skills/plan-review/SKILL.md +55 -0
  75. package/skills/professional/SKILL.md +111 -0
  76. package/skills/promise-tracking/SKILL.md +131 -0
  77. package/skills/prove/SKILL.md +135 -0
  78. package/skills/read-before-write/SKILL.md +123 -0
  79. package/skills/review/SKILL.md +78 -0
  80. package/skills/review-mp/SKILL.md +78 -0
  81. package/skills/scope-boundary/SKILL.md +121 -0
  82. package/skills/semble-search/SKILL.md +40 -0
  83. package/skills/sitrep/SKILL.md +126 -0
  84. package/skills/structure-code/SKILL.md +116 -0
  85. package/skills/surface-assumptions/SKILL.md +139 -0
  86. package/skills/teach/GLOSSARY-FORMAT.md +35 -0
  87. package/skills/teach/LEARNING-RECORD-FORMAT.md +46 -0
  88. package/skills/teach/MISSION-FORMAT.md +31 -0
  89. package/skills/teach/RESOURCES-FORMAT.md +32 -0
  90. package/skills/teach/SKILL.md +131 -0
  91. package/skills/team-protocol/SKILL.md +172 -0
  92. package/skills/tech-lead/SKILL.md +332 -0
  93. package/skills/to-issues/SKILL.md +83 -0
  94. package/skills/to-prd/SKILL.md +74 -0
  95. package/skills/vectorbt-expert/SKILL.md +253 -0
  96. package/skills/verify-done/SKILL.md +128 -0
  97. package/skills/work-log/SKILL.md +141 -0
  98. package/skills/work-log/template.html +496 -0
  99. package/skills/zoom-out/SKILL.md +7 -0
package/README.md CHANGED
@@ -1,113 +1,148 @@
1
1
  # pattyeng
2
2
 
3
- Patty Engineering 팀을 위한 CLI 도구입니다.
4
- Codex 설치, SSO 로그인, 환경변수 등록을 한 번에 자동으로 처리합니다.
3
+ Patty 엔지니어용 작업 환경 도구.
5
4
 
6
- ---
7
-
8
- ## 필요 조건
5
+ 새 노트북이든, WSL이든, 오래 방치한 개발환경이든 — Patty에서 일하는 데 필요한 기본 세팅을 한 번에 맞춥니다.
9
6
 
10
- - **Node.js** 18 이상
11
- - **npm** 설치되어 있을 것
12
- - **Patty 계정** (`@patty.io` 이메일)
13
- - **pattyeng 그룹** 멤버일 것 (관리자에게 요청)
7
+ 지금은 Codex 설정, 스킬 동기화, 업그레이드를 담당합니다. 앞으로는 MCP, hooks, 공통 환경설정까지 같은 방식으로 붙일 예정입니다.
14
8
 
15
9
  ---
16
10
 
17
- ## 설치 방법
18
-
19
- ### 1단계 — pattyeng CLI 설치
20
-
21
- 터미널을 열고 아래 명령어를 실행하세요:
11
+ ## 설치
22
12
 
23
13
  ```bash
24
14
  npm install -g pattyeng
25
15
  ```
26
16
 
27
- ### 2단계 Codex 설치 및 SSO 로그인
17
+ 설치 아래 명령어로 시작합니다.
28
18
 
29
19
  ```bash
30
20
  pattyeng install codex
31
21
  ```
32
22
 
33
- 실행하면 아래 작업이 **자동으로** 진행됩니다:
23
+ 브라우저가 열리면 Patty 계정으로 로그인하세요. 로그인 후 필요한 값은 자동으로 설정됩니다.
24
+
25
+ ---
26
+
27
+ ## 명령어
28
+
29
+ ### `pattyeng install codex`
30
+
31
+ Codex를 Patty 환경에 맞게 세팅합니다.
32
+
33
+ 처리하는 일:
34
34
 
35
- | 순서 | 작업 |
36
- |------|------|
37
- | | Codex 설치 확인 및 최신 버전 업데이트 |
38
- | ② | Patty 설정 파일 (`patty.config.toml`) 복사 |
39
- | | 브라우저 자동 열림 → Patty 계정으로 로그인 |
40
- | ④ | `PATTY_AGENT_API_KEY` 환경변수 자동 등록 |
41
- | ⑤ | `codex` 명령어에 Patty 설정 자동 적용 |
35
+ - Codex 설치 확인
36
+ - Codex 최신 버전 업데이트
37
+ - Patty 설정 파일 복사
38
+ - Patty SSO 로그인
39
+ - `PATTY_AGENT_API_KEY` 등록
40
+ - `codex` 명령어가 Patty 프로필을 쓰도록 설정
42
41
 
43
- ### 3단계 — 터미널 재시작
42
+ 실행:
44
43
 
45
- **Mac / Linux / WSL:**
46
44
  ```bash
47
- exec zsh # zsh 사용자
48
- exec bash # bash 사용자
45
+ pattyeng install codex
49
46
  ```
50
47
 
51
- **Windows:**
52
- 터미널을 닫고 새로 여세요. (환경변수는 이미 자동 등록됨)
53
-
54
- ---
48
+ 마지막에 터미널만 다시 불러오면 됩니다.
55
49
 
56
- ## 완료 확인
50
+ macOS / Linux / WSL:
57
51
 
58
52
  ```bash
59
- codex "안녕하세요!"
53
+ exec zsh # zsh 사용자
54
+ exec bash # bash 사용자
60
55
  ```
61
56
 
62
- 위 명령어가 실행되면 설치 완료입니다 🎉
57
+ Windows:
58
+
59
+ ```text
60
+ 터미널을 닫고 새로 열기
61
+ ```
63
62
 
64
63
  ---
65
64
 
66
- ## 자주 묻는 질문
65
+ ### `pattyeng upgrade`
67
66
 
68
- **Q. 브라우저가 자동으로 열려요.**
67
+ 로컬 도구를 최신 상태로 맞춥니다.
69
68
 
70
- 터미널에 출력된 `🔗 로그인 URL`을 복사해서 브라우저에 직접 붙여넣으세요.
69
+ ```bash
70
+ pattyeng upgrade
71
+ ```
72
+
73
+ 업데이트 대상:
74
+
75
+ - `pattyeng`
76
+ - Codex CLI
71
77
 
72
78
  ---
73
79
 
74
- **Q. "pattyeng 그룹에 속하지 않습니다" 오류가 나요.**
80
+ ### `pattyeng skills list`
75
81
 
76
- 관리자에게 `pattyeng` 그룹 추가를 요청하세요.
82
+ 현재 설치된 Codex 스킬을 봅니다.
83
+
84
+ ```bash
85
+ pattyeng skills list
86
+ ```
77
87
 
78
88
  ---
79
89
 
80
- **Q. `codex` 명령어가 없다고 나와요.**
90
+ ### `pattyeng skills sync`
91
+
92
+ Patty dotfiles에 있는 최신 스킬을 `~/.codex/skills`로 동기화합니다.
81
93
 
82
94
  ```bash
83
- npm install -g @openai/codex
95
+ pattyeng skills sync
84
96
  ```
85
97
 
98
+ 스킬이 바뀌었거나 새로 추가됐을 때 실행하면 됩니다.
99
+
86
100
  ---
87
101
 
88
- **Q. Windows에서 `setx` 오류가 나요.**
102
+ ## 지원 환경
103
+
104
+ - macOS
105
+ - Linux
106
+ - WSL 2
107
+ - Windows PowerShell
108
+ - Windows CMD
89
109
 
90
- 관리자 권한으로 터미널을 열고 다시 실행하세요.
110
+ Node.js 18 이상이 필요합니다.
91
111
 
92
112
  ---
93
113
 
94
- **Q. 이미 설치했는데 다시 실행해도 되나요?**
114
+ ## 자주 나는 문제
95
115
 
96
- 네, 안전합니다. 이미 등록된 항목은 건너뜁니다.
116
+ ### 브라우저가 자동으로 열림
97
117
 
98
- ---
118
+ 터미널에 출력된 로그인 URL을 복사해서 브라우저에 붙여넣으세요.
99
119
 
100
- ## 지원 환경
120
+ ### `pattyeng` 그룹이 아니라고 나옴
121
+
122
+ Patty 관리자에게 `pattyeng` 그룹 추가를 요청하세요.
123
+
124
+ ### 환경변수가 바로 안 잡힘
101
125
 
102
- | 환경 | 지원 여부 |
103
- |------|----------|
104
- | macOS (zsh / bash) | ✅ |
105
- | Linux (zsh / bash / fish) | ✅ |
106
- | WSL 2 | ✅ |
107
- | Windows (PowerShell / CMD) | ✅ |
126
+ 터미널을 열거나 아래 명령어를 실행하세요.
127
+
128
+ ```bash
129
+ exec zsh
130
+ # 또는
131
+ exec bash
132
+ ```
133
+
134
+ Windows는 터미널을 닫고 새로 열면 됩니다.
135
+
136
+ ### Codex가 이상하게 동작함
137
+
138
+ 한 번 업데이트하세요.
139
+
140
+ ```bash
141
+ pattyeng upgrade
142
+ ```
108
143
 
109
144
  ---
110
145
 
111
- ## 문의
146
+ ## 한 줄 요약
112
147
 
113
- Patty Engineering 슬랙 채널로 문의하세요.
148
+ Patty에서 쓰는 개발환경 세팅을 사람 손 덜 타게 만드는 도구입니다.
package/bin/pattyeng.js CHANGED
@@ -2,9 +2,11 @@
2
2
  'use strict';
3
3
 
4
4
  const { install } = require('../lib/install');
5
+ const { upgrade } = require('../lib/upgrade');
6
+ const { skills } = require('../lib/skills');
5
7
 
6
- const args = process.argv.slice(2);
7
- const cmd = args[0];
8
+ const args = process.argv.slice(2);
9
+ const cmd = args[0];
8
10
  const subcmd = args[1];
9
11
 
10
12
  async function main() {
@@ -16,6 +18,15 @@ async function main() {
16
18
  console.log('\n사용법: pattyeng install codex\n');
17
19
  }
18
20
  break;
21
+
22
+ case 'upgrade':
23
+ await upgrade();
24
+ break;
25
+
26
+ case 'skills':
27
+ await skills(args.slice(1));
28
+ break;
29
+
19
30
  default:
20
31
  printHelp();
21
32
  }
@@ -24,23 +35,18 @@ async function main() {
24
35
  function printHelp() {
25
36
  console.log(`
26
37
  ╔══════════════════════════════════════════╗
27
- ║ pattyeng CLI v1.0.0
38
+ ║ pattyeng CLI
28
39
  ╚══════════════════════════════════════════╝
29
40
 
30
- 사용법 (Usage):
31
- pattyeng install codex Codex 설치 SSO 로그인 설정
32
-
33
- 명령어 (Commands):
34
- install codex - Codex 설치, 최신 버전 업데이트, Patty SSO 로그인,
35
- API 키 환경변수 설정, alias 등록을 한번에 수행합니다.
36
- help - 이 도움말을 표시합니다.
37
-
38
- 예시 (Examples):
39
- pattyeng install codex
41
+ 명령어:
42
+ install codex Codex 설치 + SSO 로그인 + 환경설정
43
+ upgrade pattyeng, Codex 최신 버전으로 업데이트
44
+ skills list 설치된 스킬 목록
45
+ skills sync 스킬 최신 버전으로 동기화
40
46
  `);
41
47
  }
42
48
 
43
49
  main().catch((err) => {
44
- console.error('\n❌ 오류 발생:', err.message);
50
+ console.error('\n❌ 오류:', err.message);
45
51
  process.exit(1);
46
52
  });
package/lib/skills.js ADDED
@@ -0,0 +1,170 @@
1
+ 'use strict';
2
+
3
+ const { execSync } = require('child_process');
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const os = require('os');
7
+
8
+ const HOME = os.homedir();
9
+ const DEST_DIR = path.join(HOME, '.codex', 'skills');
10
+
11
+ // Source: npm registry tarball for pattyeng — skills are bundled inside package
12
+ // Fallback: look for dotfiles repo next to package install location
13
+ function findSourceSkillsDir() {
14
+ const candidates = [
15
+ // bundled inside the npm package itself (skills/ at package root)
16
+ path.join(__dirname, '..', 'skills'),
17
+ // dotfiles repo sibling
18
+ path.join(__dirname, '..', '..', 'skills'),
19
+ path.join(__dirname, '..', '..', 'dotfiles', 'skills'),
20
+ ];
21
+ return candidates.find(d => fs.existsSync(d) && fs.statSync(d).isDirectory()) || null;
22
+ }
23
+
24
+ function log(msg) { process.stdout.write(msg + '\n'); }
25
+ function step(msg) { log(`\n🔧 ${msg}`); }
26
+ function ok(msg) { log(`✅ ${msg}`); }
27
+ function warn(msg) { log(`⚠️ ${msg}`); }
28
+ function info(msg) { log(` ${msg}`); }
29
+
30
+ // Read SKILL.md name/description
31
+ function readSkillMeta(skillDir) {
32
+ const mdPath = path.join(skillDir, 'SKILL.md');
33
+ if (!fs.existsSync(mdPath)) return { name: path.basename(skillDir), description: '' };
34
+ const content = fs.readFileSync(mdPath, 'utf8');
35
+ const nameMatch = content.match(/^name:\s*(.+)$/m);
36
+ const descMatch = content.match(/^description:\s*(.+)$/m);
37
+ return {
38
+ name: nameMatch ? nameMatch[1].trim() : path.basename(skillDir),
39
+ description: descMatch ? descMatch[1].trim().slice(0, 60) : '',
40
+ };
41
+ }
42
+
43
+ // Diff two SKILL.md files — returns true if different
44
+ function isDifferent(srcFile, destFile) {
45
+ if (!fs.existsSync(destFile)) return true;
46
+ return fs.readFileSync(srcFile, 'utf8') !== fs.readFileSync(destFile, 'utf8');
47
+ }
48
+
49
+ // Copy a skill folder recursively
50
+ function copySkill(srcDir, destDir) {
51
+ if (!fs.existsSync(destDir)) fs.mkdirSync(destDir, { recursive: true });
52
+ for (const file of fs.readdirSync(srcDir)) {
53
+ const src = path.join(srcDir, file);
54
+ const dest = path.join(destDir, file);
55
+ if (fs.statSync(src).isDirectory()) {
56
+ copySkill(src, dest);
57
+ } else {
58
+ fs.copyFileSync(src, dest);
59
+ }
60
+ }
61
+ }
62
+
63
+ async function skills(args) {
64
+ const sub = args[0];
65
+
66
+ if (!sub || sub === 'list') {
67
+ return listSkills();
68
+ }
69
+ if (sub === 'sync') {
70
+ return syncSkills();
71
+ }
72
+
73
+ log(`\n사용법:\n pattyeng skills list — 설치된 스킬 목록\n pattyeng skills sync — 스킬 최신 버전으로 동기화\n`);
74
+ }
75
+
76
+ function listSkills() {
77
+ log(`\n📚 설치된 스킬 목록 (${DEST_DIR})\n`);
78
+
79
+ if (!fs.existsSync(DEST_DIR)) {
80
+ warn('~/.codex/skills 폴더가 없습니다. pattyeng skills sync 를 먼저 실행하세요.');
81
+ return;
82
+ }
83
+
84
+ const skills = fs.readdirSync(DEST_DIR).filter(f => {
85
+ try { return fs.statSync(path.join(DEST_DIR, f)).isDirectory(); }
86
+ catch { return false; } // broken symlink — skip
87
+ });
88
+
89
+ if (skills.length === 0) {
90
+ warn('스킬이 없습니다. pattyeng skills sync 를 실행하세요.');
91
+ return;
92
+ }
93
+
94
+ for (const skill of skills.sort()) {
95
+ const meta = readSkillMeta(path.join(DEST_DIR, skill));
96
+ const desc = meta.description ? `— ${meta.description}` : '';
97
+ log(` • ${meta.name.padEnd(20)} ${desc}`);
98
+ }
99
+ log('');
100
+ }
101
+
102
+ function syncSkills() {
103
+ log(`
104
+ ╔══════════════════════════════════════════╗
105
+ ║ pattyeng skills sync 시작 ║
106
+ ╚══════════════════════════════════════════╝
107
+ `);
108
+
109
+ const srcDir = findSourceSkillsDir();
110
+ if (!srcDir) {
111
+ warn('스킬 소스 폴더를 찾을 수 없습니다.');
112
+ warn('dotfiles 저장소가 있어야 합니다: ~/projects/dotfiles/skills/');
113
+ process.exit(1);
114
+ }
115
+ log(` 소스: ${srcDir}`);
116
+ log(` 대상: ${DEST_DIR}\n`);
117
+
118
+ if (!fs.existsSync(DEST_DIR)) fs.mkdirSync(DEST_DIR, { recursive: true });
119
+
120
+ const srcSkills = fs.readdirSync(srcDir).filter(f =>
121
+ fs.statSync(path.join(srcDir, f)).isDirectory()
122
+ );
123
+
124
+ let added = 0;
125
+ let updated = 0;
126
+ let skipped = 0;
127
+
128
+ for (const skill of srcSkills.sort()) {
129
+ const src = path.join(srcDir, skill);
130
+ const dest = path.join(DEST_DIR, skill);
131
+ const meta = readSkillMeta(src);
132
+ const srcMd = path.join(src, 'SKILL.md');
133
+ const destMd = path.join(dest, 'SKILL.md');
134
+
135
+ const destExists = fs.existsSync(dest);
136
+ const destLstat = destExists ? null : null, lstat = (() => { try { return fs.lstatSync(dest); } catch { return null; } })();
137
+ const isSymlink = lstat && lstat.isSymbolicLink();
138
+ const alreadyPointsHere = isSymlink && fs.readlinkSync(dest) === src;
139
+
140
+ if (!lstat) {
141
+ // doesn’t exist at all
142
+ fs.symlinkSync(src, dest);
143
+ log(` ✨ 새로 추가: ${meta.name}`);
144
+ added++;
145
+ } else if (alreadyPointsHere) {
146
+ // already correct symlink
147
+ skipped++;
148
+ } else if (isSymlink) {
149
+ // symlink pointing somewhere else — update
150
+ fs.unlinkSync(dest);
151
+ fs.symlinkSync(src, dest);
152
+ log(` 🔄 업데이트: ${meta.name}`);
153
+ updated++;
154
+ } else if (isDifferent(srcMd, destMd)) {
155
+ // real dir with changed content — overwrite
156
+ copySkill(src, dest);
157
+ log(` 🔄 업데이트: ${meta.name}`);
158
+ updated++;
159
+ } else {
160
+ skipped++;
161
+ }
162
+ }
163
+
164
+ log(`
165
+ 추가: ${added}개 업데이트: ${updated}개 변경없음: ${skipped}개
166
+
167
+ ✅ 스킬 동기화 완료`);
168
+ }
169
+
170
+ module.exports = { skills };
package/lib/upgrade.js ADDED
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ const { execSync } = require('child_process');
4
+
5
+ function log(msg) { process.stdout.write(msg + '\n'); }
6
+ function step(msg) { log(`\n🔧 ${msg}`); }
7
+ function ok(msg) { log(`✅ ${msg}`); }
8
+ function warn(msg) { log(`⚠️ ${msg}`); }
9
+
10
+ async function upgrade() {
11
+ log(`
12
+ ╔══════════════════════════════════════════╗
13
+ ║ pattyeng upgrade 시작 ║
14
+ ╚══════════════════════════════════════════╝
15
+ `);
16
+
17
+ // 1. pattyeng itself
18
+ step('pattyeng 최신 버전으로 업데이트 중...');
19
+ try {
20
+ const before = execSync('npm list -g pattyeng --depth=0 2>/dev/null', { encoding: 'utf8' }).trim();
21
+ execSync('npm install -g pattyeng@latest', { stdio: 'inherit' });
22
+ const after = execSync('npm list -g pattyeng --depth=0 2>/dev/null', { encoding: 'utf8' }).trim();
23
+ if (before !== after) {
24
+ ok('pattyeng 업데이트 완료');
25
+ } else {
26
+ ok('pattyeng 이미 최신 버전');
27
+ }
28
+ } catch (e) {
29
+ warn('pattyeng 업데이트 실패: ' + e.message);
30
+ }
31
+
32
+ // 2. codex
33
+ step('Codex 최신 버전으로 업데이트 중...');
34
+ try {
35
+ execSync('npm install -g @openai/codex@latest', { stdio: 'inherit' });
36
+ ok('Codex 업데이트 완료');
37
+ } catch (e) {
38
+ warn('Codex 업데이트 실패: ' + e.message);
39
+ }
40
+
41
+ log(`
42
+ ✨ 업그레이드 완료!
43
+ `);
44
+ }
45
+
46
+ module.exports = { upgrade };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pattyeng",
3
- "version": "1.0.3",
3
+ "version": "1.0.6",
4
4
  "description": "Patty Engineering CLI - Codex SSO setup tool",
5
5
  "bin": {
6
6
  "pattyeng": "./bin/pattyeng.js"
@@ -26,7 +26,9 @@
26
26
  "access": "public"
27
27
  },
28
28
  "files": [
29
- "bin/",
30
- "lib/"
29
+ "bin",
30
+ "lib",
31
+ "skills",
32
+ "README.md"
31
33
  ]
32
34
  }
@@ -0,0 +1 @@
1
+ 66eb33bbe0eb99ac