Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 1 addition & 13 deletions .commitlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,7 @@
"type-enum": [
2,
"always",
[
"feat",
"fix",
"docs",
"style",
"refactor",
"perf",
"test",
"build",
"ci",
"chore",
"revert"
]
["feat", "fix", "docs", "style", "refactor", "perf", "test", "build", "ci", "chore", "revert"]
],
"scope-enum": [
2,
Expand Down
65 changes: 14 additions & 51 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,58 +1,21 @@
# ThumbCode Environment Configuration
# Copy this file to .env and fill in your values
# NEVER commit .env files with actual credentials
# BYOK (Bring Your Own Keys) - User-owned credentials only

# =============================================================================
# Expo Application Services (EAS)
# =============================================================================
# AI Provider API Keys
# Get your Anthropic API key from: https://console.anthropic.com/
ANTHROPIC_API_KEY=your-anthropic-api-key-here

# EAS Project Configuration
EXPO_PROJECT_ID=your-expo-project-id
EXPO_OWNER=your-expo-username-or-org
# Get your OpenAI API key from: https://platform.openai.com/
OPENAI_API_KEY=your-openai-api-key-here

# =============================================================================
# Apple Developer (iOS Builds & App Store)
# =============================================================================

# Apple Developer Account
EXPO_APPLE_ID=your-apple-id@example.com
EXPO_ASC_APP_ID=your-app-store-connect-app-id
EXPO_APPLE_TEAM_ID=your-apple-team-id

# =============================================================================
# Google Play (Android Builds & Play Store)
# =============================================================================

# Path to Google Play Service Account JSON key
# Generate at: Google Play Console > Settings > API Access > Service Accounts
EXPO_ANDROID_SERVICE_ACCOUNT_KEY_PATH=./secrets/google-play-service-account.json

# =============================================================================
# AI Provider API Keys (BYOK - Bring Your Own Keys)
# =============================================================================

# Anthropic Claude API
# Get from: https://console.anthropic.com/
ANTHROPIC_API_KEY=sk-ant-...

# OpenAI API (optional)
# Get from: https://platform.openai.com/
OPENAI_API_KEY=sk-...

# =============================================================================
# GitHub Integration
# =============================================================================

# GitHub Personal Access Token (for private repos)
# Generate at: GitHub Settings > Developer Settings > Personal Access Tokens
GITHUB_TOKEN=ghp_...

# =============================================================================
# Development & Debug
# =============================================================================
# Generate a personal access token: https://github.com/settings/tokens
# Required scopes: repo, workflow
GITHUB_TOKEN=your-github-token-here

# Enable debug logging
DEBUG=false
# Optional: Expo configuration
EXPO_PUBLIC_APP_ENV=development

# API endpoint overrides (for local development)
# API_BASE_URL=http://localhost:3000
# Optional: Custom API endpoints (if using proxies)
# ANTHROPIC_API_URL=https://api.anthropic.com
# OPENAI_API_URL=https://api.openai.com
10 changes: 5 additions & 5 deletions .github/actions/setup-thumbcode/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,17 @@ inputs:
runs:
using: 'composite'
steps:
- name: Install pnpm
uses: pnpm/action-setup@c5ba7f7862a0f64c1b1a05fbac13e0b8e86ba08c # v4
with:
version: ${{ inputs.pnpm-version }}

- name: Setup Node.js
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version: ${{ inputs.node-version }}
cache: 'pnpm'

- name: Install pnpm
uses: pnpm/action-setup@41ff726655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
with:
version: ${{ inputs.pnpm-version }}

- name: Install dependencies
shell: bash
run: pnpm install --frozen-lockfile
Expand Down
5 changes: 1 addition & 4 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,7 @@
},
"package": "com.thumbcode.app",
"versionCode": 1,
"permissions": [
"USE_BIOMETRIC",
"USE_FINGERPRINT"
]
"permissions": ["USE_BIOMETRIC", "USE_FINGERPRINT"]
},
"web": {
"bundler": "metro",
Expand Down
2 changes: 1 addition & 1 deletion app/_layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ export default function RootLayout() {
<Stack.Screen name="index" options={{ title: 'ThumbCode' }} />
</Stack>
);
}
}
41 changes: 15 additions & 26 deletions app/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { View, ScrollView } from 'react-native';
import { Text, Button, Card, Input } from '../src/components/ui';
import { ScrollView, View } from 'react-native';
import { Button, Card, Input, Text } from '../src/components/ui';

/**
* Landing screen component that renders the ThumbCode promotional and demo interface.
Expand All @@ -22,13 +22,13 @@ export default function Index() {
Code with your thumbs. A decentralized multi-agent mobile development platform.
</Text>
</View>

{/* Feature Cards */}
<View className="mb-6">
<Text variant="display" size="2xl" weight="semibold" className="mb-4">
Key Features
</Text>

