aiblueprint-cli 1.4.80 → 1.4.82

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 (84) hide show
  1. package/README.md +21 -17
  2. package/agents-config/claude-config/scripts/statusline/data/.gitignore +8 -0
  3. package/agents-config/claude-config/scripts/statusline/data/.gitkeep +0 -0
  4. package/agents-config/claude-config/scripts/statusline/defaults.json +10 -10
  5. package/agents-config/claude-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
  6. package/agents-config/claude-config/scripts/statusline/src/index.ts +100 -9
  7. package/agents-config/claude-config/scripts/statusline/src/lib/config.ts +28 -2
  8. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
  9. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
  10. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
  11. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
  12. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
  13. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
  14. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
  15. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
  16. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
  17. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
  18. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
  19. package/agents-config/claude-config/scripts/statusline/src/lib/presets.ts +13 -13
  20. package/agents-config/claude-config/scripts/statusline/statusline.config.free.json +4 -1
  21. package/agents-config/claude-config/scripts/statusline/statusline.config.json +44 -23
  22. package/agents-config/scripts/statusline/data/.gitignore +8 -0
  23. package/agents-config/scripts/statusline/data/.gitkeep +0 -0
  24. package/agents-config/scripts/statusline/defaults.json +10 -10
  25. package/agents-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
  26. package/agents-config/scripts/statusline/src/index.ts +100 -9
  27. package/agents-config/scripts/statusline/src/lib/config.ts +28 -2
  28. package/agents-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
  29. package/agents-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
  30. package/agents-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
  31. package/agents-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
  32. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
  33. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
  34. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
  35. package/agents-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
  36. package/agents-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
  37. package/agents-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
  38. package/agents-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
  39. package/agents-config/scripts/statusline/src/lib/presets.ts +13 -13
  40. package/agents-config/scripts/statusline/statusline.config.free.json +4 -1
  41. package/agents-config/scripts/statusline/statusline.config.json +44 -23
  42. package/agents-config/skills/agents-managers/SKILL.md +1 -1
  43. package/agents-config/skills/agents-managers/references/writing-agent-prompts.md +1 -1
  44. package/agents-config/skills/appstore-connect/SKILL.md +104 -0
  45. package/agents-config/skills/appstore-connect/scripts/asc-api.mjs +88 -0
  46. package/agents-config/skills/appstore-connect-setup/SKILL.md +159 -0
  47. package/agents-config/{commands/prompts/create-vitejs-app.md → skills/create-vitejs-app/SKILL.md} +2 -1
  48. package/agents-config/skills/environments-manager/SKILL.md +6 -6
  49. package/agents-config/skills/environments-manager/examples/{claude/commands/dev.md → skills/dev/SKILL.md} +2 -1
  50. package/agents-config/skills/environments-manager/examples/{claude/commands/lint.md → skills/lint/SKILL.md} +2 -1
  51. package/agents-config/skills/environments-manager/examples/{claude/commands/test.md → skills/test/SKILL.md} +2 -1
  52. package/agents-config/skills/environments-manager/examples/{claude/commands/typecheck.md → skills/typecheck/SKILL.md} +2 -1
  53. package/agents-config/skills/environments-manager/references/claude.md +13 -9
  54. package/agents-config/skills/environments-manager/references/cursor.md +2 -2
  55. package/agents-config/skills/ios-testflight/SKILL.md +280 -0
  56. package/agents-config/{commands/prompts/nextjs-add-prisma-db.md → skills/nextjs-add-prisma-db/SKILL.md} +1 -0
  57. package/agents-config/{commands/prompts/nextjs-setup-better-auth.md → skills/nextjs-setup-better-auth/SKILL.md} +1 -0
  58. package/agents-config/{commands/prompts/nextjs-setup-project.md → skills/nextjs-setup-project/SKILL.md} +1 -0
  59. package/agents-config/{commands/prompts/prompt.md → skills/prompt/SKILL.md} +5 -0
  60. package/agents-config/{commands/prompts/saas-challenge-idea.md → skills/saas-challenge-idea/SKILL.md} +1 -0
  61. package/agents-config/{commands/prompts/saas-create-architecture.md → skills/saas-create-architecture/SKILL.md} +1 -0
  62. package/agents-config/{commands/prompts/saas-create-headline.md → skills/saas-create-headline/SKILL.md} +1 -0
  63. package/agents-config/{commands/prompts/saas-create-landing-copywritting.md → skills/saas-create-landing-copywritting/SKILL.md} +1 -0
  64. package/agents-config/{commands/prompts/saas-create-legals-docs.md → skills/saas-create-legals-docs/SKILL.md} +1 -0
  65. package/agents-config/{commands/prompts/saas-create-logos.md → skills/saas-create-logos/SKILL.md} +1 -0
  66. package/agents-config/{commands/prompts/saas-create-prd.md → skills/saas-create-prd/SKILL.md} +4 -3
  67. package/agents-config/{commands/prompts/saas-create-tasks.md → skills/saas-create-tasks/SKILL.md} +1 -0
  68. package/agents-config/{commands/prompts/saas-define-pricing.md → skills/saas-define-pricing/SKILL.md} +1 -0
  69. package/agents-config/{commands/prompts/saas-find-domain-name.md → skills/saas-find-domain-name/SKILL.md} +1 -0
  70. package/agents-config/{commands/prompts/saas-implement-landing-page.md → skills/saas-implement-landing-page/SKILL.md} +1 -0
  71. package/agents-config/{commands/prompts/setup-tmux.md → skills/setup-tmux/SKILL.md} +5 -0
  72. package/agents-config/{commands/prompts/tools.md → skills/tools/SKILL.md} +1 -0
  73. package/agents-config/skills/ultrathink/SKILL.md +1 -1
  74. package/agents-config/skills/use-style/SKILL.md +7 -4
  75. package/agents-config/skills/use-style/examples/luma.html +221 -0
  76. package/agents-config/skills/use-style/examples/testspirite.html +340 -0
  77. package/agents-config/skills/use-style/styles/ios-app.md +350 -0
  78. package/agents-config/skills/use-style/styles/luma.md +422 -0
  79. package/agents-config/skills/use-style/styles/new-york-times.md +1 -1
  80. package/agents-config/skills/use-style/styles/split-auth.md +2 -2
  81. package/agents-config/skills/use-style/styles/testspirite.md +397 -0
  82. package/dist/cli.js +17 -80
  83. package/package.json +1 -1
  84. package/agents-config/claude-config/scripts/.claude/commands/fix-on-my-computer.md +0 -87
