@juangadm/pre-post 0.1.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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/dist/bin/cli.d.ts +3 -0
  4. package/dist/bin/cli.d.ts.map +1 -0
  5. package/dist/bin/cli.js +388 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/browser.d.ts +25 -0
  8. package/dist/browser.d.ts.map +1 -0
  9. package/dist/browser.js +82 -0
  10. package/dist/browser.js.map +1 -0
  11. package/dist/capture.d.ts +9 -0
  12. package/dist/capture.d.ts.map +1 -0
  13. package/dist/capture.js +52 -0
  14. package/dist/capture.js.map +1 -0
  15. package/dist/clipboard.d.ts +9 -0
  16. package/dist/clipboard.d.ts.map +1 -0
  17. package/dist/clipboard.js +26 -0
  18. package/dist/clipboard.js.map +1 -0
  19. package/dist/filename.d.ts +24 -0
  20. package/dist/filename.d.ts.map +1 -0
  21. package/dist/filename.js +76 -0
  22. package/dist/filename.js.map +1 -0
  23. package/dist/index.d.ts +25 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +69 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/routes/generic.d.ts +11 -0
  28. package/dist/routes/generic.d.ts.map +1 -0
  29. package/dist/routes/generic.js +106 -0
  30. package/dist/routes/generic.js.map +1 -0
  31. package/dist/routes/nextjs.d.ts +14 -0
  32. package/dist/routes/nextjs.d.ts.map +1 -0
  33. package/dist/routes/nextjs.js +196 -0
  34. package/dist/routes/nextjs.js.map +1 -0
  35. package/dist/routes.d.ts +21 -0
  36. package/dist/routes.d.ts.map +1 -0
  37. package/dist/routes.js +174 -0
  38. package/dist/routes.js.map +1 -0
  39. package/dist/types.d.ts +98 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +9 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/upload.d.ts +35 -0
  44. package/dist/upload.d.ts.map +1 -0
  45. package/dist/upload.js +116 -0
  46. package/dist/upload.js.map +1 -0
  47. package/dist/viewport.d.ts +3 -0
  48. package/dist/viewport.d.ts.map +1 -0
  49. package/dist/viewport.js +11 -0
  50. package/dist/viewport.js.map +1 -0
  51. package/package.json +66 -0
  52. package/skill/SKILL.md +246 -0
  53. package/skill/scripts/adapters/0x0st.sh +36 -0
  54. package/skill/scripts/adapters/blob.sh +55 -0
  55. package/skill/scripts/adapters/gist.sh +59 -0
  56. package/skill/scripts/adapters/git-native.sh +75 -0
  57. package/skill/scripts/upload-and-copy.sh +183 -0