<Card className="mb-4">
<Text size="lg" weight="semibold" className="mb-2">
🤖 Multi-Agent Teams
Expand All @@ -37,7 +37,7 @@ export default function Index() {
Architect, Implementer, Reviewer, Tester agents working in parallel
</Text>
</Card>

<Card className="mb-4">
<Text size="lg" weight="semibold" className="mb-2">
📱 Mobile-Native Git
Expand All @@ -46,7 +46,7 @@ export default function Index() {
Full git workflow from your phone. Clone, commit, push — powered by isomorphic-git
</Text>
</Card>

<Card className="mb-4">
<Text size="lg" weight="semibold" className="mb-2">
🔒 Credential Sovereignty
Expand All @@ -56,42 +56,31 @@ export default function Index() {
</Text>
</Card>
</View>

{/* Demo Form */}
<View className="mb-6">
<Text variant="display" size="2xl" weight="semibold" className="mb-4">
Get Started
</Text>

<Card variant="elevated">
<Input
label="GitHub Username"
placeholder="username"
className="mb-4"
/>
<Input
label="API Key"
placeholder="sk-..."
secureTextEntry
className="mb-4"
/>
<Input label="GitHub Username" placeholder="username" className="mb-4" />
<Input label="API Key" placeholder="sk-..." secureTextEntry className="mb-4" />
<Button variant="primary" className="mb-2">
Connect
</Button>
<Button variant="outline">
Learn More
</Button>
<Button variant="outline">Learn More</Button>
</Card>
</View>

{/* Tech Stack */}
<View className="mb-8">
<Text variant="display" size="2xl" weight="semibold" className="mb-4">
Built With
</Text>
<View className="flex-row flex-wrap gap-2">
{['Expo 52', 'React Native', 'NativeWind', 'Zustand', 'isomorphic-git'].map(tech => (
<View
{['Expo 52', 'React Native', 'NativeWind', 'Zustand', 'isomorphic-git'].map((tech) => (
<View
key={tech}
className="bg-teal-100 px-3 py-2 rounded-[0.375rem_0.5rem_0.625rem_0.25rem]"
>
Expand All @@ -105,4 +94,4 @@ export default function Index() {
</View>
</ScrollView>
);
}
}
3 changes: 3 additions & 0 deletions babel.config.jest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
presets: ['babel-preset-expo'],
};
20 changes: 13 additions & 7 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
module.exports = function (api) {
module.exports = (api) => {
api.cache(true);

// Detect test environment
const isTest =
process.env.NODE_ENV === 'test' || typeof process.env.JEST_WORKER_ID !== 'undefined';

return {
presets: [
['babel-preset-expo', { jsxImportSource: 'nativewind' }]
],
presets: [['babel-preset-expo', isTest ? {} : { jsxImportSource: 'nativewind' }]],
plugins: [
'nativewind/babel',
'react-native-reanimated/plugin'
]
// Skip NativeWind/CSS Interop and Reanimated plugins during tests
// Use react-native-css-interop/dist/babel-plugin directly instead of
// nativewind/babel which returns an invalid plugin wrapper
...(!isTest ? ['react-native-css-interop/dist/babel-plugin'] : []),
...(!isTest ? ['react-native-reanimated/plugin'] : []),
],
};
};
3 changes: 2 additions & 1 deletion biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
},
"suspicious": {
"noExplicitAny": "warn",
"noArrayIndexKey": "warn"
"noArrayIndexKey": "warn",
"noUnknownAtRules": "off"
},
"correctness": {
"noUnusedVariables": "error",
Expand Down
3 changes: 2 additions & 1 deletion design-system/generated/tailwind-colors.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,6 @@ export const colors = {
"700": "#334155",
"800": "#1E293B",
"900": "#0F172A"
}
},
"charcoal": "#151820"
};
1 change: 1 addition & 0 deletions design-system/generated/variables.css
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
--color-neutral-700: #334155;
--color-neutral-800: #1E293B;
--color-neutral-900: #0F172A;
--color-charcoal: #151820;

/* Spacing */
--spacing-0: 0px;
Expand Down
16 changes: 8 additions & 8 deletions design-system/tokens.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "ThumbCode Design Tokens",
"version": "1.0.0",
"description": "P3 Warm Technical palette with organic styling",

"colors": {
"coral": {
"description": "Primary brand color - warm, energetic, action-oriented",
Expand Down Expand Up @@ -187,7 +187,7 @@
"usage": "Dark mode base background"
}
},

"typography": {
"fontFamilies": {
"display": {
Expand Down Expand Up @@ -235,7 +235,7 @@
"loose": { "value": 2, "usage": "Very spacious text" }
}
},

"spacing": {
"description": "4px base unit scale",
"values": {
Expand All @@ -262,7 +262,7 @@
"24": "96px"
}
},

"borderRadius": {
"none": "0px",
"sm": "4px",
Expand All @@ -283,7 +283,7 @@
"usage": "Cards, containers, panels"
}
},

"shadows": {
"sm": {
"value": "0 1px 2px rgba(0, 0, 0, 0.05)",
Expand Down Expand Up @@ -312,7 +312,7 @@
"usage": "Primary buttons, focus states"
}
},

"animation": {
"durations": {
"fast": "100ms",
Expand All @@ -328,15 +328,15 @@
"bounce": "cubic-bezier(0.34, 1.56, 0.64, 1)"
}
},

"breakpoints": {
"sm": "640px",
"md": "768px",
"lg": "1024px",
"xl": "1280px",
"2xl": "1536px"
},

"devices": {
"description": "Target device specifications",
"values": {
Expand Down
Loading