@@ -0,0 +1,280 @@
1
+ ---
2
+ name: ios-testflight
3
+ description: Build a NowStack Mobile iOS app and upload it to TestFlight. Defaults to local `eas build --local`; use `--expo` only when the user explicitly wants an EAS cloud build.
4
+ ---
5
+
6
+ # iOS TestFlight - NowStack Mobile
7
+
8
+ Take a working NowStack Mobile app from local dev to an installable TestFlight build. Run phases A-D for setup only (stop before the build, report readiness); run all phases end to end to build and upload. This is the iOS beta surface; for App Store review use `ns-ios-distribute`.
9
+
10
+ Default build mode is **local Mac build** with `eas build --local`, so it does not consume Expo/EAS cloud build credits. If the user passes `--expo`, opt into the EAS cloud build path instead.
11
+
12
+ <objective>
13
+ Go from "the app works in the simulator" to "a build is installable from TestFlight" with maximum automation. Default to the local Mac build path to preserve Expo cloud credits; use `--expo` only when the user asks for a cloud build. Everything used here ships in this repo or is a public CLI (`eas-cli`, `asc`, `openssl`, `node`).
14
+
15
+ The proven flow (battle-tested on a real app built from this boilerplate):
16
+
17
+ 1. Create the EAS project and wire `easProjectId` into `site-config.ts`.
18
+ 2. Deploy Convex to production and set prod env vars.
19
+ 3. Point `eas.json` production env at the prod Convex URLs.
20
+ 4. Create Apple signing credentials (distribution cert + App Store provisioning profile) through the **App Store Connect API** using `mobile-app/scripts/asc-api.mjs` — no browser, no Apple ID 2FA.
21
+ 5. Run a local signed App Store IPA build with `eas build --local`, `credentialsSource: "local"`, and an explicit `--output /tmp/{slug}.ipa`.
22
+ 6. Upload the `.ipa` to TestFlight with `asc publish testflight` into an internal beta group.
23
+
24
+ The key insight: interactive `eas build` credential setup requires Apple ID 2FA and cannot be automated reliably. The ASC API key path avoids 2FA entirely, and local `eas build --local` avoids Expo cloud build credits while still using the same local signing files.
25
+ </objective>
26
+
27
+ <arguments>
28
+ - Default / no flag: run setup, local build, upload, and verify.
29
+ - `--expo`: use the EAS cloud build phase instead of local build. This consumes Expo/EAS build quota and requires explicit user confirmation.
30
+ - Setup-only requests (`ios setup`, "prepare TestFlight", "credentials only"): run phases A-D, then stop before any build/upload.
31
+ </arguments>
32
+
33
+ <prerequisites>
34
+ The user must have (ask once, as a group — these cannot be created by the agent):
35
+
36
+ 1. **Apple Developer Program membership** (paid, enrolled).
37
+ 2. **App Store Connect API key**: the `AuthKey_<KEY_ID>.p8` file, its key ID, and the team issuer ID. If unknown, run the `appstore-connect-setup` skill, or point the user to App Store Connect > Users and Access > Integrations > App Store Connect API (key must have Admin or App Manager role).
38
+ 3. **Expo account** logged in: `npx eas-cli@latest whoami` (else `npx eas-cli@latest login`).
39
+ 4. **App record in App Store Connect** for the bundle ID. The public API cannot create app records — if missing, the user creates it once at appstoreconnect.apple.com (My Apps > + > New App, selecting the bundle ID). Verify with Phase D step 1 and stop with clear instructions if absent.
40
+ 5. `asc` CLI installed (`brew install asc`) — used only for the final upload; everything else goes through `scripts/asc-api.mjs`.
41
+ 6. For the default local build: macOS with Xcode command line tools and CocoaPods (`xcodebuild -version`, `command -v pod`). If those are unavailable, stop and ask whether to use `--expo`.
42
+ </prerequisites>
43
+
44
+ <state_variables>
45
+ | Variable | Source |
46
+ | --- | --- |
47
+ | `{bundle_id}` | `SiteConfig.bundleId` |
48
+ | `{apple_team_id}` | `SiteConfig.appleTeamId` |
49
+ | `{eas_project_id}` | output of `eas project:init`, then written to `site-config.ts` |
50
+ | `{asc_key_id}` / `{asc_issuer_id}` / `{asc_p8_path}` | from the user / `appstore-connect-setup`. Never commit, never print. |
51
+ | `{convex_prod_url}` / `{convex_prod_site_url}` | from `npx convex deploy` output / Convex dashboard |
52
+ | `{asc_app_id}` | numeric app ID resolved from the bundle ID (Phase D) |
53
+ | `{build_mode}` | default `local`; `expo` only when the user passes `--expo` |
54
+ | `{ipa_path}` | `/tmp/{slug}.ipa` from local build, or downloaded cloud artifact |
55
+ </state_variables>
56
+
57
+ <critical_safety>
58
+ - Never commit or print `.p8` keys, `.p12` files, p12 passwords, provisioning profiles, or `credentials.json`. The repo `.gitignore` already excludes them — verify before any commit.
59
+ - Export ASC credentials as env vars for `scripts/asc-api.mjs`; do not write them into files inside the repo.
60
+ - Get explicit user confirmation before: creating Apple certificates (accounts have a low cert limit), using `--expo` cloud EAS builds (consumes build credits), and the TestFlight upload.
61
+ - Local builds do not consume Expo cloud credits, but they still sign a production App Store IPA and may increment the remote EAS build number when `appVersionSource` is `remote`.
62
+ - Builds bake env vars in permanently: confirm `eas.json` points at the PROD Convex deployment before building, or testers ship with a dev backend.
63
+ </critical_safety>
64
+
65
+ <phase n="A" title="Preflight">
66
+ From the repo root:
67
+
68
+ ```bash
69
+ npm run check-setup # must be free of errors (easProjectId warning is expected pre-init)
70
+ cd mobile-app && npx tsc --noEmit && npm run lint
71
+ npx eas-cli@latest whoami # Expo account logged in?
72
+ command -v asc && asc version
73
+ xcodebuild -version && command -v pod # required for default local builds
74
+ ```
75
+
76
+ Read `site-config.ts` and confirm with the user: `title`, `bundleId`, `appleTeamId`, payment product IDs. The bundle ID is permanent once the app record exists — it must be final now.
77
+
78
+ Export the ASC credentials for the rest of the session:
79
+
80
+ ```bash
81
+ export ASC_KEY_ID="<10-char key id>"
82
+ export ASC_ISSUER_ID="<issuer uuid>"
83
+ export ASC_P8_PATH="/path/to/AuthKey_<KEY_ID>.p8"
84
+ ```
85
+ </phase>
86
+
87
+ <phase n="B" title="EAS project init">
88
+ Skip if `easProjectId` in `site-config.ts` is already a real UUID.
89
+
90
+ ```bash
91
+ cd mobile-app
92
+ npx eas-cli@latest project:init --non-interactive --force
93
+ npx eas-cli@latest project:info
94
+ ```
95
+
96
+ Write the printed project ID into `site-config.ts > easProjectId`. Re-run `npm run check-setup` — the easProjectId warning must be gone.
97
+ </phase>
98
+
99
+ <phase n="C" title="Convex production + eas.json">
100
+ Follow `docs/production-checklist.md` stage 1. Summary:
101
+
102
+ ```bash
103
+ npx convex deploy -y
104
+ # prod env starts EMPTY — set every required var:
105
+ npx convex env set --prod SITE_URL "https://<the-app-domain>"
106
+ npx convex env set --prod BETTER_AUTH_SECRET "$(openssl rand -hex 32)" # fresh, never reuse dev
107
+ npx convex env set --prod RESEND_API_KEY "$(npx convex env get RESEND_API_KEY)"
108
+ npx convex env set --prod EMAIL_FROM "$(npx convex env get EMAIL_FROM)"
109
+ # if Apple Sign In is enabled: APPLE_CLIENT_ID = {bundle_id}, APPLE_CLIENT_SECRET copied from dev
110
+ # if Google Sign In is enabled: GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET copied from dev
111
+ npx convex env list --prod
112
+ ```
113
+
114
+ Then put the prod URLs into `mobile-app/eas.json > build.production`:
115
+
116
+ ```json
117
+ "production": {
118
+ "autoIncrement": true,
119
+ "credentialsSource": "local",
120
+ "env": {
121
+ "EXPO_PUBLIC_CONVEX_URL": "https://<prod-deployment>.convex.cloud",
122
+ "EXPO_PUBLIC_CONVEX_SITE_URL": "https://<prod-deployment>.convex.site"
123
+ }
124
+ }
125
+ ```
126
+
127
+ `credentialsSource: "local"` is what makes the build fully non-interactive (Phase E).
128
+ </phase>
129
+
130
+ <phase n="D" title="Apple signing credentials via ASC API">
131
+ All API calls use `node mobile-app/scripts/asc-api.mjs <METHOD> <path> [body.json]` with the env vars from Phase A. Work in a directory OUTSIDE the repo (e.g. `~/ios-credentials/<slug>/`) so nothing secret can be committed.
132
+
133
+ **1. Resolve the app record (hard gate):**
134
+
135
+ ```bash
136
+ node mobile-app/scripts/asc-api.mjs GET "/v1/apps?filter[bundleId]={bundle_id}"
137
+ ```
138
+
139
+ Empty `data` → STOP. Tell the user to create the app record at appstoreconnect.apple.com (My Apps > + > New App) with this exact bundle ID, then resume. Otherwise save `{asc_app_id}` = `data[0].id`.
140
+
141
+ **2. Bundle ID registration + capabilities:**
142
+
143
+ ```bash
144
+ node mobile-app/scripts/asc-api.mjs GET "/v1/bundleIds?filter[identifier]={bundle_id}"
145
+ # if missing, register it:
146
+ # POST /v1/bundleIds {"data":{"type":"bundleIds","attributes":{"identifier":"{bundle_id}","name":"{title}","platform":"IOS"}}}
147
+ node mobile-app/scripts/asc-api.mjs GET "/v1/bundleIds/<BUNDLE_DB_ID>/bundleIdCapabilities"
148
+ # enable missing capabilities the app uses (IN_APP_PURCHASE, APPLE_ID_AUTH, PUSH_NOTIFICATIONS):
149
+ # POST /v1/bundleIdCapabilities {"data":{"type":"bundleIdCapabilities","attributes":{"capabilityType":"APPLE_ID_AUTH"},"relationships":{"bundleId":{"data":{"type":"bundleIds","id":"<BUNDLE_DB_ID>"}}}}}
150
+ ```
151
+
152
+ **3. Distribution certificate.** First check for an existing one (Apple caps distribution certs at ~2-3 per account):
153
+
154
+ ```bash
155
+ node mobile-app/scripts/asc-api.mjs GET "/v1/certificates?filter[certificateType]=DISTRIBUTION"
156
+ ```
157
+
158
+ Reuse only if the user has its private key/.p12 locally. Otherwise create a new one (with user confirmation):
159
+
160
+ ```bash
161
+ openssl req -new -newkey rsa:2048 -nodes -keyout dist.key -out dist.csr \
162
+ -subj "/emailAddress=<user-email>/CN={title} Distribution/C=US"
163
+ node -e "const fs=require('fs');fs.writeFileSync('cert-req.json',JSON.stringify({data:{type:'certificates',attributes:{certificateType:'DISTRIBUTION',csrContent:fs.readFileSync('dist.csr','utf8')}}}))"
164
+ node mobile-app/scripts/asc-api.mjs POST /v1/certificates cert-req.json
165
+ # save body.data.id (cert id) and body.data.attributes.certificateContent (base64) -> dist.cer
166
+ ```
167
+
168
+ **4. App Store provisioning profile:**
169
+
170
+ ```bash
171
+ node -e "const fs=require('fs');fs.writeFileSync('profile-req.json',JSON.stringify({data:{type:'profiles',attributes:{name:'{title} AppStore',profileType:'IOS_APP_STORE'},relationships:{bundleId:{data:{type:'bundleIds',id:'<BUNDLE_DB_ID>'}},certificates:{data:[{type:'certificates',id:'<CERT_ID>'}]},devices:{data:[]}}}}))"
172
+ node mobile-app/scripts/asc-api.mjs POST /v1/profiles profile-req.json
173
+ # save body.data.attributes.profileContent (base64) -> profile.mobileprovision
174
+ ```
175
+
176
+ **5. Build the .p12 (the `-legacy` flag is mandatory — Apple tooling rejects OpenSSL 3.x default ciphers):**
177
+
178
+ ```bash
179
+ echo "<certificateContent-b64>" | base64 -d > dist.cer
180
+ P12PASS=$(openssl rand -hex 12)
181
+ openssl x509 -inform der -in dist.cer -out dist.pem 2>/dev/null || cp dist.cer dist.pem
182
+ openssl pkcs12 -export -in dist.pem -inkey dist.key -out dist.p12 \
183
+ -name "{title} Distribution" -passout pass:"$P12PASS" -legacy
184
+ echo "<profileContent-b64>" | base64 -d > appstore.mobileprovision
185
+ ```
186
+
187
+ **6. Wire into the project (gitignored paths only):**
188
+
189
+ ```bash
190
+ mkdir -p mobile-app/credentials
191
+ cp dist.p12 mobile-app/credentials/dist.p12
192
+ cp appstore.mobileprovision mobile-app/credentials/
193
+ node -e "const fs=require('fs');fs.writeFileSync('mobile-app/credentials.json',JSON.stringify({ios:{provisioningProfilePath:'credentials/appstore.mobileprovision',distributionCertificate:{path:'credentials/dist.p12',password:process.argv[1]}}},null,2))" "$P12PASS"
194
+ git check-ignore mobile-app/credentials.json mobile-app/credentials/dist.p12 # MUST print both paths
195
+ ```
196
+
197
+ Setup-only mode STOPS here — report readiness (app record, cert, profile, credentials.json, eas.json) and the next command.
198
+ </phase>
199
+
200
+ <phase n="E" title="Local iOS build (default)">
201
+ Default path. This uses the local Mac/Xcode toolchain and does **not** consume Expo cloud build credits. It still uses EAS CLI for config/versioning and local credentials for signing.
202
+
203
+ ```bash
204
+ cd mobile-app
205
+ npx eas-cli@latest build --platform ios --profile production \
206
+ --local --non-interactive --output /tmp/{slug}.ipa
207
+ ```
208
+
209
+ If the build fails in `expo doctor` due to patch-version mismatches, inspect the exact error. Do not blindly upgrade dependencies during a release unless the build is blocked; if blocked, run `npx expo install --check`, apply the minimal Expo SDK patch updates, rerun `npx tsc --noEmit && npm run lint`, then rebuild.
210
+
211
+ Local `autoIncrement` can skip build numbers if a canceled cloud build already reserved one. That is acceptable for App Store Connect.
212
+ </phase>
213
+
214
+ <phase n="E-expo" title="EAS cloud build (--expo only)">
215
+ Run this phase only when the user passes `--expo`, and confirm once because it consumes Expo/EAS build credits:
216
+
217
+ ```bash
218
+ cd mobile-app
219
+ npx eas-cli@latest build --platform ios --profile production --non-interactive --no-wait
220
+ ```
221
+
222
+ Poll until terminal state (FINISHED / ERRORED):
223
+
224
+ ```bash
225
+ npx eas-cli@latest build:list --platform ios --limit 1 --json --non-interactive
226
+ # or: npx eas-cli@latest build:view <BUILD_ID> --json
227
+ ```
228
+
229
+ On FINISHED, download the artifact:
230
+
231
+ ```bash
232
+ curl -sL -o /tmp/{slug}.ipa "<artifacts.buildUrl>"
233
+ ```
234
+ </phase>
235
+
236
+ <phase n="F" title="TestFlight upload">
237
+ **1. Internal beta group** (TestFlight needs a group; `asc publish testflight` fails without `--group`):
238
+
239
+ ```bash
240
+ node -e "const fs=require('fs');fs.writeFileSync('group-req.json',JSON.stringify({data:{type:'betaGroups',attributes:{name:'Internal',isInternalGroup:true,hasAccessToAllBuilds:true},relationships:{app:{data:{type:'apps',id:'{asc_app_id}'}}}}}))"
241
+ node mobile-app/scripts/asc-api.mjs POST /v1/betaGroups group-req.json
242
+ # 409 "already exists" is fine — fetch the id: GET "/v1/apps/{asc_app_id}/betaGroups"
243
+ ```
244
+
245
+ **2. Upload and wait for processing** (asc must be authenticated — `asc auth status --validate`, else `asc auth login` with the same ASC key):
246
+
247
+ ```bash
248
+ asc publish testflight --app "{asc_app_id}" --ipa /tmp/{slug}.ipa \
249
+ --group "<BETA_GROUP_ID>" --wait --timeout 45m
250
+ ```
251
+
252
+ **3. Add testers** (internal testers must be App Store Connect team members; external emails work via groups):
253
+
254
+ ```bash
255
+ node -e "const fs=require('fs');fs.writeFileSync('tester-req.json',JSON.stringify({data:{type:'betaTesters',attributes:{email:'<tester-email>'},relationships:{betaGroups:{data:[{type:'betaGroups',id:'<BETA_GROUP_ID>'}]}}}}))"
256
+ node mobile-app/scripts/asc-api.mjs POST /v1/betaTesters tester-req.json
257
+ ```
258
+
259
+ **4. Verify**: `asc status --app "{asc_app_id}" --output table` shows the build processed and attached to the group. Report build number, group, and tester list to the user.
260
+ </phase>
261
+
262
+ <failure_modes>
263
+ - **`.p12` rejected during signing** → it was exported without `-legacy`. Re-export: `openssl pkcs12 -in dist.p12 -nodes -out tmp.pem -passin pass:"$P12PASS" && openssl pkcs12 -export -in tmp.pem -out dist.p12 -passout pass:"$P12PASS" -legacy`.
264
+ - **Certificate creation returns 409 / limit reached** → list existing DISTRIBUTION certs; ask the user which to revoke (`DELETE /v1/certificates/<id>`) or whether they have its .p12 to reuse. Never revoke without confirmation — it breaks other apps signed with it.
265
+ - **Local build fails before Xcode archive** → verify macOS/Xcode/CocoaPods: `xcodebuild -version`, `xcode-select -p`, `command -v pod`. If unavailable and the user accepts cloud quota usage, rerun with `--expo`.
266
+ - **Local build fails asking for credentials** → `credentialsSource: "local"` is missing in `eas.json`, or `credentials.json` paths are wrong (they are relative to `mobile-app/`).
267
+ - **`--expo` cloud build fails asking for credentials** → same credential checks as local, then rerun cloud build.
268
+ - **`asc publish testflight` fails with "--group is required"** → create the beta group first (Phase F step 1).
269
+ - **Upload rejected: missing export compliance** → answer the encryption question in App Store Connect once, or add `"ITSAppUsesNonExemptEncryption": false` to `infoPlist` in `mobile-app/app.config.ts` so future builds skip it.
270
+ - **App opens but can't reach backend** → build was made before `eas.json` had prod URLs, or prod Convex env vars are missing (`npx convex env list --prod`). Rebuild after fixing — env is baked at build time.
271
+ - **User insists on EAS-managed credentials (Apple ID login)** → that flow requires interactive 2FA and cannot run with `--non-interactive`. Run `npx eas-cli@latest credentials` in a real terminal with the user present, then build. Do not attempt to script the 2FA prompt.
272
+ </failure_modes>
273
+
274
+ <success_metrics>
275
+ - `npm run check-setup` passes with a real `easProjectId`.
276
+ - Default local build produces `/tmp/{slug}.ipa` without any interactive prompt; `--expo` cloud builds reach FINISHED.
277
+ - The build shows as processed in TestFlight, attached to a beta group with at least one tester.
278
+ - The TestFlight app signs in and talks to the PROD Convex deployment.
279
+ - `git status` shows no credential files staged; nothing secret printed in the transcript.
280
+ </success_metrics>
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: nextjs-add-prisma-db
2
3
  description: Setup Prisma ORM with PostgreSQL in a Next.js project with schema, migrations, and seed data
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: nextjs-setup-better-auth
2
3
  description: Setup Better Auth with Email OTP authentication and shadcn/ui components in a Next.js project
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: nextjs-setup-project
2
3
  description: Setup a complete Next.js project with TypeScript, Tailwind, shadcn/ui, TanStack Query, and theme support
