ramadan-cal 1.0.2 → 1.0.4
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/package.json +1 -1
- package/scripts/postinstall.js +75 -95
package/package.json
CHANGED
package/scripts/postinstall.js
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Postinstall script — runs automatically after npm install.
|
|
5
|
-
* Interactively sets up Claude Code integration if the user wants it.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from 'fs';
|
|
9
4
|
import { join } from 'path';
|
|
10
5
|
import { homedir } from 'os';
|
|
@@ -42,6 +37,10 @@ ramadan $ARGUMENTS
|
|
|
42
37
|
\`\`\`
|
|
43
38
|
`;
|
|
44
39
|
|
|
40
|
+
function log(msg) {
|
|
41
|
+
process.stderr.write(msg + '\n');
|
|
42
|
+
}
|
|
43
|
+
|
|
45
44
|
function isClaudeInstalled() {
|
|
46
45
|
try {
|
|
47
46
|
execSync('which claude', { stdio: 'ignore' });
|
|
@@ -53,20 +52,29 @@ function isClaudeInstalled() {
|
|
|
53
52
|
|
|
54
53
|
function isClaudeMdConfigured() {
|
|
55
54
|
if (!existsSync(claudeMd)) return false;
|
|
56
|
-
|
|
57
|
-
return content.includes(MARKER);
|
|
55
|
+
return readFileSync(claudeMd, 'utf-8').includes(MARKER);
|
|
58
56
|
}
|
|
59
57
|
|
|
60
58
|
function isSkillInstalled() {
|
|
61
59
|
if (!existsSync(ramadanSkillFile)) return false;
|
|
62
|
-
|
|
63
|
-
return content.includes(SKILL_MARKER);
|
|
60
|
+
return readFileSync(ramadanSkillFile, 'utf-8').includes(SKILL_MARKER);
|
|
64
61
|
}
|
|
65
62
|
|
|
66
|
-
function
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
function configureClaudeMd() {
|
|
64
|
+
if (isClaudeMdConfigured()) return;
|
|
65
|
+
if (!existsSync(claudeDir)) mkdirSync(claudeDir, { recursive: true });
|
|
66
|
+
if (existsSync(claudeMd)) {
|
|
67
|
+
appendFileSync(claudeMd, CLAUDE_ENTRY);
|
|
68
|
+
} else {
|
|
69
|
+
writeFileSync(claudeMd, CLAUDE_ENTRY.trimStart());
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function createSkill() {
|
|
74
|
+
if (!existsSync(skillsDir)) mkdirSync(skillsDir, { recursive: true });
|
|
75
|
+
if (!existsSync(ramadanSkillDir)) mkdirSync(ramadanSkillDir, { recursive: true });
|
|
76
|
+
writeFileSync(ramadanSkillFile, RAMADAN_SKILL);
|
|
77
|
+
configureClaudeMd();
|
|
70
78
|
}
|
|
71
79
|
|
|
72
80
|
function ask(question) {
|
|
@@ -80,105 +88,77 @@ function ask(question) {
|
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
async function main() {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
// Check if already fully configured
|
|
92
|
-
if (claudeMdConfigured && skillInstalled) {
|
|
93
|
-
console.log(' ✓ Claude Code integration already configured');
|
|
91
|
+
log('');
|
|
92
|
+
log(' 🌙 Ramadan CLI installed successfully!');
|
|
93
|
+
log('');
|
|
94
|
+
|
|
95
|
+
// Non-interactive environment (CI, piped stdin) — skip prompts
|
|
96
|
+
if (!process.stdin.isTTY) {
|
|
97
|
+
log(' Run `npm rebuild ramadan-cal` in an interactive terminal to set up Claude Code.');
|
|
98
|
+
log('');
|
|
94
99
|
return;
|
|
95
100
|
}
|
|
96
101
|
|
|
97
|
-
// Check if Claude is installed
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
102
|
+
// Step 1: Check if Claude Code is installed
|
|
103
|
+
if (!isClaudeInstalled()) {
|
|
104
|
+
log(' Claude Code not detected on your PATH.');
|
|
105
|
+
log(' Run `npm rebuild ramadan-cal` to set up Claude Code integration later.');
|
|
106
|
+
log('');
|
|
107
|
+
log(' ➜ Run `ramadan` to get started.');
|
|
108
|
+
log('');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
107
111
|
|
|
108
|
-
|
|
109
|
-
|
|
112
|
+
log(' ✓ Claude Code detected');
|
|
113
|
+
log('');
|
|
110
114
|
|
|
111
|
-
|
|
115
|
+
// Already fully set up?
|
|
116
|
+
if (isSkillInstalled() && isClaudeMdConfigured()) {
|
|
117
|
+
log(' ✓ Claude Code integration already configured');
|
|
118
|
+
log(' Type "ramadan" or "/ramadan" in Claude Code.');
|
|
119
|
+
log('');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
112
122
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
123
|
+
// Step 2: Check if skills folder exists
|
|
124
|
+
if (!existsSync(skillsDir)) {
|
|
125
|
+
// Skills folder doesn't exist — ask to create it
|
|
126
|
+
const answer = await ask(' Create a Claude Code skills folder and add the ramadan skill? (y/n) ');
|
|
127
|
+
log('');
|
|
128
|
+
if (answer === 'y' || answer === 'yes') {
|
|
129
|
+
createSkill();
|
|
130
|
+
log(' ✓ Created ~/.claude/skills/ramadan/');
|
|
131
|
+
log(' ✓ Ramadan skill added');
|
|
132
|
+
log('');
|
|
133
|
+
log(' Type "ramadan" or "/ramadan" in Claude Code to use it.');
|
|
134
|
+
} else {
|
|
135
|
+
log(' Skipped. Run `npm rebuild ramadan-cal` or type `ramadan` directly in your terminal.');
|
|
116
136
|
}
|
|
117
137
|
} else {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
138
|
+
// Skills folder exists — ask if they want the skill added
|
|
139
|
+
if (isSkillInstalled()) {
|
|
140
|
+
log(' ✓ Ramadan skill already installed');
|
|
141
|
+
configureClaudeMd();
|
|
142
|
+
log(' Type "ramadan" or "/ramadan" in Claude Code.');
|
|
143
|
+
log('');
|
|
124
144
|
return;
|
|
125
145
|
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Create .claude directory if needed
|
|
129
|
-
if (!existsSync(claudeDir)) {
|
|
130
|
-
mkdirSync(claudeDir, { recursive: true });
|
|
131
|
-
console.log(' ✓ Created ~/.claude/');
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Write or append to CLAUDE.md
|
|
135
|
-
if (!claudeMdConfigured) {
|
|
136
|
-
if (existsSync(claudeMd)) {
|
|
137
|
-
appendFileSync(claudeMd, CLAUDE_ENTRY);
|
|
138
|
-
console.log(' ✓ Added ramadan command to ~/.claude/CLAUDE.md');
|
|
139
|
-
} else {
|
|
140
|
-
writeFileSync(claudeMd, CLAUDE_ENTRY.trimStart());
|
|
141
|
-
console.log(' ✓ Created ~/.claude/CLAUDE.md');
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
146
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if (
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
} else {
|
|
153
|
-
writeFileSync(ramadanSkillFile, RAMADAN_SKILL);
|
|
154
|
-
console.log(' ✓ Created ramadan skill — type `/ramadan` in Claude Code');
|
|
155
|
-
}
|
|
147
|
+
const answer = await ask(' Add the ramadan skill to Claude Code? (y/n) ');
|
|
148
|
+
log('');
|
|
149
|
+
if (answer === 'y' || answer === 'yes') {
|
|
150
|
+
createSkill();
|
|
151
|
+
log(' ✓ Ramadan skill added to ~/.claude/skills/');
|
|
152
|
+
log('');
|
|
153
|
+
log(' Type "ramadan" or "/ramadan" in Claude Code to use it.');
|
|
156
154
|
} else {
|
|
157
|
-
|
|
158
|
-
mkdirSync(skillsDir, { recursive: true });
|
|
159
|
-
console.log(' ✓ Created ~/.claude/skills/');
|
|
160
|
-
}
|
|
161
|
-
if (!existsSync(ramadanSkillDir)) {
|
|
162
|
-
mkdirSync(ramadanSkillDir, { recursive: true });
|
|
163
|
-
}
|
|
164
|
-
writeFileSync(ramadanSkillFile, RAMADAN_SKILL);
|
|
165
|
-
console.log(' ✓ Created ramadan skill — type `/ramadan` in Claude Code');
|
|
155
|
+
log(' Skipped. Run `npm rebuild ramadan-cal` or type `ramadan` directly in your terminal.');
|
|
166
156
|
}
|
|
167
157
|
}
|
|
168
158
|
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Handle non-interactive environments (CI, piped input)
|
|
173
|
-
if (!process.stdin.isTTY) {
|
|
174
|
-
console.log('');
|
|
175
|
-
console.log(' 🌙 Ramadan CLI installed successfully!');
|
|
176
|
-
console.log(' Run `ramadan` to get started.');
|
|
177
|
-
console.log(' Run `npm rebuild ramadan-cal` in an interactive terminal to set up Claude Code.\n');
|
|
178
|
-
process.exit(0);
|
|
159
|
+
log('');
|
|
179
160
|
}
|
|
180
161
|
|
|
181
162
|
main().catch(() => {
|
|
182
|
-
// Non-fatal — never block the install
|
|
183
163
|
process.exit(0);
|
|
184
164
|
});
|