reborn-prompt 1.0.0 → 1.0.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.
Files changed (3) hide show
  1. package/README.md +3 -3
  2. package/install.mjs +114 -105
  3. package/package.json +25 -6
package/README.md CHANGED
@@ -71,6 +71,6 @@ CheckoutForm.tsx, validate.ts
71
71
 
72
72
  REBORN LABS · MIT
73
73
  설명 https://rebornlabs.kr/prompt?utm_source=installer&utm_medium=cli&utm_campaign=prompt
74
-
75
- 매일 알아서 발행되는 것까지 필요하시면
76
- https://rebornlabs.kr/claudekit?utm_source=installer&utm_medium=cli&utm_campaign=prompt
74
+ 이건 한 번의 대화를 좋게 만듭니다. 클로드가 하는 일 자체를 손보는 건 따로 있습니다 —
75
+ 골라 담은 스킬 48종, 한 줄로. 8,900원 (목록과 직접 까는 명령까지 공개돼 있습니다)
76
+ https://rebornlabs.kr/skillpack?utm_source=installer&utm_medium=cli&utm_campaign=prompt
package/install.mjs CHANGED
@@ -1,105 +1,114 @@
1
- #!/usr/bin/env node
2
- /**
3
- * 프롬프트 정리기 설치기 — **깔고, 진짜 잡히는지 확인까지 한다.**
4
- *
5
- * npx reborn-prompt 설치 + 확인
6
- * npx reborn-prompt --check 설치하지 않고 지금 상태만 본다
7
- *
8
- * ★★[[kit-update-selfcheck]] · [[kit-skill-registry-installer]] 와 같은 원칙이다.
9
- * **복사는 조용히 실패한다.** 그래서 종료코드로 판정하지 않고,
10
- * 끝나고 나서 **파일이 실제로 있는지·머리말이 온전한지**를 다시 본다.
11
- *
12
- * ★이 스킬은 남의 것이 아니라 **우리가 만든 것**이다(MIT). 그래서 `skills add` 로 남의
13
- * 저장소를 부르는 게 아니라, 패키지에 동봉한 파일을 홈으로 **복사**한다.
14
- */
15
- import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync } from "node:fs";
16
- import { homedir } from "node:os";
17
- import { dirname, join, relative } from "node:path";
18
- import { fileURLToPath } from "node:url";
19
-
20
- const HOME = homedir();
21
- const 여기 = dirname(fileURLToPath(import.meta.url));
22
- const 확인만 = process.argv.includes("--check");
23
-
24
- const c = { g: "\x1b[32m", r: "\x1b[31m", y: "\x1b[33m", d: "\x1b[90m", cy: "\x1b[36m", b: "\x1b[1m", 0: "\x1b[0m" };
25
- const 스킬이름 = "prompt-fix";
26
- const 원본 = join(여기, "skill");
27
- const 대상 = join(HOME, ".claude", "skills", 스킬이름);
28
-
29
- console.log(`\n${c.b}프롬프트 정리기${c[0]} ${c.d}· REBORN LABS · MIT${c[0]}`);
30
- console.log(`${c.d}한 문장을 그대로 쓸 수 있는 프롬프트로 정리합니다.${c[0]}\n`);
31
-
32
- /* ── 무엇을 넣을 것인가 ─────────────────────────────────────────────── */
33
- function 파일목록(뿌리) {
34
- const 나온다 = [];
35
- const 걷기 = (d) => {
36
- for (const 이름 of readdirSync(d)) {
37
- const p = join(d, 이름);
38
- if (statSync(p).isDirectory()) 걷기(p);
39
- else 나온다.push(p);
40
- }
41
- };
42
- 걷기(뿌리);
43
- return 나온다;
44
- }
45
-
46
- if (!existsSync(원본)) {
47
- console.error(`${c.r}✗ 패키지 안에 skill/ 폴더가 없다${c[0]} — 배포가 잘못된 것이다.`);
48
- console.error(` ${c.d}받은 곳: ${여기}${c[0]}`);
49
- process.exit(2);
50
- }
51
- const 넣을것 = 파일목록(원본);
52
-
53
- /* ── 지금 상태 ──────────────────────────────────────────────────────── */
54
- const 지금 = 검사();
55
- function 검사() {
56
- const md = join(대상, "SKILL.md");
57
- if (!existsSync(md)) return { 있음: false, 이유: "SKILL.md 가 없다" };
58
- const 본문 = readFileSync(md, "utf8");
59
- if (!/^---[\s\S]*?\bname:\s*prompt-fix\b/m.test(본문)) {
60
- return { 있음: false, 이유: "SKILL.md 의 머리말이 깨졌다(name 을 못 읽는다)" };
61
- }
62
- const 참고 = join(대상, "references", "낭비35.md");
63
- if (!existsSync(참고)) return { 있음: false, 이유: "references/낭비35.md 가 없다" };
64
- /* ★★영상·랜딩·README 가 전부 "35가지"를 인용한다. 목록이 줄어들면 광고가 거짓이 된다.
65
- 그래서 **개수를 여기서 센다.** 파일이 있다는 것만으로 통과시키지 않는다. */
66
- const 수 = (readFileSync(참고, "utf8").match(/^\d+\.\s\*\*/gm) || []).length;
67
- if (수 !== 35) return { 있음: false, 이유: `35가지여야 하는데 ${수}개다 — 목록이 잘렸다` };
68
- return { 있음: true, 수 };
69
- }
70
-
71
- if (확인만) {
72
- if (지금.있음) console.log(`${c.g}✓ 설치되어 있습니다${c[0]} ${c.d}(${대상} · 35가지 확인)${c[0]}\n`);
73
- else console.log(`${c.y}· 아직 없습니다${c[0]} ${c.d}— ${지금.이유}${c[0]}\n`);
74
- process.exit(지금.있음 ? 0 : 1);
75
- }
76
-
77
- /* ── 설치 ───────────────────────────────────────────────────────────── */
78
- let 쓴수 = 0;
79
- for (const src of 넣을것) {
80
- const 상대 = relative(원본, src);
81
- const dst = join(대상, 상대);
82
- mkdirSync(dirname(dst), { recursive: true });
83
- writeFileSync(dst, readFileSync(src));
84
- 쓴수++;
85
- console.log(` ${c.d}·${c[0]} ${상대}`);
86
- }
87
- console.log(`\n${c.d}${쓴수}개 파일 → ${대상}${c[0]}`);
88
-
89
- /* ── ★설치가 아니라 **설치 뒤 확인**이 이 설치기의 값이다 ─────────────── */
90
- const 뒤 = 검사();
91
- if (!뒤.있음) {
92
- console.error(`\n${c.r}✗ 깔았는데 확인에서 걸렸습니다${c[0]} — ${뒤.이유}`);
93
- console.error(` ${c.d}권한이나 경로 문제일 수 있습니다. 위 경로를 직접 열어 확인해 주세요.${c[0]}\n`);
94
- process.exit(1);
95
- }
96
-
97
- console.log(`\n${c.g}${c.b}✓ 설치 완료${c[0]} ${c.d}— 파일 확인까지 끝났습니다(35가지 목록 온전).${c[0]}`);
98
- console.log(`\n${c.y}★ 클로드 코드를 껐다 켜야 적용됩니다.${c[0]}`);
99
- console.log(`\n${c.b}쓰는 법${c[0]}`);
100
- console.log(` 그냥 대충 말하세요 — ${c.cy}"그냥 결제 되게 좀 고쳐줘"${c[0]}`);
101
- console.log(` ${c.d}그럼 할 일·산출물·손댈 범위·끝나는 조건까지 채운 프롬프트로 바꿔 줍니다.${c[0]}`);
102
- console.log(` ${c.d}챗GPT·커서에 그대로 붙여넣어도 됩니다.${c[0]}\n`);
103
- console.log(`${c.d}설명 · https://rebornlabs.kr/prompt?utm_source=installer&utm_medium=cli&utm_campaign=prompt${c[0]}`);
104
- /* ★[[funnel-free-to-paid-join]] — 무료 배포물 안에 유료 제품 안내를 둔다. 숨기지 않는다. */
105
- console.log(`${c.d}매일 자동 발행까지 필요하시면 · https://rebornlabs.kr/claudekit?utm_source=installer&utm_medium=cli&utm_campaign=prompt${c[0]}\n`);
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 프롬프트 정리기 설치기 — **깔고, 진짜 잡히는지 확인까지 한다.**
4
+ *
5
+ * npx reborn-prompt 설치 + 확인
6
+ * npx reborn-prompt --check 설치하지 않고 지금 상태만 본다
7
+ *
8
+ * ★★[[kit-update-selfcheck]] · [[kit-skill-registry-installer]] 와 같은 원칙이다.
9
+ * **복사는 조용히 실패한다.** 그래서 종료코드로 판정하지 않고,
10
+ * 끝나고 나서 **파일이 실제로 있는지·머리말이 온전한지**를 다시 본다.
11
+ *
12
+ * ★이 스킬은 남의 것이 아니라 **우리가 만든 것**이다(MIT). 그래서 `skills add` 로 남의
13
+ * 저장소를 부르는 게 아니라, 패키지에 동봉한 파일을 홈으로 **복사**한다.
14
+ */
15
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync } from "node:fs";
16
+ import { homedir } from "node:os";
17
+ import { dirname, join, relative } from "node:path";
18
+ import { fileURLToPath } from "node:url";
19
+
20
+ const HOME = homedir();
21
+ const 여기 = dirname(fileURLToPath(import.meta.url));
22
+ const 확인만 = process.argv.includes("--check");
23
+
24
+ const c = { g: "\x1b[32m", r: "\x1b[31m", y: "\x1b[33m", d: "\x1b[90m", cy: "\x1b[36m", b: "\x1b[1m", 0: "\x1b[0m" };
25
+ const 스킬이름 = "prompt-fix";
26
+ const 원본 = join(여기, "skill");
27
+ const 대상 = join(HOME, ".claude", "skills", 스킬이름);
28
+
29
+ console.log(`\n${c.b}프롬프트 정리기${c[0]} ${c.d}· REBORN LABS · MIT${c[0]}`);
30
+ console.log(`${c.d}한 문장을 그대로 쓸 수 있는 프롬프트로 정리합니다.${c[0]}\n`);
31
+
32
+ /* ── 무엇을 넣을 것인가 ─────────────────────────────────────────────── */
33
+ function 파일목록(뿌리) {
34
+ const 나온다 = [];
35
+ const 걷기 = (d) => {
36
+ for (const 이름 of readdirSync(d)) {
37
+ const p = join(d, 이름);
38
+ if (statSync(p).isDirectory()) 걷기(p);
39
+ else 나온다.push(p);
40
+ }
41
+ };
42
+ 걷기(뿌리);
43
+ return 나온다;
44
+ }
45
+
46
+ if (!existsSync(원본)) {
47
+ console.error(`${c.r}✗ 패키지 안에 skill/ 폴더가 없다${c[0]} — 배포가 잘못된 것이다.`);
48
+ console.error(` ${c.d}받은 곳: ${여기}${c[0]}`);
49
+ process.exit(2);
50
+ }
51
+ const 넣을것 = 파일목록(원본);
52
+
53
+ /* ── 지금 상태 ──────────────────────────────────────────────────────── */
54
+ const 지금 = 검사();
55
+ function 검사() {
56
+ const md = join(대상, "SKILL.md");
57
+ if (!existsSync(md)) return { 있음: false, 이유: "SKILL.md 가 없다" };
58
+ const 본문 = readFileSync(md, "utf8");
59
+ if (!/^---[\s\S]*?\bname:\s*prompt-fix\b/m.test(본문)) {
60
+ return { 있음: false, 이유: "SKILL.md 의 머리말이 깨졌다(name 을 못 읽는다)" };
61
+ }
62
+ const 참고 = join(대상, "references", "낭비35.md");
63
+ if (!existsSync(참고)) return { 있음: false, 이유: "references/낭비35.md 가 없다" };
64
+ /* ★★영상·랜딩·README 가 전부 "35가지"를 인용한다. 목록이 줄어들면 광고가 거짓이 된다.
65
+ 그래서 **개수를 여기서 센다.** 파일이 있다는 것만으로 통과시키지 않는다. */
66
+ const 수 = (readFileSync(참고, "utf8").match(/^\d+\.\s\*\*/gm) || []).length;
67
+ if (수 !== 35) return { 있음: false, 이유: `35가지여야 하는데 ${수}개다 — 목록이 잘렸다` };
68
+ return { 있음: true, 수 };
69
+ }
70
+
71
+ if (확인만) {
72
+ if (지금.있음) console.log(`${c.g}✓ 설치되어 있습니다${c[0]} ${c.d}(${대상} · 35가지 확인)${c[0]}\n`);
73
+ else console.log(`${c.y}· 아직 없습니다${c[0]} ${c.d}— ${지금.이유}${c[0]}\n`);
74
+ process.exit(지금.있음 ? 0 : 1);
75
+ }
76
+
77
+ /* ── 설치 ───────────────────────────────────────────────────────────── */
78
+ let 쓴수 = 0;
79
+ for (const src of 넣을것) {
80
+ const 상대 = relative(원본, src);
81
+ const dst = join(대상, 상대);
82
+ mkdirSync(dirname(dst), { recursive: true });
83
+ writeFileSync(dst, readFileSync(src));
84
+ 쓴수++;
85
+ console.log(` ${c.d}·${c[0]} ${상대}`);
86
+ }
87
+ console.log(`\n${c.d}${쓴수}개 파일 → ${대상}${c[0]}`);
88
+
89
+ /* ── ★설치가 아니라 **설치 뒤 확인**이 이 설치기의 값이다 ─────────────── */
90
+ const 뒤 = 검사();
91
+ if (!뒤.있음) {
92
+ console.error(`\n${c.r}✗ 깔았는데 확인에서 걸렸습니다${c[0]} — ${뒤.이유}`);
93
+ console.error(` ${c.d}권한이나 경로 문제일 수 있습니다. 위 경로를 직접 열어 확인해 주세요.${c[0]}\n`);
94
+ process.exit(1);
95
+ }
96
+
97
+ console.log(`\n${c.g}${c.b}✓ 설치 완료${c[0]} ${c.d}— 파일 확인까지 끝났습니다(35가지 목록 온전).${c[0]}`);
98
+ console.log(`\n${c.y}★ 클로드 코드를 껐다 켜야 적용됩니다.${c[0]}`);
99
+ console.log(`\n${c.b}쓰는 법${c[0]}`);
100
+ console.log(` 그냥 대충 말하세요 — ${c.cy}"그냥 결제 되게 좀 고쳐줘"${c[0]}`);
101
+ console.log(` ${c.d}그럼 할 일·산출물·손댈 범위·끝나는 조건까지 채운 프롬프트로 바꿔 줍니다.${c[0]}`);
102
+ console.log(` ${c.d}챗GPT·커서에 그대로 붙여넣어도 됩니다.${c[0]}\n`);
103
+ console.log(`${c.d}설명 · https://rebornlabs.kr/prompt?utm_source=installer&utm_medium=cli&utm_campaign=prompt${c[0]}`);
104
+ /* ★[[funnel-free-to-paid-join]] — 무료 배포물 안에 유료 제품 안내를 둔다. 숨기지 않는다. */
105
+ /* ★가리키는 곳을 158,000원 클로드킷 → 8,900원 스킬팩으로 내렸다 (2026-08-24).
106
+ 무료 다음 칸이 곧바로 158,000원이라 아무도 못 건넜다(판매 페이지까지 간 10명 중 0명).
107
+ 자비스는 스킬팩을 산 사람에게 민다 — 그래야 계단이 생긴다.
108
+ ★문안 정본은 skillpack/tail_copy.mjs. */
109
+ console.log(`${c.d}이건 한 번의 대화를 좋게 만듭니다. 클로드가 하는 일 자체를 손보는 건 따로 있습니다.${c[0]}`);
110
+ console.log(`
111
+ ${c.b}리본랩스 스킬팩${c[0]}${c.d} — 골라 담은 스킬 48종, 한 줄로. 8,900원${c[0]}`);
112
+ console.log(`${c.cy}https://rebornlabs.kr/skillpack?utm_source=installer&utm_medium=cli&utm_campaign=prompt${c[0]}`);
113
+ console.log(`${c.d}목록과 직접 까는 명령까지 그 페이지에 그대로 적어 두었습니다. 안 사셔도 됩니다.${c[0]}
114
+ `);
package/package.json CHANGED
@@ -1,14 +1,33 @@
1
1
  {
2
2
  "name": "reborn-prompt",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "한 문장을 그대로 쓸 수 있는 프롬프트로 정리합니다 — 할 일·산출물·손댈 범위·끝나는 조건 네 칸 + 크레딧을 낭비하는 35가지 체크 + 이미 내린 결정 기억. 클로드·챗GPT·커서 어디에나.",
5
- "keywords": ["claude", "claude-code", "prompt", "prompt-engineering", "agent-skills", "skill", "chatgpt", "cursor"],
5
+ "keywords": [
6
+ "claude",
7
+ "claude-code",
8
+ "prompt",
9
+ "prompt-engineering",
10
+ "agent-skills",
11
+ "skill",
12
+ "chatgpt",
13
+ "cursor"
14
+ ],
6
15
  "homepage": "https://rebornlabs.kr/prompt?utm_source=installer&utm_medium=cli&utm_campaign=prompt",
7
- "bugs": { "url": "https://mobility.rebornlabs.kr/cs" },
16
+ "bugs": {
17
+ "url": "https://mobility.rebornlabs.kr/cs"
18
+ },
8
19
  "license": "MIT",
9
20
  "author": "REBORN LABS",
10
21
  "type": "module",
11
- "bin": { "reborn-prompt": "install.mjs" },
12
- "files": ["install.mjs", "skill/", "README.md"],
13
- "engines": { "node": ">=18" }
22
+ "bin": {
23
+ "reborn-prompt": "install.mjs"
24
+ },
25
+ "files": [
26
+ "install.mjs",
27
+ "skill/",
28
+ "README.md"
29
+ ],
30
+ "engines": {
31
+ "node": ">=18"
32
+ }
14
33
  }