3
4
  ---
4
5
 
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: prompt
3
+ description: Create minimalist SVG logo variations for an app after collecting logo direction from the user.
4
+ ---
5
+
1
6
  You are an expert logo designer. I want you to create minimalist SVG logo variations for my app.
2
7
 
3
8
  Use extended thinking to deeply analyze my app and create the best logos possible.
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-challenge-idea
2
3
  description: Challenge and validate a business idea through competitive research and brutally honest market analysis
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-create-architecture
2
3
  description: Design technical architecture for a Next.js SaaS application based on PRD requirements
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-create-headline
2
3
  description: Generate clickbait headlines that sound too good to be true for your landing page
3
4
  arguments:
4
5
  - name: product-description
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-create-landing-copywritting
2
3
  description: Generate conversion-focused landing page copywriting based on PRD and marketing context
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-create-legals-docs
2
3
  description: Generate GDPR-compliant Privacy Policy and Terms of Service based on product and data practices
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-create-logos
2
3
  description: Generate 20 abstract SVG logo variations with brainstorming and HTML showcase
3
4
  arguments:
4
5
  - name: app-name
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-create-prd
2
3
  description: Create a lean Product Requirements Document through interactive discovery conversation
3
4
  ---
4
5
 
@@ -155,9 +156,9 @@ Explicitly NOT building in MVP:
155
156
 
