100xprism 2.3.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.
- package/LICENSE +21 -0
- package/README.md +196 -0
- package/VERSION +1 -0
- package/adapters/antigravity.sh +14 -0
- package/adapters/claude-code.sh +160 -0
- package/adapters/codex.sh +13 -0
- package/adapters/copilot.sh +13 -0
- package/adapters/cursor.sh +13 -0
- package/adapters/gemini.sh +13 -0
- package/adapters/lib/__pycache__/modules.cpython-312.pyc +0 -0
- package/adapters/lib/modules.py +592 -0
- package/adapters/lib/shared.sh +83 -0
- package/adapters/lib/sync_plugins.py +113 -0
- package/adapters/windsurf.sh +15 -0
- package/bin/100xprism.js +29 -0
- package/get.sh +24 -0
- package/install-project.sh +82 -0
- package/install.sh +281 -0
- package/lib/adapters/windows.js +429 -0
- package/lib/bootstrap.js +33 -0
- package/lib/init.js +19 -0
- package/lib/install.js +18 -0
- package/lib/migrate.js +52 -0
- package/lib/platform.js +22 -0
- package/lib/update.js +29 -0
- package/modules/_lib/reference.md +77 -0
- package/modules/a11y-auditor/SKILL.md +151 -0
- package/modules/ab-test-setup/SKILL.md +266 -0
- package/modules/ab-test-setup/evals/evals.json +105 -0
- package/modules/ab-test-setup/references/sample-size-guide.md +263 -0
- package/modules/ab-test-setup/references/test-templates.md +277 -0
- package/modules/ad-creative/SKILL.md +362 -0
- package/modules/ad-creative/evals/evals.json +90 -0
- package/modules/ad-creative/references/generative-tools.md +637 -0
- package/modules/ad-creative/references/platform-specs.md +213 -0
- package/modules/ai-seo/SKILL.md +398 -0
- package/modules/ai-seo/evals/evals.json +90 -0
- package/modules/ai-seo/references/content-patterns.md +285 -0
- package/modules/ai-seo/references/platform-ranking-factors.md +152 -0
- package/modules/analytics-tracking/SKILL.md +309 -0
- package/modules/analytics-tracking/evals/evals.json +90 -0
- package/modules/analytics-tracking/references/event-library.md +260 -0
- package/modules/analytics-tracking/references/ga4-implementation.md +300 -0
- package/modules/analytics-tracking/references/gtm-implementation.md +390 -0
- package/modules/architect/SKILL.md +282 -0
- package/modules/branch/SKILL.md +105 -0
- package/modules/churn-prevention/SKILL.md +424 -0
- package/modules/churn-prevention/evals/evals.json +93 -0
- package/modules/churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/modules/churn-prevention/references/dunning-playbook.md +408 -0
- package/modules/cloud-security/SKILL.md +240 -0
- package/modules/cold-email/SKILL.md +178 -0
- package/modules/cold-email/evals/evals.json +94 -0
- package/modules/cold-email/references/benchmarks.md +83 -0
- package/modules/cold-email/references/follow-up-sequences.md +81 -0
- package/modules/cold-email/references/frameworks.md +90 -0
- package/modules/cold-email/references/personalization.md +79 -0
- package/modules/cold-email/references/subject-lines.md +53 -0
- package/modules/commit/SKILL.md +195 -0
- package/modules/competitor-alternatives/SKILL.md +256 -0
- package/modules/competitor-alternatives/evals/evals.json +93 -0
- package/modules/competitor-alternatives/references/content-architecture.md +271 -0
- package/modules/competitor-alternatives/references/templates.md +223 -0
- package/modules/connect/SKILL.md +894 -0
- package/modules/content-strategy/SKILL.md +359 -0
- package/modules/content-strategy/evals/evals.json +90 -0
- package/modules/context-dump/SKILL.md +67 -0
- package/modules/copy-editing/SKILL.md +447 -0
- package/modules/copy-editing/evals/evals.json +89 -0
- package/modules/copy-editing/references/plain-english-alternatives.md +394 -0
- package/modules/copywriting/SKILL.md +271 -0
- package/modules/copywriting/evals/evals.json +111 -0
- package/modules/copywriting/references/cold-email-benchmarks.md +83 -0
- package/modules/copywriting/references/cold-email-follow-ups.md +81 -0
- package/modules/copywriting/references/cold-email-frameworks.md +90 -0
- package/modules/copywriting/references/cold-email-personalization.md +79 -0
- package/modules/copywriting/references/cold-email-subject-lines.md +53 -0
- package/modules/copywriting/references/copy-frameworks.md +344 -0
- package/modules/copywriting/references/email-copy-guidelines.md +113 -0
- package/modules/copywriting/references/email-types.md +515 -0
- package/modules/copywriting/references/natural-transitions.md +272 -0
- package/modules/copywriting/references/sequence-templates.md +168 -0
- package/modules/data-query/SKILL.md +58 -0
- package/modules/data-viz/SKILL.md +225 -0
- package/modules/db/SKILL.md +205 -0
- package/modules/db/db-engines/_router.md +24 -0
- package/modules/db/db-engines/athena.md +16 -0
- package/modules/db/db-engines/cloud-sql.md +16 -0
- package/modules/db/db-engines/databricks.md +14 -0
- package/modules/db/db-engines/oracle.md +14 -0
- package/modules/db/db-engines/postgres.md +15 -0
- package/modules/db/db-engines/presto.md +14 -0
- package/modules/db/db-engines/snowflake.md +14 -0
- package/modules/docs/SKILL.md +100 -0
- package/modules/email-sequence/SKILL.md +309 -0
- package/modules/email-sequence/evals/evals.json +93 -0
- package/modules/email-sequence/references/copy-guidelines.md +113 -0
- package/modules/email-sequence/references/email-types.md +515 -0
- package/modules/email-sequence/references/sequence-templates.md +168 -0
- package/modules/enterprise-design/SKILL.md +75 -0
- package/modules/eval/SKILL.md +105 -0
- package/modules/figma-translator/SKILL.md +49 -0
- package/modules/fix-bugs/SKILL.md +104 -0
- package/modules/form-cro/SKILL.md +429 -0
- package/modules/form-cro/evals/evals.json +90 -0
- package/modules/free-tool-strategy/SKILL.md +178 -0
- package/modules/free-tool-strategy/evals/evals.json +90 -0
- package/modules/free-tool-strategy/references/tool-types.md +217 -0
- package/modules/gate/SKILL.md +232 -0
- package/modules/grill-me/SKILL.md +59 -0
- package/modules/interaction-engineer/SKILL.md +49 -0
- package/modules/issue/SKILL.md +272 -0
- package/modules/launch/SKILL.md +345 -0
- package/modules/launch-strategy/SKILL.md +353 -0
- package/modules/launch-strategy/evals/evals.json +91 -0
- package/modules/lint/SKILL.md +126 -0
- package/modules/marketing-ideas/SKILL.md +167 -0
- package/modules/marketing-ideas/evals/evals.json +90 -0
- package/modules/marketing-ideas/references/ideas-by-category.md +366 -0
- package/modules/marketing-psychology/SKILL.md +455 -0
- package/modules/marketing-psychology/evals/evals.json +88 -0
- package/modules/motion-designer/SKILL.md +214 -0
- package/modules/onboarding-cro/SKILL.md +220 -0
- package/modules/onboarding-cro/evals/evals.json +92 -0
- package/modules/onboarding-cro/references/experiments.md +258 -0
- package/modules/orchestrate/SKILL.md +77 -0
- package/modules/page-cro/SKILL.md +182 -0
- package/modules/page-cro/evals/evals.json +111 -0
- package/modules/page-cro/references/experiments.md +248 -0
- package/modules/page-cro/references/paywall-experiments.md +164 -0
- package/modules/paid-ads/SKILL.md +315 -0
- package/modules/paid-ads/evals/evals.json +90 -0
- package/modules/paid-ads/references/ad-copy-templates.md +207 -0
- package/modules/paid-ads/references/audience-targeting.md +243 -0
- package/modules/paid-ads/references/platform-setup-checklists.md +277 -0
- package/modules/paywall-upgrade-cro/SKILL.md +227 -0
- package/modules/paywall-upgrade-cro/evals/evals.json +93 -0
- package/modules/paywall-upgrade-cro/references/experiments.md +164 -0
- package/modules/popup-cro/SKILL.md +453 -0
- package/modules/popup-cro/evals/evals.json +94 -0
- package/modules/pr/SKILL.md +203 -0
- package/modules/pricing-strategy/SKILL.md +231 -0
- package/modules/pricing-strategy/evals/evals.json +90 -0
- package/modules/pricing-strategy/references/research-methods.md +152 -0
- package/modules/pricing-strategy/references/tier-structure.md +232 -0
- package/modules/product-marketing-context/SKILL.md +241 -0
- package/modules/product-marketing-context/evals/evals.json +85 -0
- package/modules/programmatic-seo/SKILL.md +238 -0
- package/modules/programmatic-seo/evals/evals.json +94 -0
- package/modules/programmatic-seo/references/playbooks.md +308 -0
- package/modules/push/SKILL.md +202 -0
- package/modules/referral-program/SKILL.md +255 -0
- package/modules/referral-program/evals/evals.json +89 -0
- package/modules/referral-program/references/affiliate-programs.md +164 -0
- package/modules/referral-program/references/program-examples.md +143 -0
- package/modules/release/SKILL.md +293 -0
- package/modules/revops/SKILL.md +343 -0
- package/modules/revops/evals/evals.json +91 -0
- package/modules/revops/references/automation-playbooks.md +290 -0
- package/modules/revops/references/lifecycle-definitions.md +278 -0
- package/modules/revops/references/routing-rules.md +203 -0
- package/modules/revops/references/scoring-models.md +247 -0
- package/modules/sales-enablement/SKILL.md +349 -0
- package/modules/sales-enablement/evals/evals.json +91 -0
- package/modules/sales-enablement/references/deck-frameworks.md +263 -0
- package/modules/sales-enablement/references/demo-scripts.md +355 -0
- package/modules/sales-enablement/references/objection-library.md +270 -0
- package/modules/sales-enablement/references/one-pager-templates.md +208 -0
- package/modules/schema-markup/SKILL.md +179 -0
- package/modules/schema-markup/evals/evals.json +87 -0
- package/modules/schema-markup/references/schema-examples.md +398 -0
- package/modules/security/SKILL.md +138 -0
- package/modules/seo-audit/SKILL.md +412 -0
- package/modules/seo-audit/evals/evals.json +136 -0
- package/modules/seo-audit/references/ai-writing-detection.md +200 -0
- package/modules/seo-audit/references/content-patterns.md +285 -0
- package/modules/seo-audit/references/platform-ranking-factors.md +152 -0
- package/modules/signup-flow-cro/SKILL.md +359 -0
- package/modules/signup-flow-cro/evals/evals.json +88 -0
- package/modules/site-architecture/SKILL.md +357 -0
- package/modules/site-architecture/evals/evals.json +88 -0
- package/modules/site-architecture/references/mermaid-templates.md +216 -0
- package/modules/site-architecture/references/navigation-patterns.md +305 -0
- package/modules/site-architecture/references/site-type-templates.md +293 -0
- package/modules/social-content/SKILL.md +278 -0
- package/modules/social-content/evals/evals.json +92 -0
- package/modules/social-content/references/platforms.md +170 -0
- package/modules/social-content/references/post-templates.md +177 -0
- package/modules/social-content/references/reverse-engineering.md +195 -0
- package/modules/spec/SKILL.md +81 -0
- package/modules/subagents/SKILL.md +123 -0
- package/modules/techdebt/SKILL.md +71 -0
- package/modules/terminal-setup/SKILL.md +49 -0
- package/modules/test/SKILL.md +493 -0
- package/modules/test/references/e2e-patterns.md +294 -0
- package/modules/update-claude-md/SKILL.md +52 -0
- package/modules/visual-system-architect/SKILL.md +53 -0
- package/package.json +44 -0
- package/plugins/plugins.json +43 -0
- package/shell/aliases.sh +24 -0
- package/shell/check-update.sh +212 -0
- package/templates/.env.example +199 -0
- package/templates/docker-compose.md +46 -0
- package/templates/node-frontend.md +56 -0
- package/templates/node-fullstack.md +59 -0
- package/templates/python-api.md +57 -0
- package/update.sh +231 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# check-update.sh — daily version check + cache for 100xprism
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# check-update.sh --silent Refresh cache only. No output.
|
|
6
|
+
# check-update.sh --notify Show banner + prompt if update available.
|
|
7
|
+
# check-update.sh --claude-hook Inject session notice if update available.
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
REPO_DIR="${HUNDRED_X_REPO_OVERRIDE:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
|
|
12
|
+
STATE_DIR="$HOME/.100xprism"
|
|
13
|
+
CACHE_FILE="$STATE_DIR/update-cache"
|
|
14
|
+
FLAG="${1:-}"
|
|
15
|
+
|
|
16
|
+
YELLOW='\033[1;33m'
|
|
17
|
+
CYAN='\033[0;36m'
|
|
18
|
+
NC='\033[0m'
|
|
19
|
+
|
|
20
|
+
mkdir -p "$STATE_DIR"
|
|
21
|
+
|
|
22
|
+
# ── Cache helpers ─────────────────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
_cache_get() {
|
|
25
|
+
local key="$1"
|
|
26
|
+
if [[ ! -f "$CACHE_FILE" ]]; then
|
|
27
|
+
echo ""
|
|
28
|
+
return
|
|
29
|
+
fi
|
|
30
|
+
grep "^${key}=" "$CACHE_FILE" 2>/dev/null | cut -d= -f2- || true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
_cache_set() {
|
|
34
|
+
local key="$1" value="$2"
|
|
35
|
+
touch "$CACHE_FILE"
|
|
36
|
+
local tmp
|
|
37
|
+
tmp="$(mktemp)"
|
|
38
|
+
grep -v "^${key}=" "$CACHE_FILE" > "$tmp" 2>/dev/null || true
|
|
39
|
+
echo "${key}=${value}" >> "$tmp"
|
|
40
|
+
mv "$tmp" "$CACHE_FILE"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# ── Version check ─────────────────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
_refresh_cache() {
|
|
46
|
+
local now
|
|
47
|
+
now="$(date +%s)"
|
|
48
|
+
local last_check
|
|
49
|
+
last_check="$(_cache_get last_check)"
|
|
50
|
+
last_check="${last_check:-0}"
|
|
51
|
+
|
|
52
|
+
local age=$(( now - last_check ))
|
|
53
|
+
if (( age < 86400 )); then
|
|
54
|
+
return # Cache is fresh — skip network call
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
cd "$REPO_DIR"
|
|
58
|
+
|
|
59
|
+
# Fetch with timeout; on failure, update timestamp only to avoid retry storm
|
|
60
|
+
if ! git fetch origin main --quiet 2>/dev/null; then
|
|
61
|
+
_cache_set last_check "$now"
|
|
62
|
+
return
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
local local_sha remote_sha
|
|
66
|
+
local_sha="$(git rev-parse HEAD 2>/dev/null || echo "unknown")"
|
|
67
|
+
remote_sha="$(git rev-parse origin/main 2>/dev/null || echo "unknown")"
|
|
68
|
+
|
|
69
|
+
local has_update="false"
|
|
70
|
+
local changelog=""
|
|
71
|
+
|
|
72
|
+
if [[ "$local_sha" != "$remote_sha" && "$local_sha" != "unknown" ]]; then
|
|
73
|
+
has_update="true"
|
|
74
|
+
changelog="$(git log --oneline "${local_sha}..origin/main" 2>/dev/null | head -5 | tr '\n' '|' | sed 's/|$//')"
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
_cache_set last_check "$now"
|
|
78
|
+
_cache_set has_update "$has_update"
|
|
79
|
+
_cache_set local_sha "$local_sha"
|
|
80
|
+
_cache_set remote_sha "$remote_sha"
|
|
81
|
+
_cache_set changelog "$changelog"
|
|
82
|
+
|
|
83
|
+
# Clear snooze when no update
|
|
84
|
+
if [[ "$has_update" == "false" ]]; then
|
|
85
|
+
_cache_set snoozed_until "0"
|
|
86
|
+
fi
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
_fetch_release_notes() {
|
|
90
|
+
# Try GitHub Releases API first (requires gh CLI)
|
|
91
|
+
if command -v gh >/dev/null 2>&1; then
|
|
92
|
+
local notes
|
|
93
|
+
notes=$(gh release view --repo rajitsaha/100xprism --json body -q .body 2>/dev/null | head -20 || true)
|
|
94
|
+
if [[ -n "$notes" ]]; then
|
|
95
|
+
echo "$notes"
|
|
96
|
+
return
|
|
97
|
+
fi
|
|
98
|
+
fi
|
|
99
|
+
# Fallback: format cached commit messages
|
|
100
|
+
local changelog
|
|
101
|
+
changelog="$(_cache_get changelog)"
|
|
102
|
+
IFS='|' read -ra _lines <<< "$changelog"
|
|
103
|
+
for _line in "${_lines[@]}"; do
|
|
104
|
+
[[ -z "$_line" ]] && continue
|
|
105
|
+
echo "• ${_line#* }"
|
|
106
|
+
done
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# ── Snooze helpers ────────────────────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
_is_snoozed() {
|
|
112
|
+
local snoozed_until
|
|
113
|
+
snoozed_until="$(_cache_get snoozed_until)"
|
|
114
|
+
snoozed_until="${snoozed_until:-0}"
|
|
115
|
+
local now
|
|
116
|
+
now="$(date +%s)"
|
|
117
|
+
(( now < snoozed_until )) && return 0 || return 1
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
_snooze() {
|
|
121
|
+
local until=$(( $(date +%s) + 86400 ))
|
|
122
|
+
_cache_set snoozed_until "$until"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# ── Output modes ──────────────────────────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
_do_silent() {
|
|
128
|
+
_refresh_cache
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
_do_notify() {
|
|
132
|
+
# Read from cache only — no network call (that's _do_silent's job)
|
|
133
|
+
local has_update
|
|
134
|
+
has_update="$(_cache_get has_update)"
|
|
135
|
+
[[ "$has_update" == "true" ]] || return 0
|
|
136
|
+
_is_snoozed && return 0
|
|
137
|
+
|
|
138
|
+
# Only show prompt if stdin is a terminal
|
|
139
|
+
[[ -t 0 ]] || return 0
|
|
140
|
+
|
|
141
|
+
local local_sha remote_sha changelog
|
|
142
|
+
local_sha="$(_cache_get local_sha)"
|
|
143
|
+
remote_sha="$(_cache_get remote_sha)"
|
|
144
|
+
changelog="$(_cache_get changelog)"
|
|
145
|
+
|
|
146
|
+
local short_local="${local_sha:0:7}"
|
|
147
|
+
local short_remote="${remote_sha:0:7}"
|
|
148
|
+
|
|
149
|
+
echo ""
|
|
150
|
+
# shellcheck disable=SC2059
|
|
151
|
+
printf "${YELLOW}╔══════════════════════════════════════════════════════╗${NC}\n"
|
|
152
|
+
# shellcheck disable=SC2059
|
|
153
|
+
printf "${YELLOW}║${NC} %-52s${YELLOW}║${NC}\n" "100x Dev update available: $short_local → $short_remote"
|
|
154
|
+
|
|
155
|
+
local _notes
|
|
156
|
+
_notes="$(_fetch_release_notes)"
|
|
157
|
+
while IFS= read -r _note; do
|
|
158
|
+
[[ -z "$_note" ]] && continue
|
|
159
|
+
_note="${_note:0:50}"
|
|
160
|
+
# shellcheck disable=SC2059
|
|
161
|
+
printf "${YELLOW}║${NC} %-52s${YELLOW}║${NC}\n" "$_note"
|
|
162
|
+
done <<< "$_notes"
|
|
163
|
+
|
|
164
|
+
# shellcheck disable=SC2059
|
|
165
|
+
printf "${YELLOW}╚══════════════════════════════════════════════════════╝${NC}\n"
|
|
166
|
+
echo ""
|
|
167
|
+
|
|
168
|
+
read -rp "Update now? (Y/n): " _confirm
|
|
169
|
+
_confirm="${_confirm:-Y}"
|
|
170
|
+
if [[ "$_confirm" =~ ^[Yy]$ ]]; then
|
|
171
|
+
bash "$REPO_DIR/update.sh"
|
|
172
|
+
else
|
|
173
|
+
_snooze
|
|
174
|
+
echo -e "${CYAN}Reminder snoozed for 24h. Run \`100x-update\` when ready.${NC}"
|
|
175
|
+
fi
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
_do_claude_hook() {
|
|
179
|
+
local has_update
|
|
180
|
+
has_update="$(_cache_get has_update)"
|
|
181
|
+
[[ "$has_update" == "true" ]] || return 0
|
|
182
|
+
_is_snoozed && return 0
|
|
183
|
+
|
|
184
|
+
local local_sha remote_sha changelog
|
|
185
|
+
local_sha="$(_cache_get local_sha)"
|
|
186
|
+
remote_sha="$(_cache_get remote_sha)"
|
|
187
|
+
changelog="$(_cache_get changelog)"
|
|
188
|
+
|
|
189
|
+
local short_local="${local_sha:0:7}"
|
|
190
|
+
local short_remote="${remote_sha:0:7}"
|
|
191
|
+
|
|
192
|
+
echo "> 100x Dev update available ($short_local → $short_remote)"
|
|
193
|
+
local _notes
|
|
194
|
+
_notes="$(_fetch_release_notes)"
|
|
195
|
+
while IFS= read -r _note; do
|
|
196
|
+
[[ -z "$_note" ]] && continue
|
|
197
|
+
echo " ${_note:0:60}"
|
|
198
|
+
done <<< "$_notes"
|
|
199
|
+
echo "> Run \`100x-update\` in your terminal to upgrade."
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# ── Dispatch ──────────────────────────────────────────────────────────────────
|
|
203
|
+
|
|
204
|
+
case "$FLAG" in
|
|
205
|
+
--silent) _do_silent ;;
|
|
206
|
+
--notify) _do_notify ;;
|
|
207
|
+
--claude-hook) _do_claude_hook ;;
|
|
208
|
+
*)
|
|
209
|
+
echo "Usage: check-update.sh [--silent|--notify|--claude-hook]" >&2
|
|
210
|
+
exit 1
|
|
211
|
+
;;
|
|
212
|
+
esac
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# .env.example — SaaS CLI Credential Template
|
|
3
|
+
# Generated by 100xprism | https://github.com/rajitatudemy/100xprism
|
|
4
|
+
#
|
|
5
|
+
# INSTRUCTIONS:
|
|
6
|
+
# 1. Copy this file: cp .env.example .env
|
|
7
|
+
# 2. Fill in only the services you use
|
|
8
|
+
# 3. NEVER commit .env to git — it is in .gitignore
|
|
9
|
+
# 4. Run `/connect` in Claude Code to authenticate all services
|
|
10
|
+
# =============================================================================
|
|
11
|
+
|
|
12
|
+
# =============================================================================
|
|
13
|
+
# VERSION CONTROL & ISSUE TRACKING
|
|
14
|
+
# =============================================================================
|
|
15
|
+
|
|
16
|
+
# GitHub — https://github.com/settings/tokens
|
|
17
|
+
# Scopes: repo, workflow, packages, admin:org (as needed)
|
|
18
|
+
GITHUB_TOKEN=
|
|
19
|
+
|
|
20
|
+
# Jira / Atlassian — https://id.atlassian.com/manage-profile/security/api-tokens
|
|
21
|
+
JIRA_URL=https://your-org.atlassian.net
|
|
22
|
+
JIRA_USER_EMAIL=
|
|
23
|
+
JIRA_API_TOKEN=
|
|
24
|
+
JIRA_PROJECT_KEY=
|
|
25
|
+
|
|
26
|
+
# Linear — https://linear.app/settings/api
|
|
27
|
+
LINEAR_API_KEY=
|
|
28
|
+
|
|
29
|
+
# =============================================================================
|
|
30
|
+
# CLOUD PLATFORMS
|
|
31
|
+
# =============================================================================
|
|
32
|
+
|
|
33
|
+
# AWS — https://console.aws.amazon.com/iam/home#/security_credentials
|
|
34
|
+
AWS_ACCESS_KEY_ID=
|
|
35
|
+
AWS_SECRET_ACCESS_KEY=
|
|
36
|
+
AWS_DEFAULT_REGION=us-east-1
|
|
37
|
+
# Optional: assume-role or named profile
|
|
38
|
+
# AWS_PROFILE=
|
|
39
|
+
|
|
40
|
+
# Google Cloud Platform — https://console.cloud.google.com/iam-admin/serviceaccounts
|
|
41
|
+
GCP_PROJECT_ID=
|
|
42
|
+
GCP_REGION=us-central1
|
|
43
|
+
# Path to your service account JSON key file
|
|
44
|
+
GOOGLE_APPLICATION_CREDENTIALS=
|
|
45
|
+
|
|
46
|
+
# Azure — https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps
|
|
47
|
+
AZURE_CLIENT_ID=
|
|
48
|
+
AZURE_CLIENT_SECRET=
|
|
49
|
+
AZURE_TENANT_ID=
|
|
50
|
+
AZURE_SUBSCRIPTION_ID=
|
|
51
|
+
|
|
52
|
+
# DigitalOcean — https://cloud.digitalocean.com/account/api/tokens
|
|
53
|
+
DIGITALOCEAN_ACCESS_TOKEN=
|
|
54
|
+
|
|
55
|
+
# =============================================================================
|
|
56
|
+
# DEPLOYMENT & HOSTING
|
|
57
|
+
# =============================================================================
|
|
58
|
+
|
|
59
|
+
# Vercel — https://vercel.com/account/tokens
|
|
60
|
+
VERCEL_TOKEN=
|
|
61
|
+
VERCEL_ORG_ID=
|
|
62
|
+
VERCEL_PROJECT_ID=
|
|
63
|
+
|
|
64
|
+
# Netlify — https://app.netlify.com/user/applications#personal-access-tokens
|
|
65
|
+
NETLIFY_AUTH_TOKEN=
|
|
66
|
+
NETLIFY_SITE_ID=
|
|
67
|
+
|
|
68
|
+
# Railway — https://railway.app/account/tokens
|
|
69
|
+
RAILWAY_TOKEN=
|
|
70
|
+
|
|
71
|
+
# Heroku — https://dashboard.heroku.com/account (API Key section)
|
|
72
|
+
HEROKU_API_KEY=
|
|
73
|
+
|
|
74
|
+
# Fly.io — https://fly.io/user/personal_access_tokens
|
|
75
|
+
FLY_API_TOKEN=
|
|
76
|
+
|
|
77
|
+
# Render — https://dashboard.render.com/u/settings#api-keys
|
|
78
|
+
RENDER_API_KEY=
|
|
79
|
+
|
|
80
|
+
# =============================================================================
|
|
81
|
+
# DATABASE / BACKEND-AS-A-SERVICE
|
|
82
|
+
# =============================================================================
|
|
83
|
+
|
|
84
|
+
# Supabase — https://supabase.com/dashboard/account/tokens
|
|
85
|
+
SUPABASE_ACCESS_TOKEN=
|
|
86
|
+
SUPABASE_PROJECT_REF=
|
|
87
|
+
SUPABASE_URL=https://your-project.supabase.co
|
|
88
|
+
SUPABASE_ANON_KEY=
|
|
89
|
+
SUPABASE_SERVICE_ROLE_KEY=
|
|
90
|
+
SUPABASE_DB_PASSWORD=
|
|
91
|
+
|
|
92
|
+
# PlanetScale — https://app.planetscale.com/[org]/settings/service-tokens
|
|
93
|
+
PLANETSCALE_SERVICE_TOKEN=
|
|
94
|
+
PLANETSCALE_SERVICE_TOKEN_ID=
|
|
95
|
+
PLANETSCALE_ORG=
|
|
96
|
+
PLANETSCALE_DB=
|
|
97
|
+
|
|
98
|
+
# Firebase (Google) — run: firebase login:ci
|
|
99
|
+
FIREBASE_TOKEN=
|
|
100
|
+
FIREBASE_PROJECT_ID=
|
|
101
|
+
FIREBASE_API_KEY=
|
|
102
|
+
|
|
103
|
+
# MongoDB Atlas — https://cloud.mongodb.com programmatic API keys
|
|
104
|
+
MONGODB_ATLAS_PUBLIC_KEY=
|
|
105
|
+
MONGODB_ATLAS_PRIVATE_KEY=
|
|
106
|
+
MONGODB_ATLAS_ORG_ID=
|
|
107
|
+
MONGODB_ATLAS_PROJECT_ID=
|
|
108
|
+
MONGODB_URI=
|
|
109
|
+
|
|
110
|
+
# =============================================================================
|
|
111
|
+
# PAYMENTS
|
|
112
|
+
# =============================================================================
|
|
113
|
+
|
|
114
|
+
# Stripe — https://dashboard.stripe.com/apikeys
|
|
115
|
+
# Use sk_test_... for development, sk_live_... for production
|
|
116
|
+
STRIPE_SECRET_KEY=
|
|
117
|
+
STRIPE_PUBLISHABLE_KEY=
|
|
118
|
+
STRIPE_WEBHOOK_SECRET=
|
|
119
|
+
# Optional: Stripe restricted key for specific operations
|
|
120
|
+
# STRIPE_RESTRICTED_KEY=
|
|
121
|
+
|
|
122
|
+
# =============================================================================
|
|
123
|
+
# CDN / EDGE / DNS
|
|
124
|
+
# =============================================================================
|
|
125
|
+
|
|
126
|
+
# Cloudflare — https://dash.cloudflare.com/profile/api-tokens
|
|
127
|
+
CLOUDFLARE_API_TOKEN=
|
|
128
|
+
CLOUDFLARE_ACCOUNT_ID=
|
|
129
|
+
CLOUDFLARE_ZONE_ID=
|
|
130
|
+
|
|
131
|
+
# =============================================================================
|
|
132
|
+
# DEVOPS & INFRASTRUCTURE
|
|
133
|
+
# =============================================================================
|
|
134
|
+
|
|
135
|
+
# Docker Hub — https://hub.docker.com/settings/security (use Access Token, not password)
|
|
136
|
+
DOCKER_USERNAME=
|
|
137
|
+
DOCKER_TOKEN=
|
|
138
|
+
# Optional: private registry URL (leave blank for Docker Hub)
|
|
139
|
+
# DOCKER_REGISTRY=
|
|
140
|
+
|
|
141
|
+
# Terraform Cloud — https://app.terraform.io/app/settings/tokens
|
|
142
|
+
TF_TOKEN_app_terraform_io=
|
|
143
|
+
TF_WORKSPACE=
|
|
144
|
+
TF_ORGANIZATION=
|
|
145
|
+
|
|
146
|
+
# Sentry — https://sentry.io/settings/account/api/auth-tokens/
|
|
147
|
+
SENTRY_AUTH_TOKEN=
|
|
148
|
+
SENTRY_ORG=
|
|
149
|
+
SENTRY_PROJECT=
|
|
150
|
+
# Optional: self-hosted Sentry URL (leave blank for sentry.io)
|
|
151
|
+
# SENTRY_URL=
|
|
152
|
+
|
|
153
|
+
# Datadog — https://app.datadoghq.com/organization-settings/api-keys
|
|
154
|
+
DD_API_KEY=
|
|
155
|
+
DD_APP_KEY=
|
|
156
|
+
DD_SITE=datadoghq.com
|
|
157
|
+
|
|
158
|
+
# =============================================================================
|
|
159
|
+
# COMMUNICATION & PRODUCTIVITY
|
|
160
|
+
# =============================================================================
|
|
161
|
+
|
|
162
|
+
# Slack — https://api.slack.com/apps → your app → OAuth & Permissions
|
|
163
|
+
SLACK_BOT_TOKEN=
|
|
164
|
+
SLACK_SIGNING_SECRET=
|
|
165
|
+
SLACK_TEAM_ID=
|
|
166
|
+
# Optional: specific channel ID for notifications
|
|
167
|
+
# SLACK_CHANNEL_ID=
|
|
168
|
+
|
|
169
|
+
# Notion — https://www.notion.so/my-integrations
|
|
170
|
+
NOTION_TOKEN=
|
|
171
|
+
NOTION_DATABASE_ID=
|
|
172
|
+
|
|
173
|
+
# =============================================================================
|
|
174
|
+
# PACKAGE REGISTRIES
|
|
175
|
+
# =============================================================================
|
|
176
|
+
|
|
177
|
+
# npm — https://www.npmjs.com/settings/[username]/tokens
|
|
178
|
+
NPM_TOKEN=
|
|
179
|
+
|
|
180
|
+
# PyPI — https://pypi.org/manage/account/token/
|
|
181
|
+
PYPI_TOKEN=
|
|
182
|
+
# Defaults to __token__ when using PYPI_TOKEN
|
|
183
|
+
# PYPI_USERNAME=__token__
|
|
184
|
+
|
|
185
|
+
# GitHub Packages (uses GITHUB_TOKEN above, already set)
|
|
186
|
+
|
|
187
|
+
# Homebrew — increases API rate limits for `brew` commands
|
|
188
|
+
HOMEBREW_GITHUB_API_TOKEN=
|
|
189
|
+
|
|
190
|
+
# =============================================================================
|
|
191
|
+
# APP / ENVIRONMENT CONFIG (project-specific — add your own below)
|
|
192
|
+
# =============================================================================
|
|
193
|
+
|
|
194
|
+
NODE_ENV=development
|
|
195
|
+
PORT=3000
|
|
196
|
+
# DATABASE_URL=
|
|
197
|
+
# REDIS_URL=
|
|
198
|
+
# JWT_SECRET=
|
|
199
|
+
# SESSION_SECRET=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# [Project Name] — Project Instructions
|
|
2
|
+
Last updated: YYYY-MM-DD
|
|
3
|
+
|
|
4
|
+
## Project Overview
|
|
5
|
+
[One paragraph describing what this project does]
|
|
6
|
+
|
|
7
|
+
## Tech Stack
|
|
8
|
+
- Services: [api, dashboard, postgres, redis, etc]
|
|
9
|
+
- Orchestration: Docker Compose
|
|
10
|
+
- Testing: [per-service test stacks]
|
|
11
|
+
|
|
12
|
+
## Key Commands
|
|
13
|
+
```bash
|
|
14
|
+
# Build
|
|
15
|
+
docker build -t [project]-api:local .
|
|
16
|
+
docker build -t [project]-dashboard:local ./dashboard
|
|
17
|
+
|
|
18
|
+
# Run
|
|
19
|
+
docker compose up -d
|
|
20
|
+
docker compose ps
|
|
21
|
+
docker compose logs -f [service]
|
|
22
|
+
|
|
23
|
+
# Migrations
|
|
24
|
+
docker compose run --rm migrate
|
|
25
|
+
|
|
26
|
+
# Stop
|
|
27
|
+
docker compose down
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Health Endpoints
|
|
31
|
+
- API: http://localhost:8000/health
|
|
32
|
+
- Dashboard: http://localhost:3001
|
|
33
|
+
|
|
34
|
+
## Smoke Test
|
|
35
|
+
```bash
|
|
36
|
+
curl -s http://localhost:8000/health # Should return {"status":"healthy"}
|
|
37
|
+
curl -s -o /dev/null -w "%{http_code}" http://localhost:3001/ # Should return 200
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Security — Known Exceptions
|
|
41
|
+
<!-- List any accepted audit exceptions here -->
|
|
42
|
+
|
|
43
|
+
## Conventions
|
|
44
|
+
- Migrations in alembic/ or migrations/
|
|
45
|
+
- Each service has its own Dockerfile
|
|
46
|
+
- Compose file at docker-compose.yml or deploy/docker-compose.yml
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# [Project Name] — Project Instructions
|
|
2
|
+
Last updated: YYYY-MM-DD
|
|
3
|
+
|
|
4
|
+
## Project Overview
|
|
5
|
+
[One paragraph describing what this project does]
|
|
6
|
+
|
|
7
|
+
## Tech Stack
|
|
8
|
+
- Framework: React + Vite
|
|
9
|
+
- Language: TypeScript
|
|
10
|
+
- Styling: [Tailwind / shadcn / etc]
|
|
11
|
+
- Testing: Vitest + Testing Library
|
|
12
|
+
- E2E: Playwright (optional)
|
|
13
|
+
|
|
14
|
+
## Key Commands
|
|
15
|
+
```bash
|
|
16
|
+
npm run dev # Start dev server
|
|
17
|
+
npm run build # Production build
|
|
18
|
+
npm run test:unit # Unit tests
|
|
19
|
+
npm run test:coverage # Coverage report
|
|
20
|
+
npm run lint # ESLint
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Health Endpoints
|
|
24
|
+
- Local: http://localhost:5173
|
|
25
|
+
|
|
26
|
+
## Security — Known Exceptions
|
|
27
|
+
<!-- List any accepted audit exceptions here, e.g.: -->
|
|
28
|
+
<!-- - undici via Firebase SDK — requires --force to fix, known safe -->
|
|
29
|
+
|
|
30
|
+
## Conventions
|
|
31
|
+
- Components in src/components/
|
|
32
|
+
- Pages in src/pages/
|
|
33
|
+
- Utilities in src/lib/
|
|
34
|
+
- Tests mirror src/ structure in src/__tests__/
|
|
35
|
+
|
|
36
|
+
## Common CI Traps
|
|
37
|
+
|
|
38
|
+
**`opacity-0` breaks Playwright** — `useState(false)` + `useEffect(() => setState(true), [])` to trigger a CSS fade-in is a common pattern, but Playwright's `toBeVisible()` fails on `opacity-0` elements. In a client-only SPA there is no SSR reason to defer visibility — initialize to `true` directly.
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
// Wrong — form is invisible on first render; Playwright times out
|
|
42
|
+
const [mounted, setMounted] = useState(false);
|
|
43
|
+
useEffect(() => { setMounted(true); }, []);
|
|
44
|
+
|
|
45
|
+
// Right — immediately visible, no effect needed
|
|
46
|
+
const mounted = true;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**ESLint plugin version skew** — if CI uses a newer eslint plugin version than is pinned locally, errors appear in CI but not on your machine. Pin exact plugin versions in `package.json` to keep CI and local in sync.
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
// Pin exact versions, not ranges, for lint plugins
|
|
53
|
+
"eslint-plugin-react-hooks": "5.2.0"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**npm packages not yet published** — never add a package to `dependencies` that doesn't exist on the npm registry yet. Docker builds will fail with a 404 at `npm install` time. Use `file:` paths or vendor the source instead.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# [Project Name] — Project Instructions
|
|
2
|
+
Last updated: YYYY-MM-DD
|
|
3
|
+
|
|
4
|
+
## Project Overview
|
|
5
|
+
[One paragraph describing what this project does]
|
|
6
|
+
|
|
7
|
+
## Tech Stack
|
|
8
|
+
- Frontend: React + Vite + TypeScript
|
|
9
|
+
- Backend: Node.js + Express/Fastify + TypeScript
|
|
10
|
+
- Database: PostgreSQL
|
|
11
|
+
- Auth: [Firebase / JWT / etc]
|
|
12
|
+
- Testing: Vitest (frontend) + Jest + supertest (backend)
|
|
13
|
+
- E2E: Playwright
|
|
14
|
+
|
|
15
|
+
## Key Commands
|
|
16
|
+
```bash
|
|
17
|
+
# Frontend (root)
|
|
18
|
+
npm run dev # Start frontend dev server
|
|
19
|
+
npm run build # Frontend production build
|
|
20
|
+
npm run test:coverage # Frontend coverage
|
|
21
|
+
|
|
22
|
+
# Backend (api/)
|
|
23
|
+
cd api && npm run dev # Start API server
|
|
24
|
+
cd api && npm run build # Backend build
|
|
25
|
+
cd api && npm run test:coverage # Backend coverage
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Health Endpoints
|
|
29
|
+
- Local API: http://localhost:3001/health
|
|
30
|
+
- Local Frontend: http://localhost:5173
|
|
31
|
+
- Production API: https://[your-api-url]/health
|
|
32
|
+
- Production Frontend: https://[your-frontend-url]
|
|
33
|
+
|
|
34
|
+
## Security — Known Exceptions
|
|
35
|
+
<!-- List any accepted audit exceptions here -->
|
|
36
|
+
|
|
37
|
+
## Conventions
|
|
38
|
+
- API routes in api/src/routes/
|
|
39
|
+
- Frontend components in src/components/
|
|
40
|
+
- Shared types in src/types/ or api/src/types/
|
|
41
|
+
- All routes require auth middleware except /health and /webhooks
|
|
42
|
+
|
|
43
|
+
## Common CI Traps
|
|
44
|
+
|
|
45
|
+
**npm packages not yet published** — if a package is listed in `dependencies` but not on the npm registry, Docker builds fail with a 404 at `npm install`. Use `file:` paths for local packages or vendor the source directly into the build context.
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
// Wrong — 404 in Docker if package isn't published
|
|
49
|
+
"dependencies": { "@yourorg/internal-pkg": "^0.1.0" }
|
|
50
|
+
|
|
51
|
+
// Right — reference local source
|
|
52
|
+
"dependencies": { "@yourorg/internal-pkg": "file:./internal-pkg" }
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**`opacity-0` breaks Playwright** — `useState(false)` + `useEffect(() => setState(true), [])` for CSS enter-animations makes elements invisible on first render. Playwright's `toBeVisible()` fails. In SPAs initialize to `true` and use CSS `@keyframes` for animations instead.
|
|
56
|
+
|
|
57
|
+
**ESLint plugin version skew** — CI may use a newer plugin version than is installed locally, causing errors in CI that don't reproduce. Pin exact versions for lint plugins in `package.json`.
|
|
58
|
+
|
|
59
|
+
**Integration tests silently excluded from gate** — always run both `tests/unit/` and `tests/integration/` in CI. Omitting integration tests means Docker-build failures and DB regressions only surface after merge.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# [Project Name] — Project Instructions
|
|
2
|
+
Last updated: YYYY-MM-DD
|
|
3
|
+
|
|
4
|
+
## Project Overview
|
|
5
|
+
[One paragraph describing what this project does]
|
|
6
|
+
|
|
7
|
+
## Tech Stack
|
|
8
|
+
- Language: Python 3.11+
|
|
9
|
+
- Framework: FastAPI / Flask
|
|
10
|
+
- Database: PostgreSQL / SQLite
|
|
11
|
+
- Testing: pytest + pytest-cov
|
|
12
|
+
- Linting: ruff
|
|
13
|
+
|
|
14
|
+
## Key Commands
|
|
15
|
+
```bash
|
|
16
|
+
source venv/bin/activate # Activate virtualenv
|
|
17
|
+
./venv/bin/python -m uvicorn main:app --reload # Start dev server
|
|
18
|
+
./venv/bin/python -m pytest tests/ -v # Run tests
|
|
19
|
+
./venv/bin/python -m pytest --cov=. --cov-report=term-missing # Coverage
|
|
20
|
+
./venv/bin/ruff check . --fix # Lint + fix
|
|
21
|
+
./venv/bin/ruff format . # Format
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Health Endpoints
|
|
25
|
+
- Local: http://localhost:8000/health
|
|
26
|
+
- Production: https://[your-api-url]/health
|
|
27
|
+
|
|
28
|
+
## Security — Known Exceptions
|
|
29
|
+
<!-- List any accepted pip-audit exceptions here -->
|
|
30
|
+
|
|
31
|
+
## Conventions
|
|
32
|
+
- Routes in routes/ or api/routes/
|
|
33
|
+
- Models in models/
|
|
34
|
+
- Tests in tests/unit/ and tests/integration/
|
|
35
|
+
- All routes require auth except /health
|
|
36
|
+
|
|
37
|
+
## Common CI Traps
|
|
38
|
+
|
|
39
|
+
**Integration tests not in the gate** — `pytest tests/unit/` is the default but `tests/integration/` must be added explicitly. If integration tests only run locally, regressions ship silently.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Wrong — misses integration tests
|
|
43
|
+
pytest tests/unit/
|
|
44
|
+
|
|
45
|
+
# Right — gate both
|
|
46
|
+
pytest tests/unit/ tests/integration/
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Docker builds referencing local packages** — if a package is injected as a dependency but not yet published to a registry, `npm install` / `pip install` will fail in CI with a 404. Fix: vendor the source directly into the build context or use a `file:` path.
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
# Wrong — package not on PyPI yet
|
|
53
|
+
deps = {"my-internal-pkg": "^0.1.0"}
|
|
54
|
+
|
|
55
|
+
# Right — vendor source into container
|
|
56
|
+
shutil.copy(LOCAL_SRC, build_dir / "my_internal_pkg.py")
|
|
57
|
+
```
|