arcane-cli 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +253 -253
- package/dist/assets/.arcane/agents/agent-policies-template.md +414 -414
- package/dist/assets/.arcane/governance/agent-policies.md +414 -414
- package/dist/assets/.arcane/governance/agent-work-queue-model.md +61 -61
- package/dist/assets/.arcane/governance/cicd-standards.md +227 -227
- package/dist/assets/.arcane/governance/development-methodology.md +384 -384
- package/dist/assets/.arcane/governance/git-conventions.md +759 -759
- package/dist/assets/.arcane/governance/naming-conventions.md +142 -142
- package/dist/assets/.arcane/governance/new-business-setup.md +182 -182
- package/dist/assets/.arcane/governance/portable-bootstrap.md +101 -101
- package/dist/assets/.arcane/governance/product-excellence-standards.md +211 -211
- package/dist/assets/.arcane/governance/testing-standards.md +158 -158
- package/dist/assets/.arcane/governance/universal-agent-rules.md +108 -108
- package/dist/assets/.arcane/image-prompts/adelaide-image-prompt.md +140 -140
- package/dist/assets/.arcane/image-prompts/alexander-image-prompt.md +138 -138
- package/dist/assets/.arcane/image-prompts/bess-image-prompt.md +139 -139
- package/dist/assets/.arcane/image-prompts/circe-image-prompt.md +143 -143
- package/dist/assets/.arcane/image-prompts/custodio-image-prompt.md +140 -140
- package/dist/assets/.arcane/image-prompts/iris-image-prompt.md +139 -139
- package/dist/assets/.arcane/image-prompts/kellar-image-prompt.md +141 -141
- package/dist/assets/.arcane/image-prompts/lafayette-image-prompt.md +140 -140
- package/dist/assets/.arcane/image-prompts/lince-image-prompt.md +142 -142
- package/dist/assets/.arcane/image-prompts/mercurio-image-prompt.md +140 -140
- package/dist/assets/.arcane/image-prompts/merlin-image-prompt.md +139 -139
- package/dist/assets/.arcane/image-prompts/prospero-image-prompt.md +141 -141
- package/dist/assets/.claude/commands/spell-enchant.md +9 -9
- package/dist/assets/.github/agents/adelaide.agent.md +44 -44
- package/dist/assets/.github/agents/alexander.agent.md +43 -43
- package/dist/assets/.github/agents/bess.agent.md +42 -42
- package/dist/assets/.github/agents/circe.agent.md +43 -43
- package/dist/assets/.github/agents/custodio.agent.md +44 -44
- package/dist/assets/.github/agents/iris.agent.md +43 -43
- package/dist/assets/.github/agents/kellar.agent.md +43 -43
- package/dist/assets/.github/agents/lafayette.agent.md +42 -42
- package/dist/assets/.github/agents/lince.agent.md +43 -43
- package/dist/assets/.github/agents/mercurio.agent.md +43 -43
- package/dist/assets/.github/agents/merlin.agent.md +44 -44
- package/dist/assets/.github/agents/prospero.agent.md +43 -43
- package/dist/assets/.github/prompts/spell-close-session.prompt.md +17 -5
- package/dist/assets/.github/prompts/spell-commit-work.prompt.md +24 -6
- package/dist/assets/.github/prompts/spell-create-pull-request.prompt.md +12 -3
- package/dist/assets/.github/prompts/spell-enchant.prompt.md +385 -385
- package/dist/assets/.github/prompts/spell-feedback.prompt.md +113 -113
- package/dist/assets/.github/prompts/spell-full-cycle.prompt.md +202 -201
- package/dist/assets/.github/prompts/spell-implement.prompt.md +101 -101
- package/dist/assets/.github/prompts/spell-open-session.prompt.md +20 -5
- package/dist/assets/.github/prompts/spell-scope.prompt.md +263 -263
- package/dist/assets/agents/architecture-lead.yaml +61 -61
- package/dist/assets/agents/collaborator.yaml +59 -59
- package/dist/assets/agents/devops.yaml +60 -60
- package/dist/assets/agents/frontend-dev.yaml +60 -60
- package/dist/assets/agents/fullstack-dev.yaml +59 -59
- package/dist/assets/agents/marketing-strategist.yaml +60 -60
- package/dist/assets/agents/mobile-dev.yaml +59 -59
- package/dist/assets/agents/operations-comms.yaml +58 -58
- package/dist/assets/agents/orchestrator.yaml +60 -60
- package/dist/assets/agents/qa-lead.yaml +60 -60
- package/dist/assets/agents/research-analyst.yaml +59 -59
- package/dist/assets/agents/security-ops.yaml +61 -61
- package/dist/index.js +323 -7
- package/dist/index.js.map +1 -1
- package/package.json +72 -72
- package/dist/assets/.claude/commands/spell-eas-ios-deploy.md +0 -9
- package/dist/assets/.github/prompts/spell-eas-ios-deploy.prompt.md +0 -183
package/package.json
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "arcane-cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Arcane framework CLI — scaffold and manage governance files in consuming repositories",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"arcane",
|
|
7
|
-
"cli",
|
|
8
|
-
"sdlc",
|
|
9
|
-
"methodology",
|
|
10
|
-
"governance",
|
|
11
|
-
"ai-agents",
|
|
12
|
-
"agent",
|
|
13
|
-
"spell",
|
|
14
|
-
"scaffolding",
|
|
15
|
-
"templates"
|
|
16
|
-
],
|
|
17
|
-
"homepage": "https://github.com/codemagicianhq/arcane#readme",
|
|
18
|
-
"bugs": "https://github.com/codemagicianhq/arcane/issues",
|
|
19
|
-
"repository": {
|
|
20
|
-
"type": "git",
|
|
21
|
-
"url": "git+https://github.com/codemagicianhq/arcane.git"
|
|
22
|
-
},
|
|
23
|
-
"license": "MIT",
|
|
24
|
-
"author": "Code Magician LLC",
|
|
25
|
-
"type": "module",
|
|
26
|
-
"bin": {
|
|
27
|
-
"spell": "dist/index.js",
|
|
28
|
-
"arcane": "dist/index.js"
|
|
29
|
-
},
|
|
30
|
-
"files": [
|
|
31
|
-
"dist/"
|
|
32
|
-
],
|
|
33
|
-
"engines": {
|
|
34
|
-
"node": ">=18"
|
|
35
|
-
},
|
|
36
|
-
"scripts": {
|
|
37
|
-
"build": "tsup && tsx scripts/copy-assets.ts",
|
|
38
|
-
"test": "vitest run",
|
|
39
|
-
"test:watch": "vitest",
|
|
40
|
-
"test:coverage": "vitest run --coverage",
|
|
41
|
-
"lint": "eslint src test",
|
|
42
|
-
"typecheck": "tsc --noEmit",
|
|
43
|
-
"check:version-bump": "tsx scripts/check-version-bump.ts",
|
|
44
|
-
"prepare": "husky"
|
|
45
|
-
},
|
|
46
|
-
"dependencies": {
|
|
47
|
-
"@inquirer/prompts": "^7.10.1",
|
|
48
|
-
"chalk": "^5.6.2",
|
|
49
|
-
"commander": "^12.0.0",
|
|
50
|
-
"gradient-string": "^3.0.0",
|
|
51
|
-
"yaml": "^2.8.3"
|
|
52
|
-
},
|
|
53
|
-
"devDependencies": {
|
|
54
|
-
"@eslint/js": "^9.0.0",
|
|
55
|
-
"@types/gradient-string": "^1.1.6",
|
|
56
|
-
"@types/node": "^20.0.0",
|
|
57
|
-
"@vitest/coverage-v8": "^3.2.7",
|
|
58
|
-
"eslint": "^9.0.0",
|
|
59
|
-
"husky": "^9.1.7",
|
|
60
|
-
"tsup": "^8.0.0",
|
|
61
|
-
"tsx": "^4.7.0",
|
|
62
|
-
"typescript": "^5.4.0",
|
|
63
|
-
"typescript-eslint": "^8.0.0",
|
|
64
|
-
"vitest": "^3.2.7"
|
|
65
|
-
},
|
|
66
|
-
"overrides": {
|
|
67
|
-
"esbuild": "^0.28.1"
|
|
68
|
-
},
|
|
69
|
-
"publishConfig": {
|
|
70
|
-
"registry": "https://registry.npmjs.org/"
|
|
71
|
-
}
|
|
72
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "arcane-cli",
|
|
3
|
+
"version": "0.15.0",
|
|
4
|
+
"description": "Arcane framework CLI — scaffold and manage governance files in consuming repositories",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"arcane",
|
|
7
|
+
"cli",
|
|
8
|
+
"sdlc",
|
|
9
|
+
"methodology",
|
|
10
|
+
"governance",
|
|
11
|
+
"ai-agents",
|
|
12
|
+
"agent",
|
|
13
|
+
"spell",
|
|
14
|
+
"scaffolding",
|
|
15
|
+
"templates"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/codemagicianhq/arcane#readme",
|
|
18
|
+
"bugs": "https://github.com/codemagicianhq/arcane/issues",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/codemagicianhq/arcane.git"
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"author": "Code Magician LLC",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"bin": {
|
|
27
|
+
"spell": "dist/index.js",
|
|
28
|
+
"arcane": "dist/index.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist/"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsup && tsx scripts/copy-assets.ts",
|
|
38
|
+
"test": "vitest run",
|
|
39
|
+
"test:watch": "vitest",
|
|
40
|
+
"test:coverage": "vitest run --coverage",
|
|
41
|
+
"lint": "eslint src test",
|
|
42
|
+
"typecheck": "tsc --noEmit",
|
|
43
|
+
"check:version-bump": "tsx scripts/check-version-bump.ts",
|
|
44
|
+
"prepare": "husky"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@inquirer/prompts": "^7.10.1",
|
|
48
|
+
"chalk": "^5.6.2",
|
|
49
|
+
"commander": "^12.0.0",
|
|
50
|
+
"gradient-string": "^3.0.0",
|
|
51
|
+
"yaml": "^2.8.3"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@eslint/js": "^9.0.0",
|
|
55
|
+
"@types/gradient-string": "^1.1.6",
|
|
56
|
+
"@types/node": "^20.0.0",
|
|
57
|
+
"@vitest/coverage-v8": "^3.2.7",
|
|
58
|
+
"eslint": "^9.0.0",
|
|
59
|
+
"husky": "^9.1.7",
|
|
60
|
+
"tsup": "^8.0.0",
|
|
61
|
+
"tsx": "^4.7.0",
|
|
62
|
+
"typescript": "^5.4.0",
|
|
63
|
+
"typescript-eslint": "^8.0.0",
|
|
64
|
+
"vitest": "^3.2.7"
|
|
65
|
+
},
|
|
66
|
+
"overrides": {
|
|
67
|
+
"esbuild": "^0.28.1"
|
|
68
|
+
},
|
|
69
|
+
"publishConfig": {
|
|
70
|
+
"registry": "https://registry.npmjs.org/"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Spell — EAS iOS Deploy
|
|
3
|
-
description: Ship an Expo/React Native app to TestFlight and the App Store via EAS Build + EAS Submit — initial one-time setup and every deploy after that
|
|
4
|
-
argument-hint: What you need — "initial setup", "deploy" (cut + submit a new build), or a specific symptom (e.g. "capability sync failed", "build stuck")
|
|
5
|
-
agent: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Executive Summary
|
|
9
|
-
|
|
10
|
-
- This prompt ships an Expo/React Native app to Apple TestFlight/App Store using **EAS Build + EAS
|
|
11
|
-
Submit** — Expo's cloud build service. No local Mac or Xcode install is required.
|
|
12
|
-
- Covers two flows: **initial one-time setup** (Apple enrollment → credentials → first build →
|
|
13
|
-
first submit) and **repeat deployments** (the two-command loop you run for every release after that).
|
|
14
|
-
- Produces a signed production build uploaded to App Store Connect, visible in TestFlight once Apple
|
|
15
|
-
finishes processing it, with the app's native build number bumped and committed to the repo.
|
|
16
|
-
- **Not** a general CI/CD ship spell — see `spell-ship` for the branch-merge / backend-deploy
|
|
17
|
-
lifecycle. This spell is the mobile-app-store-specific leaf step, and it is scoped deliberately to
|
|
18
|
-
the **EAS Build/Submit** tech stack — it does not cover local Xcode builds, Xcode Cloud, or Fastlane.
|
|
19
|
-
A team on one of those instead needs a different spell; the steps below assume EAS.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
Ship the app to TestFlight/App Store, or troubleshoot an EAS deploy issue, per the request in the
|
|
24
|
-
prompt argument. If no argument was given, ask whether this is initial setup or a repeat deploy.
|
|
25
|
-
|
|
26
|
-
### Placeholders
|
|
27
|
-
|
|
28
|
-
Resolve each from `.arcane.json` / the project's `app.json` / `eas.json` / frontmatter; **ask the
|
|
29
|
-
user rather than guessing or inventing a value** if any is unset. Never proceed with an unresolved
|
|
30
|
-
placeholder still in a command you're about to run.
|
|
31
|
-
|
|
32
|
-
| Placeholder | What it is | Where it lives once resolved |
|
|
33
|
-
| --- | --- | --- |
|
|
34
|
-
| `{APP_NAME}` | Display name shown on the App Store / home screen | `app.json` → `expo.name` |
|
|
35
|
-
| `{BUNDLE_ID}` | iOS bundle identifier (and Android package, if shipping both) | `app.json` → `expo.ios.bundleIdentifier` |
|
|
36
|
-
| `{APPLE_TEAM_ID}` | Apple Developer Team ID | `eas.json` → `submit.production.ios.appleTeamId` |
|
|
37
|
-
| `{ASC_APP_ID}` | Numeric App Store Connect app ID | `eas.json` → `submit.production.ios.ascAppId` |
|
|
38
|
-
| `{APPLE_ID_EMAIL}` | Apple ID used for the Developer/ASC account | `eas.json` → `submit.production.ios.appleId` |
|
|
39
|
-
| `{EAS_PROJECT_ID}` | EAS/Expo project ID | `app.json` → `expo.extra.eas.projectId` |
|
|
40
|
-
| `{EAS_ACCOUNT}` | EAS/Expo account or org slug the project lives under | `eas build`/`eas submit` output, or `eas whoami` |
|
|
41
|
-
|
|
42
|
-
### Context files this spell reads
|
|
43
|
-
|
|
44
|
-
- **`app.json`/`app.config.js`** (Expo config) — bundle identifier, current `version`, native
|
|
45
|
-
`buildNumber`, EAS project ID. If it doesn't exist, this isn't an Expo project — stop and say so.
|
|
46
|
-
- **`eas.json`** — build + submit profiles. **If missing**, run `eas build:configure` first (it
|
|
47
|
-
scaffolds a starter `eas.json` interactively) before continuing with the steps below.
|
|
48
|
-
- **Apple Developer Program membership** for `{APPLE_ID_EMAIL}` — must be an active, paid enrollment.
|
|
49
|
-
If you don't know whether it's active, ask the user to confirm at
|
|
50
|
-
developer.apple.com/account before starting initial setup — everything downstream depends on it.
|
|
51
|
-
|
|
52
|
-
If **none** of these exist yet (a brand-new Expo project with no `eas.json` and no App Store Connect
|
|
53
|
-
app record), start at **Phase A, step 1** — every step is written to work from that empty state.
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Phase A — Initial one-time setup
|
|
58
|
-
|
|
59
|
-
Run once per app. Skip to Phase B if `eas.json` already has a `submit.production.ios` block and a
|
|
60
|
-
first build has already reached TestFlight.
|
|
61
|
-
|
|
62
|
-
1. **Confirm Apple Developer Program enrollment** is active for `{APPLE_ID_EMAIL}` (paid,
|
|
63
|
-
developer.apple.com/account). Nothing below works without it.
|
|
64
|
-
2. **Create the App Store Connect app record** — appstoreconnect.apple.com → My Apps → "+" → New App.
|
|
65
|
-
Fill in `{APP_NAME}`, `{BUNDLE_ID}` (create a matching Identifier first if one doesn't exist yet),
|
|
66
|
-
a SKU, and user access. Capture the numeric app ID it's assigned — that's `{ASC_APP_ID}`.
|
|
67
|
-
3. **Log in to EAS**: `npx eas-cli login` (skip if already authenticated — `eas whoami` confirms).
|
|
68
|
-
4. **Configure `eas.json`** if it doesn't already have what's needed:
|
|
69
|
-
```jsonc
|
|
70
|
-
{
|
|
71
|
-
"cli": { "appVersionSource": "local" },
|
|
72
|
-
"build": {
|
|
73
|
-
"production": { "channel": "production", "autoIncrement": true }
|
|
74
|
-
},
|
|
75
|
-
"submit": {
|
|
76
|
-
"production": {
|
|
77
|
-
"ios": {
|
|
78
|
-
"appleId": "{APPLE_ID_EMAIL}",
|
|
79
|
-
"ascAppId": "{ASC_APP_ID}",
|
|
80
|
-
"appleTeamId": "{APPLE_TEAM_ID}"
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
`appVersionSource: "local"` + `autoIncrement: true` on the build profile means EAS bumps the
|
|
87
|
-
native build number in `app.json` for you on every build — no manual version-bump step, ever.
|
|
88
|
-
5. **First build**: `eas build --platform ios --profile production`. On a project with no
|
|
89
|
-
credentials yet, EAS interactively generates everything it needs **remotely** — Distribution
|
|
90
|
-
Certificate, Provisioning Profile, and (if the app uses push) an APNs key. No local keychain, no
|
|
91
|
-
Mac. Confirm each prompt; let EAS manage the private key material — you should never need to see
|
|
92
|
-
or copy it.
|
|
93
|
-
6. **First submit**: `eas submit --platform ios --profile production --latest`. First time through,
|
|
94
|
-
it also sets up an **App Store Connect API key** for non-interactive submits (EAS-managed is
|
|
95
|
-
simplest — pick that unless there's a reason to upload your own). Confirm the role it grants when
|
|
96
|
-
asked (App Manager is enough for build submission).
|
|
97
|
-
7. **Confirm it landed**: App Store Connect → your app → TestFlight → iOS builds. Apple's binary
|
|
98
|
-
processing takes ~5–10 minutes after a successful `eas submit` before the build appears there.
|
|
99
|
-
|
|
100
|
-
## Phase B — Repeat deployments
|
|
101
|
-
|
|
102
|
-
The two-command loop for every release after Phase A:
|
|
103
|
-
|
|
104
|
-
1. Land the code changes; typecheck/build clean locally first.
|
|
105
|
-
2. `eas build --platform ios --profile production --non-interactive`
|
|
106
|
-
(add `EXPO_NO_CAPABILITY_SYNC=1` up front if you know a capability-sync failure is coming —
|
|
107
|
-
see **Known pitfalls** below).
|
|
108
|
-
3. `eas submit --platform ios --profile production --latest --non-interactive`
|
|
109
|
-
4. **Commit the build-number bump**: step 2's `autoIncrement` rewrote `app.json`'s native build
|
|
110
|
-
number locally — `git add`/`git commit` it so the repo matches the binary that just shipped.
|
|
111
|
-
5. Confirm in TestFlight (same as Phase A step 7).
|
|
112
|
-
|
|
113
|
-
Re-running either command is always safe: `eas build` reuses existing valid credentials rather than
|
|
114
|
-
regenerating them (it only creates new ones when something actually changed, like a new capability),
|
|
115
|
-
and re-running `eas submit` after a failed attempt is a normal retry, not a duplicate submission risk.
|
|
116
|
-
|
|
117
|
-
## Known pitfalls (verified, not hypothetical)
|
|
118
|
-
|
|
119
|
-
- **"Failed to patch capabilities: X ON, Y OFF"** — happens when the App Store Connect app record is
|
|
120
|
-
already linked to `{BUNDLE_ID}` and Apple rejects EAS's automatic capability sync. Fix: set
|
|
121
|
-
`EXPO_NO_CAPABILITY_SYNC=1` for the build command, **and** manually toggle the capability (Push
|
|
122
|
-
Notifications, Sign in with Apple, Associated Domains, whatever the app just added) on in the Apple
|
|
123
|
-
Developer console under Identifiers → `{BUNDLE_ID}` → Capabilities. EAS syncing capabilities and you
|
|
124
|
-
toggling them by hand are two ways to the same end state; when the app is already linked, only the
|
|
125
|
-
manual toggle works.
|
|
126
|
-
- **"Command must be re-run to pick up new updates configuration"** — EAS auto-installed
|
|
127
|
-
`expo-updates` mid-build because the config needed it and it wasn't present. Just re-run the exact
|
|
128
|
-
same build command once; it picks up cleanly the second time.
|
|
129
|
-
- **A brand-new entitlement was just added** (e.g. Associated Domains, Sign in with Apple) — confirm
|
|
130
|
-
the App ID capability is toggled on in the Apple Developer console *before* building. A successful
|
|
131
|
-
build with a fresh "Provisioning Profile ... Updated: N seconds ago" in the credentials output is
|
|
132
|
-
itself the confirmation that the new entitlement is correctly provisioned — if the capability isn't
|
|
133
|
-
on yet, the build will fail at the signing step instead.
|
|
134
|
-
- **Apple "Internal Server Error"** during API key creation or submission — Apple's servers are
|
|
135
|
-
occasionally flaky. Retry the identical command; no code or config change needed.
|
|
136
|
-
- **Build succeeds but nothing changed on-device** — before assuming the deploy is broken, rule out
|
|
137
|
-
the mundane cause first: the tester didn't force-quit and reopen the app after installing the new
|
|
138
|
-
TestFlight build (a backgrounded process can survive an update). Confirm the visible build/version
|
|
139
|
-
number inside the app (a settings screen, an About row) matches what you just shipped before
|
|
140
|
-
debugging further.
|
|
141
|
-
|
|
142
|
-
## Acceptance checklist
|
|
143
|
-
|
|
144
|
-
- [ ] `eas build` output ends with "Build finished" and an artifact URL.
|
|
145
|
-
- [ ] `eas submit` output ends with "Submitted your app to Apple App Store Connect!"
|
|
146
|
-
- [ ] App Store Connect → TestFlight → iOS builds shows the new build number (allow 5–10 min for
|
|
147
|
-
Apple's processing).
|
|
148
|
-
- [ ] The `autoIncrement`-bumped build number in `app.json` is committed — `git status` is clean.
|
|
149
|
-
- [ ] If an entitlement changed this deploy, it visibly works on a fresh install of the new build.
|
|
150
|
-
|
|
151
|
-
## Cross-references
|
|
152
|
-
|
|
153
|
-
- **`spell-ship`** — the surrounding branch-merge / backend-CI-CD lifecycle, if this app ships
|
|
154
|
-
alongside a paired backend. This spell is the mobile-store-specific leaf step; run it after
|
|
155
|
-
`spell-ship`'s checklist is green for anything the app depends on, not instead of it.
|
|
156
|
-
- **`spell-dotnet-expert`** and other stack-expert spells — the sibling "load expertise into any
|
|
157
|
-
agent" pattern. This spell goes one step further: it doesn't just load context, it executes the
|
|
158
|
-
actual build/submit commands.
|
|
159
|
-
- **`spell-bump`** — coordinate with it if the app's marketing `version` (not just the native build
|
|
160
|
-
number this spell auto-increments) also needs a bump before shipping.
|
|
161
|
-
- **`spell-todo`** — if a pitfall or gap surfaces mid-deploy that shouldn't block shipping today,
|
|
162
|
-
capture it there rather than scope-creeping this deploy.
|
|
163
|
-
|
|
164
|
-
## Rules
|
|
165
|
-
|
|
166
|
-
- **Never guess a placeholder.** If `{BUNDLE_ID}`, `{APPLE_TEAM_ID}`, `{ASC_APP_ID}`, or
|
|
167
|
-
`{APPLE_ID_EMAIL}` is unresolved, ask — do not invent a value or proceed with a literal placeholder
|
|
168
|
-
string in a real command.
|
|
169
|
-
- **Never handle real credential material.** You should never need to see, paste, or commit a
|
|
170
|
-
Distribution Certificate private key, an App Store Connect API private key (`.p8`), or any
|
|
171
|
-
password — EAS manages all of it remotely. If a step seems to require pasting one, stop; something
|
|
172
|
-
is set up wrong.
|
|
173
|
-
- **Confirm before `eas submit`.** Submitting puts a real binary in front of Apple's review /
|
|
174
|
-
TestFlight testers — it's outward-facing and not something to undo casually. Say what you're about
|
|
175
|
-
to submit and to which environment before running it.
|
|
176
|
-
- **Confirm before setting `EXPO_NO_CAPABILITY_SYNC=1`.** Explain why it's needed (it disables an
|
|
177
|
-
automatic sync that would otherwise silently turn a capability off) rather than setting it
|
|
178
|
-
silently.
|
|
179
|
-
- **Never force-regenerate credentials** (revoke + recreate a Distribution Certificate or
|
|
180
|
-
Provisioning Profile) without explicit confirmation — revoking a certificate invalidates every
|
|
181
|
-
build ever signed with it, including ones already live.
|
|
182
|
-
- **A backend/API prod deploy the app depends on is a separate, separately-confirmed action.** Do
|
|
183
|
-
not fold it into a mobile build/submit step just because they're related.
|