156
157
  5. **Suggest next steps**:
157
158
  > "PRD created! Next steps in order:
158
- > 1. `/prompts/saas-create-architecture` - Design technical architecture
159
- > 2. `/prompts/saas-define-pricing` - Define pricing strategy
160
- > 3. `/prompts/saas-create-landing-copy` - Create landing page copy"
159
+ > 1. `saas-create-architecture` skill - Design technical architecture
160
+ > 2. `saas-define-pricing` skill - Define pricing strategy
161
+ > 3. `saas-create-landing-copywritting` skill - Create landing page copy"
161
162
  </process>
162
163
 
163
164
  <constraints>
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-create-tasks
2
3
  description: Generate implementation task files from PRD and Architecture documents
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-define-pricing
2
3
  description: Create a data-driven SaaS pricing strategy with competitor research and value-based pricing
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-find-domain-name
2
3
  description: Generate and validate domain name options with availability checking for brand and utility domains
3
4
  ---
4
5
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: saas-implement-landing-page
2
3
  description: Implement a production-ready landing page from specification using shadcn/ui components
3
4
  ---
4
5
 
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: setup-tmux
3
+ description: Install and configure tmux with Ghostty on macOS using a minimalist keyboard-first setup.
4
+ ---
5
+
1
6
  Install and configure tmux with Ghostty on macOS. This sets up a minimalist tmux with direct keyboard shortcuts (no prefix needed for common actions), auto-naming tabs, session persistence, and a clean status bar.
