prjct-cli 0.4.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/CHANGELOG.md +312 -0
- package/CLAUDE.md +300 -0
- package/LICENSE +21 -0
- package/README.md +424 -0
- package/bin/prjct +214 -0
- package/core/agent-detector.js +249 -0
- package/core/agents/claude-agent.js +250 -0
- package/core/agents/codex-agent.js +256 -0
- package/core/agents/terminal-agent.js +465 -0
- package/core/analyzer.js +596 -0
- package/core/animations-simple.js +240 -0
- package/core/animations.js +277 -0
- package/core/author-detector.js +218 -0
- package/core/capability-installer.js +190 -0
- package/core/command-installer.js +775 -0
- package/core/commands.js +2050 -0
- package/core/config-manager.js +335 -0
- package/core/migrator.js +784 -0
- package/core/path-manager.js +324 -0
- package/core/project-capabilities.js +144 -0
- package/core/session-manager.js +439 -0
- package/core/version.js +107 -0
- package/core/workflow-engine.js +213 -0
- package/core/workflow-prompts.js +192 -0
- package/core/workflow-rules.js +147 -0
- package/package.json +80 -0
- package/scripts/install.sh +433 -0
- package/scripts/verify-installation.sh +158 -0
- package/templates/agents/AGENTS.md +164 -0
- package/templates/commands/analyze.md +125 -0
- package/templates/commands/cleanup.md +102 -0
- package/templates/commands/context.md +105 -0
- package/templates/commands/design.md +113 -0
- package/templates/commands/done.md +44 -0
- package/templates/commands/fix.md +87 -0
- package/templates/commands/git.md +79 -0
- package/templates/commands/help.md +72 -0
- package/templates/commands/idea.md +50 -0
- package/templates/commands/init.md +237 -0
- package/templates/commands/next.md +74 -0
- package/templates/commands/now.md +35 -0
- package/templates/commands/progress.md +92 -0
- package/templates/commands/recap.md +86 -0
- package/templates/commands/roadmap.md +107 -0
- package/templates/commands/ship.md +41 -0
- package/templates/commands/stuck.md +48 -0
- package/templates/commands/task.md +97 -0
- package/templates/commands/test.md +94 -0
- package/templates/commands/workflow.md +224 -0
- package/templates/examples/natural-language-examples.md +320 -0
- package/templates/mcp-config.json +8 -0
- package/templates/workflows/analyze.md +159 -0
- package/templates/workflows/cleanup.md +73 -0
- package/templates/workflows/context.md +72 -0
- package/templates/workflows/design.md +88 -0
- package/templates/workflows/done.md +20 -0
- package/templates/workflows/fix.md +201 -0
- package/templates/workflows/git.md +192 -0
- package/templates/workflows/help.md +13 -0
- package/templates/workflows/idea.md +22 -0
- package/templates/workflows/init.md +80 -0
- package/templates/workflows/natural-language-handler.md +183 -0
- package/templates/workflows/next.md +44 -0
- package/templates/workflows/now.md +19 -0
- package/templates/workflows/progress.md +113 -0
- package/templates/workflows/recap.md +66 -0
- package/templates/workflows/roadmap.md +95 -0
- package/templates/workflows/ship.md +18 -0
- package/templates/workflows/stuck.md +25 -0
- package/templates/workflows/task.md +109 -0
- package/templates/workflows/test.md +243 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# prjct/cli - Turn ideas into AI-ready roadmaps
|
|
4
|
+
# Usage: curl -fsSL https://prjct.app/install.sh | bash
|
|
5
|
+
# Options:
|
|
6
|
+
# --force Force reinstall even if up to date
|
|
7
|
+
# --dev Install from development branch
|
|
8
|
+
# --silent Silent mode (no interactive prompts)
|
|
9
|
+
# -y, --yes Auto-accept all prompts
|
|
10
|
+
# --help, -h Show this help message
|
|
11
|
+
|
|
12
|
+
set -e
|
|
13
|
+
|
|
14
|
+
# Show help if requested
|
|
15
|
+
show_help() {
|
|
16
|
+
echo "prjct/cli installer"
|
|
17
|
+
echo ""
|
|
18
|
+
echo "Usage:"
|
|
19
|
+
echo " curl -fsSL https://prjct.app/install.sh | bash [OPTIONS]"
|
|
20
|
+
echo " bash install.sh [OPTIONS]"
|
|
21
|
+
echo ""
|
|
22
|
+
echo "Options:"
|
|
23
|
+
echo " --force Force reinstall even if up to date"
|
|
24
|
+
echo " --dev Install from development branch"
|
|
25
|
+
echo " --silent Silent mode (minimal output)"
|
|
26
|
+
echo " -y, --yes Auto-accept all prompts"
|
|
27
|
+
echo " --help, -h Show this help message"
|
|
28
|
+
echo ""
|
|
29
|
+
echo "Examples:"
|
|
30
|
+
echo " # Normal installation"
|
|
31
|
+
echo " curl -fsSL https://prjct.app/install.sh | bash"
|
|
32
|
+
echo ""
|
|
33
|
+
echo " # Force reinstall"
|
|
34
|
+
echo " curl -fsSL https://prjct.app/install.sh | bash -s -- --force"
|
|
35
|
+
echo ""
|
|
36
|
+
echo " # Auto-accept all prompts"
|
|
37
|
+
echo " curl -fsSL https://prjct.app/install.sh | bash -s -- -y"
|
|
38
|
+
exit 0
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# Parse arguments
|
|
42
|
+
FORCE_INSTALL=false
|
|
43
|
+
DEV_MODE=false
|
|
44
|
+
SILENT_MODE=false
|
|
45
|
+
AUTO_ACCEPT=false
|
|
46
|
+
|
|
47
|
+
for arg in "$@"; do
|
|
48
|
+
case $arg in
|
|
49
|
+
--help|-h)
|
|
50
|
+
show_help
|
|
51
|
+
;;
|
|
52
|
+
--force)
|
|
53
|
+
FORCE_INSTALL=true
|
|
54
|
+
shift
|
|
55
|
+
;;
|
|
56
|
+
--dev)
|
|
57
|
+
DEV_MODE=true
|
|
58
|
+
shift
|
|
59
|
+
;;
|
|
60
|
+
--silent)
|
|
61
|
+
SILENT_MODE=true
|
|
62
|
+
shift
|
|
63
|
+
;;
|
|
64
|
+
-y|--yes)
|
|
65
|
+
AUTO_ACCEPT=true
|
|
66
|
+
shift
|
|
67
|
+
;;
|
|
68
|
+
*)
|
|
69
|
+
;;
|
|
70
|
+
esac
|
|
71
|
+
done
|
|
72
|
+
|
|
73
|
+
# Detect if being run in a pipe
|
|
74
|
+
if [ ! -t 0 ]; then
|
|
75
|
+
AUTO_ACCEPT=true
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# Colors and formatting
|
|
79
|
+
RED='\033[0;31m'
|
|
80
|
+
GREEN='\033[0;32m'
|
|
81
|
+
YELLOW='\033[1;33m'
|
|
82
|
+
BLUE='\033[0;34m'
|
|
83
|
+
MAGENTA='\033[0;35m'
|
|
84
|
+
CYAN='\033[0;36m'
|
|
85
|
+
WHITE='\033[1;37m'
|
|
86
|
+
NC='\033[0m'
|
|
87
|
+
BOLD='\033[1m'
|
|
88
|
+
DIM='\033[2m'
|
|
89
|
+
|
|
90
|
+
# Unicode characters
|
|
91
|
+
CHECK="โ"
|
|
92
|
+
CROSS="โ"
|
|
93
|
+
ARROW="โธ"
|
|
94
|
+
DOT="โข"
|
|
95
|
+
|
|
96
|
+
# Clear for clean experience
|
|
97
|
+
clear
|
|
98
|
+
|
|
99
|
+
# Clean header with Catppuccin colors
|
|
100
|
+
echo ""
|
|
101
|
+
echo ""
|
|
102
|
+
echo -e " ${BOLD}${CYAN}(๏พโใฎโ)๏พ*:๏ฝฅ๏พโง${NC}"
|
|
103
|
+
echo -e " ${BOLD}${CYAN}โโโโโโโ โโโโโโโ โโโ โโโโโโโโโโโโโโโโ${NC}"
|
|
104
|
+
echo -e " ${BOLD}${CYAN}โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ${NC}"
|
|
105
|
+
echo -e " ${BOLD}${CYAN}โโโโโโโโโโโโโโโโ โโโโโโ โโโ${NC}"
|
|
106
|
+
echo -e " ${BOLD}${CYAN}โโโโโโโ โโโโโโโโโโ โโโโโโ โโโ${NC}"
|
|
107
|
+
echo -e " ${BOLD}${CYAN}โโโ โโโ โโโโโโโโโโโโโโโโโโโ โโโ${NC}"
|
|
108
|
+
echo -e " ${BOLD}${CYAN}โโโ โโโ โโโ โโโโโโ โโโโโโโ โโโ${NC}"
|
|
109
|
+
echo -e " ${BOLD}${CYAN}prjct${NC}${MAGENTA}/${NC}${GREEN}cli${NC} ${DIM}${WHITE}v0.3.1${NC}"
|
|
110
|
+
echo ""
|
|
111
|
+
echo -e " ${DIM}Turn ideas into AI-ready roadmaps${NC}"
|
|
112
|
+
echo ""
|
|
113
|
+
echo -e " ${YELLOW}โก${NC} Ship faster with zero friction"
|
|
114
|
+
echo -e " ${GREEN}๐${NC} From idea to technical tasks in minutes"
|
|
115
|
+
echo -e " ${BLUE}๐ค${NC} Perfect context for AI agents"
|
|
116
|
+
echo ""
|
|
117
|
+
echo ""
|
|
118
|
+
|
|
119
|
+
# Spinner function
|
|
120
|
+
spin() {
|
|
121
|
+
local pid=$1
|
|
122
|
+
local delay=0.1
|
|
123
|
+
local spinstr='โ โ โ นโ ธโ ผโ ดโ ฆโ งโ โ '
|
|
124
|
+
while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
|
|
125
|
+
local temp=${spinstr#?}
|
|
126
|
+
printf " [%c] " "$spinstr"
|
|
127
|
+
local spinstr=$temp${spinstr%"$temp"}
|
|
128
|
+
sleep $delay
|
|
129
|
+
printf "\b\b\b\b\b\b"
|
|
130
|
+
done
|
|
131
|
+
printf " \b\b\b\b"
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
# Step counter
|
|
135
|
+
STEP=1
|
|
136
|
+
TOTAL_STEPS=5
|
|
137
|
+
|
|
138
|
+
print_step() {
|
|
139
|
+
echo -e "\n${BOLD}${CYAN}[$STEP/$TOTAL_STEPS]${NC} ${BOLD}$1${NC}"
|
|
140
|
+
((STEP++))
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
# Installation directory
|
|
144
|
+
INSTALL_DIR="$HOME/.prjct-cli"
|
|
145
|
+
|
|
146
|
+
# Version check function
|
|
147
|
+
get_version() {
|
|
148
|
+
if [ -f "$1/package.json" ]; then
|
|
149
|
+
grep -o '"version":[[:space:]]*"[^"]*"' "$1/package.json" | head -1 | cut -d'"' -f4
|
|
150
|
+
else
|
|
151
|
+
echo "unknown"
|
|
152
|
+
fi
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# Check prerequisites
|
|
156
|
+
print_step "Checking prerequisites"
|
|
157
|
+
|
|
158
|
+
# Check Node.js
|
|
159
|
+
printf " ${ARROW} Checking Node.js..."
|
|
160
|
+
if ! command -v node &> /dev/null; then
|
|
161
|
+
echo -e " ${RED}${CROSS}${NC}"
|
|
162
|
+
echo -e "\n ${RED}Node.js is required but not installed.${NC}"
|
|
163
|
+
echo -e " Install from: ${CYAN}https://nodejs.org${NC}"
|
|
164
|
+
exit 1
|
|
165
|
+
fi
|
|
166
|
+
|
|
167
|
+
NODE_VERSION=$(node --version | cut -d'v' -f2 | cut -d'.' -f1)
|
|
168
|
+
if [ "$NODE_VERSION" -lt 18 ]; then
|
|
169
|
+
echo -e " ${RED}${CROSS}${NC}"
|
|
170
|
+
echo -e "\n ${RED}Node.js 18+ is required (found v$NODE_VERSION)${NC}"
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
echo -e " ${GREEN}${CHECK}${NC} $(node --version)"
|
|
174
|
+
|
|
175
|
+
# Check Git
|
|
176
|
+
printf " ${ARROW} Checking Git..."
|
|
177
|
+
if ! command -v git &> /dev/null; then
|
|
178
|
+
echo -e " ${RED}${CROSS}${NC}"
|
|
179
|
+
echo -e "\n ${RED}Git is required but not installed.${NC}"
|
|
180
|
+
echo -e " Install from: ${CYAN}https://git-scm.com${NC}"
|
|
181
|
+
exit 1
|
|
182
|
+
fi
|
|
183
|
+
echo -e " ${GREEN}${CHECK}${NC} $(git --version | cut -d' ' -f3)"
|
|
184
|
+
|
|
185
|
+
# Clone or update repository
|
|
186
|
+
print_step "Downloading prjct/cli"
|
|
187
|
+
|
|
188
|
+
if [ -d "$INSTALL_DIR" ]; then
|
|
189
|
+
# Check current version
|
|
190
|
+
CURRENT_VERSION=$(get_version "$INSTALL_DIR")
|
|
191
|
+
printf " ${ARROW} Found existing installation"
|
|
192
|
+
echo -e " ${DIM}(v${CURRENT_VERSION})${NC}"
|
|
193
|
+
|
|
194
|
+
# Fetch latest version from remote
|
|
195
|
+
printf " ${ARROW} Checking for updates..."
|
|
196
|
+
cd "$INSTALL_DIR"
|
|
197
|
+
git fetch origin main --quiet > /dev/null 2>&1
|
|
198
|
+
|
|
199
|
+
# Get remote version
|
|
200
|
+
TEMP_DIR=$(mktemp -d)
|
|
201
|
+
git show origin/main:package.json > "$TEMP_DIR/package.json" 2>/dev/null
|
|
202
|
+
REMOTE_VERSION=$(get_version "$TEMP_DIR")
|
|
203
|
+
rm -rf "$TEMP_DIR"
|
|
204
|
+
|
|
205
|
+
if [ "$CURRENT_VERSION" = "$REMOTE_VERSION" ] && [ "$FORCE_INSTALL" = false ]; then
|
|
206
|
+
echo -e " ${GREEN}${CHECK}${NC} Already up to date (v${CURRENT_VERSION})"
|
|
207
|
+
|
|
208
|
+
# Ask if they want to reinstall anyway
|
|
209
|
+
if [ "$AUTO_ACCEPT" = false ]; then
|
|
210
|
+
echo ""
|
|
211
|
+
read -p " Do you want to reinstall anyway? (y/N): " -n 1 -r
|
|
212
|
+
echo ""
|
|
213
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
214
|
+
echo -e "\n${GREEN}โจ You're all set! Happy shipping! ๐${NC}"
|
|
215
|
+
exit 0
|
|
216
|
+
fi
|
|
217
|
+
else
|
|
218
|
+
echo -e "\n${GREEN}โจ You're all set! Happy shipping! ๐${NC}"
|
|
219
|
+
exit 0
|
|
220
|
+
fi
|
|
221
|
+
elif [ "$CURRENT_VERSION" = "$REMOTE_VERSION" ] && [ "$FORCE_INSTALL" = true ]; then
|
|
222
|
+
echo -e " ${YELLOW}!${NC} Force reinstalling (v${CURRENT_VERSION})"
|
|
223
|
+
else
|
|
224
|
+
echo -e " ${YELLOW}Update available!${NC}"
|
|
225
|
+
echo -e " Current: v${CURRENT_VERSION}"
|
|
226
|
+
echo -e " Latest: v${REMOTE_VERSION}"
|
|
227
|
+
|
|
228
|
+
if [ "$AUTO_ACCEPT" = false ]; then
|
|
229
|
+
echo ""
|
|
230
|
+
read -p " Update to v${REMOTE_VERSION}? (Y/n): " -n 1 -r
|
|
231
|
+
echo ""
|
|
232
|
+
if [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
233
|
+
echo -e "\n${YELLOW}Update cancelled.${NC}"
|
|
234
|
+
exit 0
|
|
235
|
+
fi
|
|
236
|
+
else
|
|
237
|
+
echo -e " ${DIM}Auto-updating...${NC}"
|
|
238
|
+
fi
|
|
239
|
+
fi
|
|
240
|
+
|
|
241
|
+
# Perform update
|
|
242
|
+
printf " ${ARROW} Updating prjct/cli"
|
|
243
|
+
(
|
|
244
|
+
git pull origin main --quiet > /dev/null 2>&1
|
|
245
|
+
) &
|
|
246
|
+
spin $!
|
|
247
|
+
echo -e " ${GREEN}${CHECK}${NC} Updated to v${REMOTE_VERSION}"
|
|
248
|
+
else
|
|
249
|
+
printf " ${ARROW} Cloning repository"
|
|
250
|
+
(
|
|
251
|
+
git clone https://github.com/jlopezlira/prjct-cli.git "$INSTALL_DIR" --quiet > /dev/null 2>&1
|
|
252
|
+
) &
|
|
253
|
+
spin $!
|
|
254
|
+
|
|
255
|
+
# Get installed version
|
|
256
|
+
NEW_VERSION=$(get_version "$INSTALL_DIR")
|
|
257
|
+
echo -e " ${GREEN}${CHECK}${NC} Installed v${NEW_VERSION}"
|
|
258
|
+
cd "$INSTALL_DIR"
|
|
259
|
+
fi
|
|
260
|
+
|
|
261
|
+
# Run setup script
|
|
262
|
+
print_step "Running setup"
|
|
263
|
+
|
|
264
|
+
printf " ${ARROW} Installing components"
|
|
265
|
+
chmod +x scripts/setup.sh
|
|
266
|
+
[ -f scripts/interactive-install.js ] && chmod +x scripts/interactive-install.js
|
|
267
|
+
(
|
|
268
|
+
./scripts/setup.sh > /tmp/prjct-setup.log 2>&1
|
|
269
|
+
) &
|
|
270
|
+
spin $!
|
|
271
|
+
|
|
272
|
+
if [ $? -eq 0 ]; then
|
|
273
|
+
echo -e " ${GREEN}${CHECK}${NC}"
|
|
274
|
+
else
|
|
275
|
+
echo -e " ${RED}${CROSS}${NC}"
|
|
276
|
+
echo -e "\n ${RED}Setup failed. Check /tmp/prjct-setup.log for details${NC}"
|
|
277
|
+
exit 1
|
|
278
|
+
fi
|
|
279
|
+
|
|
280
|
+
# Install commands to AI editors
|
|
281
|
+
print_step "Configuring AI platforms"
|
|
282
|
+
|
|
283
|
+
cd "$INSTALL_DIR"
|
|
284
|
+
|
|
285
|
+
# Check if we should use interactive mode
|
|
286
|
+
if [ "$AUTO_ACCEPT" = false ]; then
|
|
287
|
+
# Interactive mode: Let user select editors
|
|
288
|
+
printf " ${ARROW} Launching interactive editor selection...\n"
|
|
289
|
+
|
|
290
|
+
# Run interactive installer with Node.js
|
|
291
|
+
INSTALL_OUTPUT=$(node scripts/interactive-install.js 2>&1)
|
|
292
|
+
INSTALL_EXIT=$?
|
|
293
|
+
|
|
294
|
+
if [ $INSTALL_EXIT -eq 0 ]; then
|
|
295
|
+
# Parse JSON result from between markers
|
|
296
|
+
RESULT_JSON=$(echo "$INSTALL_OUTPUT" | sed -n '/__RESULT_START__/,/__RESULT_END__/p' | grep -v '__RESULT_')
|
|
297
|
+
|
|
298
|
+
# Extract summary info
|
|
299
|
+
EDITORS_INSTALLED=$(echo "$RESULT_JSON" | grep -o '"editors":\s*\[[^]]*\]' | sed 's/"editors":\s*\[\(.*\)\]/\1/' | tr -d '"' | tr ',' ' ')
|
|
300
|
+
TOTAL_INSTALLED=$(echo "$RESULT_JSON" | grep -o '"totalInstalled":\s*[0-9]*' | grep -o '[0-9]*')
|
|
301
|
+
|
|
302
|
+
echo ""
|
|
303
|
+
echo -e " ${GREEN}${CHECK}${NC} Commands installed successfully!"
|
|
304
|
+
echo -e " ${GREEN}๐ฆ${NC} Editors: ${CYAN}${EDITORS_INSTALLED}${NC}"
|
|
305
|
+
echo -e " ${GREEN}๐${NC} Commands: ${CYAN}${TOTAL_INSTALLED}${NC}"
|
|
306
|
+
else
|
|
307
|
+
echo -e " ${RED}${CROSS}${NC} Installation failed"
|
|
308
|
+
echo "$INSTALL_OUTPUT" | grep -v '__RESULT_'
|
|
309
|
+
exit 1
|
|
310
|
+
fi
|
|
311
|
+
else
|
|
312
|
+
# Non-interactive mode: Install to all detected editors
|
|
313
|
+
printf " ${ARROW} Auto-installing to all detected editors...\n"
|
|
314
|
+
|
|
315
|
+
INSTALL_RESULT=$(node -e "
|
|
316
|
+
const installer = require('./core/command-installer');
|
|
317
|
+
installer.installToAll(false).then(result => {
|
|
318
|
+
console.log('__RESULT_START__');
|
|
319
|
+
console.log(JSON.stringify(result));
|
|
320
|
+
console.log('__RESULT_END__');
|
|
321
|
+
process.exit(result.success ? 0 : 1);
|
|
322
|
+
}).catch(err => {
|
|
323
|
+
console.error(err.message);
|
|
324
|
+
process.exit(1);
|
|
325
|
+
});
|
|
326
|
+
" 2>&1)
|
|
327
|
+
|
|
328
|
+
INSTALL_EXIT=$?
|
|
329
|
+
|
|
330
|
+
if [ $INSTALL_EXIT -eq 0 ]; then
|
|
331
|
+
# Parse result
|
|
332
|
+
RESULT_JSON=$(echo "$INSTALL_RESULT" | sed -n '/__RESULT_START__/,/__RESULT_END__/p' | grep -v '__RESULT_')
|
|
333
|
+
EDITORS_INSTALLED=$(echo "$RESULT_JSON" | grep -o '"editors":\s*\[[^]]*\]' | sed 's/"editors":\s*\[\(.*\)\]/\1/' | tr -d '"' | tr ',' ' ')
|
|
334
|
+
TOTAL_INSTALLED=$(echo "$RESULT_JSON" | grep -o '"totalInstalled":\s*[0-9]*' | grep -o '[0-9]*')
|
|
335
|
+
|
|
336
|
+
echo -e " ${GREEN}${CHECK}${NC} Installed to: ${CYAN}${EDITORS_INSTALLED}${NC}"
|
|
337
|
+
echo -e " ${GREEN}๐${NC} Commands: ${CYAN}${TOTAL_INSTALLED}${NC}"
|
|
338
|
+
else
|
|
339
|
+
echo -e " ${RED}${CROSS}${NC} Auto-installation failed"
|
|
340
|
+
echo "$INSTALL_RESULT"
|
|
341
|
+
fi
|
|
342
|
+
fi
|
|
343
|
+
|
|
344
|
+
# Configure PATH
|
|
345
|
+
print_step "Setting up environment"
|
|
346
|
+
|
|
347
|
+
# Detect shell
|
|
348
|
+
printf " ${ARROW} Configuring shell..."
|
|
349
|
+
if [ -n "$ZSH_VERSION" ]; then
|
|
350
|
+
SHELL_CONFIG="$HOME/.zshrc"
|
|
351
|
+
SHELL_NAME="zsh"
|
|
352
|
+
elif [ -n "$BASH_VERSION" ]; then
|
|
353
|
+
SHELL_CONFIG="$HOME/.bashrc"
|
|
354
|
+
SHELL_NAME="bash"
|
|
355
|
+
else
|
|
356
|
+
SHELL_CONFIG="$HOME/.profile"
|
|
357
|
+
SHELL_NAME="sh"
|
|
358
|
+
fi
|
|
359
|
+
|
|
360
|
+
# Add to PATH
|
|
361
|
+
if ! grep -q "prjct-cli/bin" "$SHELL_CONFIG" 2>/dev/null; then
|
|
362
|
+
echo "" >> "$SHELL_CONFIG"
|
|
363
|
+
echo "# prjct/cli" >> "$SHELL_CONFIG"
|
|
364
|
+
echo "export PATH=\"\$HOME/.prjct-cli/bin:\$PATH\"" >> "$SHELL_CONFIG"
|
|
365
|
+
echo -e " ${GREEN}${CHECK}${NC} ($SHELL_NAME)"
|
|
366
|
+
else
|
|
367
|
+
echo -e " ${GREEN}${CHECK}${NC} (already configured)"
|
|
368
|
+
fi
|
|
369
|
+
|
|
370
|
+
# Create symlink
|
|
371
|
+
mkdir -p "$HOME/.local/bin"
|
|
372
|
+
ln -sf "$INSTALL_DIR/bin/prjct" "$HOME/.local/bin/prjct" 2>/dev/null || true
|
|
373
|
+
|
|
374
|
+
# Get final installed version for display
|
|
375
|
+
FINAL_VERSION=$(get_version "$INSTALL_DIR")
|
|
376
|
+
|
|
377
|
+
# Success message - clean style
|
|
378
|
+
echo ""
|
|
379
|
+
echo ""
|
|
380
|
+
echo -e " ${GREEN}โ
${NC} ${BOLD}Installation Complete!${NC} ${GREEN}๐${NC}"
|
|
381
|
+
echo ""
|
|
382
|
+
echo -e " ${BOLD}${CYAN}โโโโโโโ โโโโโโโ โโโ โโโโโโโโโโโโโโโโ${NC}"
|
|
383
|
+
echo -e " ${BOLD}${CYAN}โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ${NC}"
|
|
384
|
+
echo -e " ${BOLD}${CYAN}โโโโโโโโโโโโโโโโ โโโโโโ โโโ${NC}"
|
|
385
|
+
echo -e " ${BOLD}${CYAN}โโโโโโโ โโโโโโโโโโ โโโโโโ โโโ${NC}"
|
|
386
|
+
echo -e " ${BOLD}${CYAN}โโโ โโโ โโโโโโโโโโโโโโโโโโโ โโโ${NC}"
|
|
387
|
+
echo -e " ${BOLD}${CYAN}โโโ โโโ โโโ โโโโโโ โโโโโโโ โโโ${NC}"
|
|
388
|
+
echo ""
|
|
389
|
+
echo -e " ${BOLD}${CYAN}prjct${NC}${MAGENTA}/${NC}${GREEN}cli${NC} ${DIM}${WHITE}v${FINAL_VERSION} installed${NC}"
|
|
390
|
+
echo ""
|
|
391
|
+
|
|
392
|
+
# Quick start guide
|
|
393
|
+
echo -e "${BOLD}${CYAN}๐ Quick Start${NC}"
|
|
394
|
+
echo -e "${DIM}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${NC}"
|
|
395
|
+
echo ""
|
|
396
|
+
|
|
397
|
+
# Show commands based on detected platforms
|
|
398
|
+
if [ -d "$HOME/.claude" ]; then
|
|
399
|
+
echo -e " ${BOLD}Claude Code Commands:${NC}"
|
|
400
|
+
echo -e " ${GREEN}/p:init${NC} ${DIM}Initialize project${NC}"
|
|
401
|
+
echo -e " ${GREEN}/p:now${NC} ${DIM}Set current task${NC}"
|
|
402
|
+
echo -e " ${GREEN}/p:ship${NC} ${DIM}Ship & celebrate${NC}"
|
|
403
|
+
echo ""
|
|
404
|
+
fi
|
|
405
|
+
|
|
406
|
+
echo -e " ${BOLD}Terminal Commands:${NC}"
|
|
407
|
+
echo -e " ${GREEN}prjct init${NC} ${DIM}Initialize project${NC}"
|
|
408
|
+
echo -e " ${GREEN}prjct now${NC} ${DIM}Set current task${NC}"
|
|
409
|
+
echo -e " ${GREEN}prjct ship${NC} ${DIM}Ship & celebrate${NC}"
|
|
410
|
+
|
|
411
|
+
echo ""
|
|
412
|
+
echo -e "${DIM}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${NC}"
|
|
413
|
+
echo ""
|
|
414
|
+
|
|
415
|
+
# Next steps
|
|
416
|
+
echo -e "${BOLD}${YELLOW}โก Next Steps${NC}"
|
|
417
|
+
echo ""
|
|
418
|
+
echo -e " 1. ${DIM}Reload your terminal:${NC}"
|
|
419
|
+
echo -e " ${CYAN}source $SHELL_CONFIG${NC}"
|
|
420
|
+
echo ""
|
|
421
|
+
echo -e " 2. ${DIM}Initialize your project:${NC}"
|
|
422
|
+
echo -e " ${CYAN}cd your-project && prjct init${NC}"
|
|
423
|
+
echo ""
|
|
424
|
+
echo -e " 3. ${DIM}Start shipping:${NC}"
|
|
425
|
+
echo -e " ${CYAN}prjct now \"build awesome feature\"${NC}"
|
|
426
|
+
echo ""
|
|
427
|
+
echo -e "${DIM}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${NC}"
|
|
428
|
+
echo ""
|
|
429
|
+
echo -e " ${DIM}Documentation:${NC} ${CYAN}https://github.com/jlopezlira/prjct-cli${NC}"
|
|
430
|
+
echo -e " ${DIM}Report issues:${NC} ${CYAN}https://github.com/jlopezlira/prjct-cli/issues${NC}"
|
|
431
|
+
echo ""
|
|
432
|
+
echo -e "${BOLD}${MAGENTA}Happy shipping! ๐${NC}"
|
|
433
|
+
echo ""
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# prjct-cli Installation Verification Script
|
|
4
|
+
|
|
5
|
+
# Colors
|
|
6
|
+
GREEN='\033[0;32m'
|
|
7
|
+
RED='\033[0;31m'
|
|
8
|
+
YELLOW='\033[1;33m'
|
|
9
|
+
BLUE='\033[0;34m'
|
|
10
|
+
NC='\033[0m'
|
|
11
|
+
|
|
12
|
+
echo ""
|
|
13
|
+
echo "๐ prjct-cli Installation Verification"
|
|
14
|
+
echo "======================================="
|
|
15
|
+
echo ""
|
|
16
|
+
|
|
17
|
+
ERRORS=0
|
|
18
|
+
WARNINGS=0
|
|
19
|
+
|
|
20
|
+
# Function to check and report
|
|
21
|
+
check() {
|
|
22
|
+
local description="$1"
|
|
23
|
+
local condition="$2"
|
|
24
|
+
|
|
25
|
+
if eval "$condition"; then
|
|
26
|
+
echo -e "${GREEN}โ
$description${NC}"
|
|
27
|
+
return 0
|
|
28
|
+
else
|
|
29
|
+
echo -e "${RED}โ $description${NC}"
|
|
30
|
+
((ERRORS++))
|
|
31
|
+
return 1
|
|
32
|
+
fi
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
warn_check() {
|
|
36
|
+
local description="$1"
|
|
37
|
+
local condition="$2"
|
|
38
|
+
|
|
39
|
+
if eval "$condition"; then
|
|
40
|
+
echo -e "${GREEN}โ
$description${NC}"
|
|
41
|
+
return 0
|
|
42
|
+
else
|
|
43
|
+
echo -e "${YELLOW}โ ๏ธ $description${NC}"
|
|
44
|
+
((WARNINGS++))
|
|
45
|
+
return 1
|
|
46
|
+
fi
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# 1. Check installation directory
|
|
50
|
+
echo -e "${BLUE}๐ Checking installation...${NC}"
|
|
51
|
+
check "Installation directory exists" "[ -d $HOME/.prjct-cli ]"
|
|
52
|
+
check "Core directory exists" "[ -d $HOME/.prjct-cli/core ]"
|
|
53
|
+
check "Commands directory exists" "[ -d $HOME/.prjct-cli/commands ]"
|
|
54
|
+
check "Templates directory exists" "[ -d $HOME/.prjct-cli/templates ]"
|
|
55
|
+
echo ""
|
|
56
|
+
|
|
57
|
+
# 2. Check executable
|
|
58
|
+
echo -e "${BLUE}๐ง Checking executable...${NC}"
|
|
59
|
+
check "Binary exists" "[ -f $HOME/.prjct-cli/bin/prjct ]"
|
|
60
|
+
check "Binary is executable" "[ -x $HOME/.prjct-cli/bin/prjct ]"
|
|
61
|
+
|
|
62
|
+
# Check if in PATH
|
|
63
|
+
if command -v prjct &> /dev/null; then
|
|
64
|
+
echo -e "${GREEN}โ
prjct command available in PATH${NC}"
|
|
65
|
+
else
|
|
66
|
+
warn_check "prjct command in PATH" "false"
|
|
67
|
+
echo " Try: source ~/.bashrc or source ~/.zshrc"
|
|
68
|
+
fi
|
|
69
|
+
echo ""
|
|
70
|
+
|
|
71
|
+
# 3. Check Claude Code integration
|
|
72
|
+
echo -e "${BLUE}๐ค Checking Claude Code integration...${NC}"
|
|
73
|
+
if [ -d "$HOME/.claude" ]; then
|
|
74
|
+
check "Claude directory detected" "true"
|
|
75
|
+
check "Commands directory exists" "[ -d $HOME/.claude/commands/p ]"
|
|
76
|
+
|
|
77
|
+
# Check individual command files
|
|
78
|
+
for cmd in init now done ship next idea recap progress stuck context; do
|
|
79
|
+
warn_check "Command /p:$cmd installed" "[ -f $HOME/.claude/commands/p/$cmd.md ]"
|
|
80
|
+
done
|
|
81
|
+
|
|
82
|
+
# Check if commands are readable by Claude
|
|
83
|
+
if [ -f "$HOME/.claude/commands/p/init.md" ]; then
|
|
84
|
+
if grep -q "allowed-tools:" "$HOME/.claude/commands/p/init.md"; then
|
|
85
|
+
echo -e "${GREEN}โ
Commands have correct format${NC}"
|
|
86
|
+
else
|
|
87
|
+
echo -e "${YELLOW}โ ๏ธ Commands may have incorrect format${NC}"
|
|
88
|
+
((WARNINGS++))
|
|
89
|
+
fi
|
|
90
|
+
fi
|
|
91
|
+
else
|
|
92
|
+
echo -e "${YELLOW}โ ๏ธ Claude Code not detected${NC}"
|
|
93
|
+
((WARNINGS++))
|
|
94
|
+
fi
|
|
95
|
+
echo ""
|
|
96
|
+
|
|
97
|
+
# 4. Check Node.js dependencies
|
|
98
|
+
echo -e "${BLUE}๐ฆ Checking dependencies...${NC}"
|
|
99
|
+
check "node_modules exists" "[ -d $HOME/.prjct-cli/node_modules ]"
|
|
100
|
+
check "package.json exists" "[ -f $HOME/.prjct-cli/package.json ]"
|
|
101
|
+
|
|
102
|
+
# Check specific dependencies
|
|
103
|
+
if [ -d "$HOME/.prjct-cli/node_modules" ]; then
|
|
104
|
+
warn_check "commander installed" "[ -d $HOME/.prjct-cli/node_modules/commander ]"
|
|
105
|
+
warn_check "chalk installed" "[ -d $HOME/.prjct-cli/node_modules/chalk ]"
|
|
106
|
+
warn_check "ora installed" "[ -d $HOME/.prjct-cli/node_modules/ora ]"
|
|
107
|
+
fi
|
|
108
|
+
echo ""
|
|
109
|
+
|
|
110
|
+
# 5. Test basic functionality
|
|
111
|
+
echo -e "${BLUE}๐งช Testing functionality...${NC}"
|
|
112
|
+
cd /tmp
|
|
113
|
+
rm -rf .prjct 2>/dev/null
|
|
114
|
+
|
|
115
|
+
# Test prjct command if available
|
|
116
|
+
if command -v prjct &> /dev/null; then
|
|
117
|
+
# Try to run help
|
|
118
|
+
if prjct 2>&1 | grep -q "Available commands"; then
|
|
119
|
+
echo -e "${GREEN}โ
prjct command works${NC}"
|
|
120
|
+
else
|
|
121
|
+
echo -e "${RED}โ prjct command not working properly${NC}"
|
|
122
|
+
((ERRORS++))
|
|
123
|
+
fi
|
|
124
|
+
else
|
|
125
|
+
echo -e "${YELLOW}โ ๏ธ Cannot test prjct command (not in PATH)${NC}"
|
|
126
|
+
((WARNINGS++))
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
# Test direct execution
|
|
130
|
+
if $HOME/.prjct-cli/bin/prjct 2>&1 | grep -q "Available commands"; then
|
|
131
|
+
echo -e "${GREEN}โ
Direct execution works${NC}"
|
|
132
|
+
else
|
|
133
|
+
echo -e "${RED}โ Direct execution not working${NC}"
|
|
134
|
+
((ERRORS++))
|
|
135
|
+
fi
|
|
136
|
+
echo ""
|
|
137
|
+
|
|
138
|
+
# Summary
|
|
139
|
+
echo "======================================="
|
|
140
|
+
if [ $ERRORS -eq 0 ]; then
|
|
141
|
+
if [ $WARNINGS -eq 0 ]; then
|
|
142
|
+
echo -e "${GREEN}๐ All checks passed! prjct-cli is ready to use.${NC}"
|
|
143
|
+
echo ""
|
|
144
|
+
echo "Try these commands:"
|
|
145
|
+
echo " In Claude Code: /p:init"
|
|
146
|
+
echo " In Terminal: prjct init"
|
|
147
|
+
else
|
|
148
|
+
echo -e "${GREEN}โ
Installation successful with $WARNINGS warnings.${NC}"
|
|
149
|
+
echo ""
|
|
150
|
+
echo "Some features may need attention, but prjct-cli should work."
|
|
151
|
+
fi
|
|
152
|
+
else
|
|
153
|
+
echo -e "${RED}โ Installation has $ERRORS errors and $WARNINGS warnings.${NC}"
|
|
154
|
+
echo ""
|
|
155
|
+
echo "Please run the installer again:"
|
|
156
|
+
echo " cd ~/.prjct-cli && ./setup.sh"
|
|
157
|
+
fi
|
|
158
|
+
echo ""
|