diff --git a/.cursor/rules/repo-context.mdc b/.cursor/rules/repo-context.mdc
new file mode 100644
index 0000000..35e640c
--- /dev/null
+++ b/.cursor/rules/repo-context.mdc
@@ -0,0 +1,10 @@
+---
+description: Shared repo context
+alwaysApply: true
+---
+
+Read `AGENTS.md` first. Treat it as the source of truth for this repo's
+commands, invariants, public naming, release constraints, and first-user path.
+
+This file is a thin client adapter for Cursor. Do not add independent strategy,
+roadmap, package-name, release, or baseline-scope rules here.
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000..0c6e602
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,8 @@
+# Agent context
+
+Read `AGENTS.md` first. Treat it as the source of truth for this repo's
+commands, invariants, public naming, release constraints, and first-user path.
+
+This file is a thin client adapter for GitHub Copilot and VS Code. Do not add
+independent strategy, roadmap, package-name, release, or baseline-scope rules
+here.
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..5838d3c
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,7 @@
+# Agent context
+
+Read `AGENTS.md` first. Treat it as the source of truth for this repo's
+commands, invariants, public naming, release constraints, and first-user path.
+
+This file is a thin client adapter. Do not add independent strategy, roadmap,
+package-name, release, or baseline-scope rules here.
diff --git a/README.ko.md b/README.ko.md
index 3dfbdf1..33994a3 100644
--- a/README.ko.md
+++ b/README.ko.md
@@ -27,7 +27,7 @@
**[create-starter](https://github.com/starter-series/create-starter) 사용** (권장):
```bash
-npx @starter-series/create my-app --template react-native
+gh repo create my-app --template starter-series/react-native-starter --clone
cd my-app
npm install
npm run check:expo
diff --git a/README.md b/README.md
index 1dcac4e..55b4818 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ Build your app. Push to deploy.
**Via [create-starter](https://github.com/starter-series/create-starter)** (recommended):
```bash
-npx @starter-series/create my-app --template react-native
+gh repo create my-app --template starter-series/react-native-starter --clone
cd my-app
npm install
npm run check:expo
diff --git a/package-lock.json b/package-lock.json
index e6e7b8a..bd0256d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,7 +24,7 @@
"devDependencies": {
"@eslint/js": "^10.0.1",
"@testing-library/react-native": "^12.9.0",
- "eslint": "^10.5.0",
+ "eslint": "^10.6.0",
"globals": "^17.7.0",
"jest": "~29.7.0",
"jest-expo": "~52.0.0",
@@ -6716,9 +6716,9 @@
}
},
"node_modules/eslint": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz",
- "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==",
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz",
+ "integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==",
"dev": true,
"license": "MIT",
"workspaces": [
diff --git a/package.json b/package.json
index 0ee5e3a..c898a1c 100644
--- a/package.json
+++ b/package.json
@@ -34,13 +34,13 @@
"react-native-web": "~0.19.13"
},
"devDependencies": {
- "@testing-library/react-native": "^12.9.0",
- "react-test-renderer": "18.3.1",
"@eslint/js": "^10.0.1",
- "eslint": "^10.5.0",
+ "@testing-library/react-native": "^12.9.0",
+ "eslint": "^10.6.0",
"globals": "^17.7.0",
"jest": "~29.7.0",
- "jest-expo": "~52.0.0"
+ "jest-expo": "~52.0.0",
+ "react-test-renderer": "18.3.1"
},
"overrides": {
"@babel/core": "7.29.7",
diff --git a/tests/auth-context.test.js b/tests/auth-context.test.js
index fe2932b..81a919e 100644
--- a/tests/auth-context.test.js
+++ b/tests/auth-context.test.js
@@ -73,7 +73,8 @@ const { assertGoogleEnv, readGoogleClientIds } = require('../lib/env');
function Probe({ onUser }) {
const ctx = useAuth();
- onUser(ctx);
+ onUser?.(ctx);
+ if (ctx.loading) return loading;
return {ctx.user ? `user:${ctx.user.email}` : 'anon'};
}
@@ -281,8 +282,9 @@ describe('AuthProvider lifecycle', () => {
(captured = c)} />
,
);
- await waitFor(() => expect(captured.loading).toBe(false), { timeout: 4000 });
- expect(captured.user).toBeNull();
+ await waitFor(() => expect(captured?.loading).toBe(false), { timeout: 4000 });
+ expect(captured?.loading).toBe(false);
+ expect(captured?.user).toBeNull();
expect(mockSecureStore.getItemAsync).toHaveBeenCalledWith(STORAGE_KEY);
},
10000,