2
7
 
3
8
  ## Step 1: Install tmux
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: tools
2
3
  description: Reference document listing all recommended tools and libraries for AIBlueprint development
3
4
  ---
4
5
 
@@ -25,7 +25,7 @@ Take a deep breath. We're not here to write code. We're here to make a dent in t
25
25
 
26
26
  ## Your Tools Are Instruments
27
27
 
28
- - Use bash tools, MCP servers, and custom commands like a virtuoso
28
+ - Use bash tools, MCP servers, and reusable skills like a virtuoso
29
29
  - Git history tells the story—read it, learn from it, honor it
30
30
  - Multiple Claude instances aren't redundancy—they're collaboration between perspectives
31
31
 
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  name: use-style
3
- description: Apply named visual style guides to landing pages and UI. Use for $use-style, /usestyle, list styles, or styles like grid, vercel-simple, stripe, linear, raycast, gumroad, dusk, or split-auth.
3
+ description: Apply named visual style guides to landing pages, app shells, and UI. Use for $use-style, /useskill, list styles, or styles like ios-app, grid, vercel-simple, stripe, linear, raycast, gumroad, dusk, luma, split-auth, or testspirite.
4
4
  ---
5
5
 
6
6
  Load and apply a named style before designing or implementing any UI.
7
7
 
