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.
- package/README.md +21 -17
- package/agents-config/claude-config/scripts/statusline/data/.gitignore +8 -0
- package/agents-config/claude-config/scripts/statusline/data/.gitkeep +0 -0
- package/agents-config/claude-config/scripts/statusline/defaults.json +10 -10
- package/agents-config/claude-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
- package/agents-config/claude-config/scripts/statusline/src/index.ts +100 -9
- package/agents-config/claude-config/scripts/statusline/src/lib/config.ts +28 -2
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/presets.ts +13 -13
- package/agents-config/claude-config/scripts/statusline/statusline.config.free.json +4 -1
- package/agents-config/claude-config/scripts/statusline/statusline.config.json +44 -23
- package/agents-config/scripts/statusline/data/.gitignore +8 -0
- package/agents-config/scripts/statusline/data/.gitkeep +0 -0
- package/agents-config/scripts/statusline/defaults.json +10 -10
- package/agents-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
- package/agents-config/scripts/statusline/src/index.ts +100 -9
- package/agents-config/scripts/statusline/src/lib/config.ts +28 -2
- package/agents-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
- package/agents-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
- package/agents-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
- package/agents-config/scripts/statusline/src/lib/presets.ts +13 -13
- package/agents-config/scripts/statusline/statusline.config.free.json +4 -1
- package/agents-config/scripts/statusline/statusline.config.json +44 -23
- package/agents-config/skills/agents-managers/SKILL.md +1 -1
- package/agents-config/skills/agents-managers/references/writing-agent-prompts.md +1 -1
- package/agents-config/skills/appstore-connect/SKILL.md +104 -0
- package/agents-config/skills/appstore-connect/scripts/asc-api.mjs +88 -0
- package/agents-config/skills/appstore-connect-setup/SKILL.md +159 -0
- package/agents-config/{commands/prompts/create-vitejs-app.md → skills/create-vitejs-app/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/SKILL.md +6 -6
- package/agents-config/skills/environments-manager/examples/{claude/commands/dev.md → skills/dev/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/lint.md → skills/lint/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/test.md → skills/test/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/typecheck.md → skills/typecheck/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/references/claude.md +13 -9
- package/agents-config/skills/environments-manager/references/cursor.md +2 -2
- package/agents-config/skills/ios-testflight/SKILL.md +280 -0
- package/agents-config/{commands/prompts/nextjs-add-prisma-db.md → skills/nextjs-add-prisma-db/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/nextjs-setup-better-auth.md → skills/nextjs-setup-better-auth/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/nextjs-setup-project.md → skills/nextjs-setup-project/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/prompt.md → skills/prompt/SKILL.md} +5 -0
- package/agents-config/{commands/prompts/saas-challenge-idea.md → skills/saas-challenge-idea/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-architecture.md → skills/saas-create-architecture/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-headline.md → skills/saas-create-headline/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-landing-copywritting.md → skills/saas-create-landing-copywritting/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-legals-docs.md → skills/saas-create-legals-docs/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-logos.md → skills/saas-create-logos/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-prd.md → skills/saas-create-prd/SKILL.md} +4 -3
- package/agents-config/{commands/prompts/saas-create-tasks.md → skills/saas-create-tasks/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-define-pricing.md → skills/saas-define-pricing/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-find-domain-name.md → skills/saas-find-domain-name/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-implement-landing-page.md → skills/saas-implement-landing-page/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/setup-tmux.md → skills/setup-tmux/SKILL.md} +5 -0
- package/agents-config/{commands/prompts/tools.md → skills/tools/SKILL.md} +1 -0
- package/agents-config/skills/ultrathink/SKILL.md +1 -1
- package/agents-config/skills/use-style/SKILL.md +7 -4
- package/agents-config/skills/use-style/examples/luma.html +221 -0
- package/agents-config/skills/use-style/examples/testspirite.html +340 -0
- package/agents-config/skills/use-style/styles/ios-app.md +350 -0
- package/agents-config/skills/use-style/styles/luma.md +422 -0
- package/agents-config/skills/use-style/styles/new-york-times.md +1 -1
- package/agents-config/skills/use-style/styles/split-auth.md +2 -2
- package/agents-config/skills/use-style/styles/testspirite.md +397 -0
- package/dist/cli.js +17 -80
- package/package.json +1 -1
- 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,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.
|
package/agents-config/{commands/prompts/saas-create-prd.md → skills/saas-create-prd/SKILL.md}
RENAMED
|
@@ -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.
|
|
159
|
-
> 2.
|
|
160
|
-
> 3.
|
|
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,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
|
|
@@ -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
|
|
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, /
|
|
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`, `/
|
|
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,
|
|
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
|
|