@@ -0,0 +1,183 @@
1
+ #!/bin/bash
2
+ # upload-and-copy.sh - Upload images via pluggable storage adapters
3
+ # Usage: ./upload-and-copy.sh <before.png> <after.png> [--markdown]
4
+ #
5
+ # Options:
6
+ # --markdown Generate PR markdown table and copy to clipboard
7
+ #
8
+ # Environment:
9
+ # IMAGE_ADAPTER Storage adapter to use (default: git-native)
10
+ # Available: git-native, 0x0st, gist, blob
11
+ #
12
+ # Adapter-specific environment variables:
13
+ # blob: BLOB_UPLOAD_URL - Custom upload endpoint
14
+ #
15
+ # Examples:
16
+ # ./upload-and-copy.sh before.png after.png
17
+ # ./upload-and-copy.sh before.png after.png --markdown
18
+ # IMAGE_ADAPTER=0x0st ./upload-and-copy.sh before.png after.png --markdown
19
+
20
+ set -e
21
+
22
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
+ ADAPTERS_DIR="$SCRIPT_DIR/adapters"
24
+
25
+ # Default adapter
26
+ IMAGE_ADAPTER="${IMAGE_ADAPTER:-git-native}"
27
+
28
+ BEFORE_FILE="$1"
29
+ AFTER_FILE="$2"
30
+ shift 2 2>/dev/null || true
31
+
32
+ MARKDOWN_MODE=false
33
+
34
+ # Parse options
35
+ while [[ $# -gt 0 ]]; do
36
+ case $1 in
37
+ --markdown)
38
+ MARKDOWN_MODE=true
39
+ shift
40
+ ;;
41
+ *)
42
+ echo "Unknown option: $1"
43
+ exit 1
44
+ ;;
45
+ esac
46
+ done
47
+
48
+ # Validate inputs
49
+ if [[ -z "$BEFORE_FILE" || -z "$AFTER_FILE" ]]; then
50
+ echo "Usage: $0 <before.png> <after.png> [--markdown]"
51
+ echo ""
52
+ echo "Environment:"
53
+ echo " IMAGE_ADAPTER Storage adapter (default: git-native)"
54
+ echo " Available: git-native, 0x0st, gist, blob"
55
+ exit 1
56
+ fi
57
+
58
+ if [[ ! -f "$BEFORE_FILE" ]]; then
59
+ echo "Error: Before file not found: $BEFORE_FILE"
60
+ exit 1
61
+ fi
62
+
63
+ if [[ ! -f "$AFTER_FILE" ]]; then
64
+ echo "Error: After file not found: $AFTER_FILE"
65
+ exit 1
66
+ fi
67
+
68
+ # Validate adapter exists
69
+ ADAPTER_SCRIPT="$ADAPTERS_DIR/$IMAGE_ADAPTER.sh"
70
+ if [[ ! -f "$ADAPTER_SCRIPT" ]]; then
71
+ echo "Error: Unknown adapter: $IMAGE_ADAPTER"
72
+ echo ""
73
+ echo "Available adapters:"
74
+ for adapter in "$ADAPTERS_DIR"/*.sh; do
75
+ name=$(basename "$adapter" .sh)
76
+ echo " - $name"
77
+ done
78
+ exit 1
79
+ fi
80
+
81
+ # Upload function using adapter
82
+ upload_file() {
83
+ local file="$1"
84
+ local filename=$(basename "$file")
85
+
86
+ echo "Uploading: $filename (via $IMAGE_ADAPTER)" >&2
87
+
88
+ # Call the adapter script
89
+ "$ADAPTER_SCRIPT" "$file"
90
+ }
91
+
92
+ # Upload both files
93
+ echo "=== Uploading Screenshots ==="
94
+ BEFORE_URL=$(upload_file "$BEFORE_FILE")
95
+ AFTER_URL=$(upload_file "$AFTER_FILE")
96
+
97
+ # For git-native adapter: batch commit + push after both files are staged
98
+ if [[ "$IMAGE_ADAPTER" == "git-native" ]]; then
99
+ echo "Committing and pushing screenshots..." >&2
100
+ git commit -m "chore: add pre/post screenshots"
101
+ git push origin HEAD
102
+ fi
103
+
104
+ echo ""
105
+ echo "Before URL: $BEFORE_URL"
106
+ echo "After URL: $AFTER_URL"
107
+ echo ""
108
+
109
+ if [[ "$MARKDOWN_MODE" == "true" ]]; then
110
+ # Build section with commit reference
111
+ SHORT_SHA=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
112
+ TIMESTAMP=$(date "+%Y-%m-%d %H:%M")
113
+
114
+ SECTION="### Screenshots ($SHORT_SHA — $TIMESTAMP)
115
+
116
+ | Pre | Post |
117
+ |:---:|:----:|
118
+ | ![Pre]($BEFORE_URL) | ![Post]($AFTER_URL) |"
119
+
120
+ echo "=== PR Markdown ==="
121
+ echo "$SECTION"
122
+ echo ""
123
+
124
+ # Auto-append to PR body if gh CLI available and PR exists
125
+ # Parse owner/repo from origin so this works correctly in forks
126
+ REMOTE_URL=$(git remote get-url origin 2>/dev/null || true)
127
+ GH_REPO=$(echo "$REMOTE_URL" | sed -E 's#^(https?://github\.com/|git@github\.com:)##; s#\.git$##')
128
+
129
+ CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)
130
+
131
+ if command -v gh &> /dev/null && [[ -n "$GH_REPO" ]] && [[ -n "$CURRENT_BRANCH" ]]; then
132
+ PR_JSON=$(gh pr view "$CURRENT_BRANCH" --repo "$GH_REPO" --json number,body 2>/dev/null || true)
133
+ if [[ -n "$PR_JSON" ]]; then
134
+ PR_NUMBER=$(echo "$PR_JSON" | grep -o '"number":[0-9]*' | grep -o '[0-9]*')
135
+ PR_BODY=$(echo "$PR_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin).get('body',''))" 2>/dev/null || echo "")
136
+
137
+ # Stack: newest on top, right after ## Visual Changes header
138
+ NEW_BODY=$(python3 -c "
139
+ import sys
140
+ body = sys.argv[1]
141
+ section = sys.argv[2]
142
+ marker = '## Visual Changes'
143
+ if marker in body:
144
+ # Insert new section right after header, push older ones down
145
+ parts = body.split(marker, 1)
146
+ print(parts[0] + marker + '\n\n' + section + '\n\n---' + parts[1])
147
+ else:
148
+ # First time
149
+ print(body + '\n\n' + marker + '\n\n' + section)
150
+ " "$PR_BODY" "$SECTION")
151
+
152
+ gh pr edit "$PR_NUMBER" --repo "$GH_REPO" --body "$NEW_BODY"
153
+ echo "Screenshots appended to PR #$PR_NUMBER body"
154
+ else
155
+ echo "(no PR found for current branch — markdown copied to clipboard)"
156
+ fi
157
+ fi
158
+
159
+ # Also copy to clipboard as fallback
160
+ if command -v pbcopy &> /dev/null; then
161
+ echo "$SECTION" | pbcopy
162
+ echo "Markdown copied to clipboard!"
163
+ elif command -v xclip &> /dev/null; then
164
+ echo "$SECTION" | xclip -selection clipboard
165
+ echo "Markdown copied to clipboard!"
166
+ else
167
+ echo "(clipboard copy not available - install pbcopy or xclip)"
168
+ fi
169
+ else
170
+ # Copy URLs to clipboard
171
+ URLS="Before: $BEFORE_URL
172
+ After: $AFTER_URL"
173
+
174
+ if command -v pbcopy &> /dev/null; then
175
+ echo "$URLS" | pbcopy
176
+ echo "URLs copied to clipboard!"
177
+ elif command -v xclip &> /dev/null; then
178
+ echo "$URLS" | xclip -selection clipboard
179
+ echo "URLs copied to clipboard!"
180
+ else
181
+ echo "(clipboard copy not available - install pbcopy or xclip)"
182
+ fi
183
+ fi