8
8
  ## Invocation
9
9
 
10
- - Explicit: `$use-style grid`, `/usestyle split-auth`, `/usestyle list`, or "use the grid style"
11
- - Implicit: user references `/aiblueprint`, `/agents`, `/aibuilder`, "grid theme", Vercel, Geist, a minimalist dark tool UI, Stripe / fintech / checkout / dashboard UI, Linear / issue tracker / app-shell sidebar UI, NYT / newspaper / editorial / broadsheet / magazine layouts, Anthropic / Claude / warm cream AI-lab pages, Gumroad / neo-brutalist / loud commerce / bold yellow-pink pages, Raycast / glossy dark / glow gradients / floating glass nav / premium product marketing, or Dusk / Attio / dark CRM dashboard floating on a twilight backdrop / blue data viz / colorful category pills
10
+ - Explicit: `$use-style ios-app`, `$use-style grid`, `/useskill split-auth`, `/useskill list`, or "use the grid style"
11
+ - Implicit: user references NowStack Mobile, Ink & Spark, an iOS app shell, Expo / React Native / NativeWind app UI, `/aiblueprint`, `/agents`, `/aibuilder`, "grid theme", Vercel, Geist, a minimalist dark tool UI, Stripe / fintech / checkout / dashboard UI, Linear / issue tracker / app-shell sidebar UI, NYT / newspaper / editorial / broadsheet / magazine layouts, Anthropic / Claude / warm cream AI-lab pages, Gumroad / neo-brutalist / loud commerce / bold yellow-pink pages, Raycast / glossy dark / glow gradients / floating glass nav / premium product marketing, Dusk / Attio / dark CRM dashboard floating on a twilight backdrop / blue data viz / colorful category pills, Luma / lu.ma / event timeline / calendar / RSVP / discover / a dark consumer events-and-calendar app with photo-led cards, a top teal aurora, and a white pill button, or TestSprite / TestSpirite / calm light dev-tool dashboard / warm paper canvas with one forest-green accent / grouped sidebar + promo rail / isometric line-art empty states
12
12
 
