projectops 4.18.1 → 4.20.0

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.18.0 (2026-09-18)
10
+ ## 최신 버전 : v4.19.0 (2026-09-22)
11
11
 
12
12
  [전체 버전 기록 보기](CHANGELOG.md)
13
13
 
@@ -164,7 +164,7 @@ npx projectops --mode skills
164
164
 
165
165
  | 스킬 | 용도 |
166
166
  |------|------|
167
- | `/pro-figma` | Figma CSS → React/RN/Flutter 반응형 코드 변환 |
167
+ | `/pro-figma-verify` | Figma 시안을 코드로 옮기고, 옮긴 것이 시안과 같은지 픽셀로 센다 |
168
168
  | `/pro-build` | 프로젝트 빌드 실행, 에러 분석, 최적화 제안 |
169
169
 
170
170
  > 설계·계획·구현 흐름은 `superpowers`(brainstorming → writing-plans → executing-plans)가 담당합니다.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectops",
3
- "version": "4.18.1",
3
+ "version": "4.20.0",
4
4
  "description": "ProjectOps — 완전 자동화 GitHub 프로젝트 관리 템플릿 통합 CLI",
5
5
  "keywords": [
6
6
  "devops",
@@ -43,6 +43,18 @@ function apply(io, ctx = {}) {
43
43
  filter: (p) => !TEST_PATH.test(p),
44
44
  });
45
45
  }
46
+ // 소스에서 사라진 우리 스킬을 지운다. 복사는 overlay 라 덮어쓰기만 하면
47
+ // **폐기한 스킬이 남의 컴퓨터에 영영 남아** 계속 잡힌다 — util 복사가 같은
48
+ // 함정에 빠졌던 자리다 (#500). 남의 스킬은 접두사로 걸러 건드리지 않는다.
49
+ const srcNames = new Set(readdirSync(src));
50
+ for (const name of readdirSync(dest)) {
51
+ if (srcNames.has(name) || name === "cursor-skills-meta.json") continue;
52
+ if (!/^(pro|suh)-/.test(name)) continue;
53
+ try {
54
+ rmSync(join(dest, name), { recursive: true, force: true });
55
+ io.log(` 폐기된 스킬 제거: ${name}`);
56
+ } catch { /* 무시 — 지우지 못해도 설치는 계속한다 */ }
57
+ }
46
58
  writeMeta(io, dest, ctx.templateVersion);
47
59
  io.log(` Cursor Skills 설치 완료 (${dest}/, v${ctx.templateVersion || "unknown"})`);
48
60
  return true;
@@ -74,7 +86,9 @@ function ownedEntries(io, ctx) {
74
86
  const src = resolveSkillsSrc(ctx);
75
87
  if (src && existsSync(src)) srcNames = new Set(readdirSync(src));
76
88
  const EXTRA = new Set(["cursor-skills-meta.json"]);
77
- return readdirSync(dir).filter((name) => srcNames.has(name) || /^suh-/.test(name) || EXTRA.has(name));
89
+ // suh- 는 옛 접두사, pro- 는 현행 접두사다. 둘 다 우리 것으로 친다 —
90
+ // 폐기한 스킬은 소스에 없으므로 srcNames 로는 잡히지 않는다 (#619).
91
+ return readdirSync(dir).filter((name) => srcNames.has(name) || /^(pro|suh)-/.test(name) || EXTRA.has(name));
78
92
  }
79
93
 
80
94
  // 옛 이름/버전 meta면 projectops 소유 항목만 선별 삭제 → apply가 신규 재설치.