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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ramadan-cal",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "🌙 A beautiful terminal Ramadan calendar with prayer times, daily progress, and Hijri date",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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
- const content = readFileSync(claudeMd, 'utf-8');
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
- const content = readFileSync(ramadanSkillFile, 'utf-8');
63
- return content.includes(SKILL_MARKER);
60
+ return readFileSync(ramadanSkillFile, 'utf-8').includes(SKILL_MARKER);
64
61
  }
65
62
 
66
- function isConflictingSkill() {
67
- if (!existsSync(ramadanSkillFile)) return false;
68
- const content = readFileSync(ramadanSkillFile, 'utf-8');
69
- return !content.includes(SKILL_MARKER);
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
- console.log('');
84
- console.log(' 🌙 Ramadan CLI installed successfully!');
85
- console.log(' Run `ramadan` to get started.');
86
- console.log('');
87
-
88
- const claudeMdConfigured = isClaudeMdConfigured();
89
- const skillInstalled = isSkillInstalled();
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
- const claudeInstalled = isClaudeInstalled();
99
-
100
- if (!claudeInstalled) {
101
- const answer = await ask(' Do you use Claude Code? (y/n) ');
102
-
103
- if (answer !== 'y' && answer !== 'yes') {
104
- console.log(' ✓ Skipping Claude Code setup. You\'re all set!\n');
105
- return;
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
- // They use Claude Code but it's not on PATH
109
- console.log(' ℹ Claude Code wasn\'t detected on your PATH.');
112
+ log(' ✓ Claude Code detected');
113
+ log('');
110
114
 
111
- const proceed = await ask(' Set up the integration anyway? (y/n) ');
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
- if (proceed !== 'y' && proceed !== 'yes') {
114
- console.log(' ✓ No worries — run `npm rebuild ramadan-cal` anytime to set it up later.\n');
115
- return;
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
- console.log(' ✓ Claude Code detected');
119
-
120
- const answer = await ask(' Set up Claude Code integration? Type `ramadan` or `/ramadan` in Claude Code. (y/n) ');
121
-
122
- if (answer !== 'y' && answer !== 'yes') {
123
- console.log(' ✓ Skipped. Run `npm rebuild ramadan-cal` anytime to set it up later.\n');
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
- // Create skills directory and ramadan skill
146
- if (!skillInstalled) {
147
- if (isConflictingSkill()) {
148
- console.log(' ⚠ ~/.claude/skills/ramadan/SKILL.md already exists (not created by this package).');
149
- const overwrite = await ask(' Overwrite it? (y/n) ');
150
- if (overwrite !== 'y' && overwrite !== 'yes') {
151
- console.log(' Skipped skill creation. You can add it manually later.');
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
- if (!existsSync(skillsDir)) {
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
- console.log(' ✓ Done! Type "ramadan" or "/ramadan" inside Claude Code.\n');
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
  });