13
- Parse the style name from `$ARGUMENTS` or the message. Treat `split-auth`, `signin 2pages`, `signin-2pages`, `sign-in 2 pages`, `auth split`, and `two-column auth` as `split-auth`. Treat `list`, `styles`, `available styles`, and missing style names with no implicit match as a request to list available styles and ask the user to choose before designing. Default to `grid` for Codelynx product landings. Default to `vercel-simple` when the user references Vercel, Geist, or minimalist dark developer tools. Default to `linear` when the user references Linear, an issue tracker, or a dense sidebar + list + detail app shell. Default to `new-york-times` when the user references a newspaper, broadsheet, magazine, or serif editorial layout. Default to `anthropic` when the user references Anthropic, Claude, or a warm cream + serif AI-lab aesthetic. Default to `gumroad` when the user references Gumroad, neo-brutalism, hard offset shadows, or a loud yellow/pink bordered look. Default to `raycast` when the user references Raycast, a glossy dark page with glow gradients, a floating glass nav, or premium dark product marketing. Default to `dusk` when the user references Attio, a dark CRM/data dashboard floating on a twilight/aurora backdrop, vivid-blue charts, or colorful category pills. Default to `split-auth` when the user asks for a polished login, sign-in, signup, OAuth, magic-code, or password-reset page with a two-panel visual layout.
13
+ Parse the style name from `$ARGUMENTS` or the message. Treat `ios`, `ios app`, `ios-app`, `iphone app`, `nowstack-mobile`, `nowstack mobile`, and `ink & spark` as `ios-app`. Treat `split-auth`, `signin 2pages`, `signin-2pages`, `sign-in 2 pages`, `auth split`, and `two-column auth` as `split-auth`. Treat `testsprite`, `test-sprite`, and `test sprite` as `testspirite`. Treat `luma`, `lu.ma`, and `luma.com` as `luma`. Treat `list`, `styles`, `available styles`, and missing style names with no implicit match as a request to list available styles and ask the user to choose before designing. Default to `ios-app` when the user references NowStack Mobile, Ink & Spark, an iOS app shell, Expo, React Native, NativeWind, or OS-native tabs. Default to `grid` for Codelynx product landings. Default to `vercel-simple` when the user references Vercel, Geist, or minimalist dark developer tools. Default to `linear` when the user references Linear, an issue tracker, or a dense sidebar + list + detail app shell. Default to `new-york-times` when the user references a newspaper, broadsheet, magazine, or serif editorial layout. Default to `anthropic` when the user references Anthropic, Claude, or a warm cream + serif AI-lab aesthetic. Default to `gumroad` when the user references Gumroad, neo-brutalism, hard offset shadows, or a loud yellow/pink bordered look. Default to `raycast` when the user references Raycast, a glossy dark page with glow gradients, a floating glass nav, or premium dark product marketing. Default to `dusk` when the user references Attio, a dark CRM/data dashboard floating on a twilight/aurora backdrop, vivid-blue charts, or colorful category pills. Default to `split-auth` when the user asks for a polished login, sign-in, signup, OAuth, magic-code, or password-reset page with a two-panel visual layout. Default to `testspirite` when the user references TestSprite, a calm light dev-tool dashboard, a warm paper canvas with a single forest-green accent, a grouped sidebar with a free-trial/upgrade promo rail, or isometric line-art empty states. Default to `luma` when the user references Luma, lu.ma, an event timeline/feed, a calendar or RSVP/invite app, a discover page, or a dark consumer events UI with photo-led cards, a top teal aurora, and a white pill button.
14
14
 
15
15
  If the parsed style is `list`, or if no style can be inferred, do not load a style file. Reply with the available styles table below, add one short line asking which style to use, and stop until the user chooses.
16
16
 
@@ -28,6 +28,7 @@ If the parsed style is `list`, or if no style can be inferred, do not load a sty
28
28
 
29
29
  | Style | File | Vibe |
30
30
  |-------|------|------|
31
+ | `ios-app` | `styles/ios-app.md` | NowStack Mobile Ink & Spark. iOS/Expo app UI with monochrome ink/paper, one yellow `#FFE040` spark, NativeWind tokens, OS-native tabs, flat hairline cards. |
31
32
  | `grid` | `styles/grid.md` | Blueprint landing. Square geometry, 1px borders, mono data, condensed display type. |
32
33
  | `vercel-simple` | `styles/vercel-simple.md` | Vercel dark mode. Black canvas, Geist + mono, 1px `#333` borders, minimal accent. |
33
34
  | `stripe` | `styles/stripe.md` | Stripe fintech UI. Pale `#f6f9fc` canvas, white cards on soft shadows, blurple `#635BFF` accent, green CTA, rounded geometry. |
@@ -37,7 +38,9 @@ If the parsed style is `list`, or if no style can be inferred, do not load a sty
37
38
  | `gumroad` | `styles/gumroad.md` | Loud neo-brutalist commerce. Yellow `#ffc900` + pink `#ff90e8`, thick black borders, hard offset shadows `4px 4px 0 #000`, flat fills, bold geometric sans, pill buttons. Light marketplace + dark dashboard surfaces. |
38
39
  | `raycast` | `styles/raycast.md` | Glossy dark product marketing. Near-black `#0a0a0a` + red `#ff6363` glow, floating glass nav (`backdrop-blur`), oversized bold pricing, large-radius `rounded-3xl` cards, soft glow over hard shadows. |
39
40
  | `dusk` | `styles/dusk.md` | Refined dark data app (Attio-style). Rounded near-black window floating on a twilight gradient backdrop, vivid sky-blue `#38bdf8` charts, `#3b6eff` primary, colorful category pills, Inter + mono numbers. |
41
+ | `luma` | `styles/luma.md` | Dark consumer events + calendar app (Luma/lu.ma). Near-black `#0a0a0b` canvas with one soft teal aurora at the top, near-borderless `rounded-2xl` photo-led cards, white pill primary buttons, blue `#2f6bff` status pills, gold `#f5b13d` event times, centered timeline column. |
40
42
  | `split-auth` | `styles/split-auth.md` | Two-column auth and OAuth pages. Left visual brand panel with optimized bitmap background, right clean form panel, monochrome social buttons, compact code inputs. |
43
+ | `testspirite` | `styles/testspirite.md` | Calm light dev-tool app shell (TestSprite). Warm paper-white `#f7f7f3` canvas, one forest-green `#3d7c4e` accent, grouped sidebar + promo rail, soft `rounded-xl` cards on quiet borders, pale-green `#eaf3ea` status pills, isometric line-art empty states. |
41
44
 
42
45
  Add new styles as `styles/<name>.md` and register them here.
43
46