Skip to content

Commit 885fdf1

Browse files
committed
v0.1.0: Zero to Phone - 3 skills, 1 rule, 3 MCP tools
Plugin scaffold with full repo structure matching Plaid/Docker/Steam repos. Skills: mobile-project-setup, mobile-dev-environment, mobile-run-on-device Rules: mobile-secrets (always-on credential detection) MCP tools: mobile_checkDevEnvironment, mobile_scaffoldProject, mobile_runOnDevice NPM package: @tmhsdigital/mobile-dev-tools stub to claim the name CI/CD: pytest validation, MCP server build, plugin structure validation, CodeQL security scanning, GitHub release on tag push, npm publish on tag push. Made-with: Cursor
1 parent c8d18ca commit 885fdf1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+6476
-1
lines changed

.cursor-plugin/plugin.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"name": "mobile-app-developer-tools",
3+
"displayName": "Mobile App Developer Tools",
4+
"version": "0.1.0",
5+
"description": "Mobile app development for Cursor, Claude Code, and MCP-compatible editors. 3 skills covering project setup, environment detection, and device deployment for React Native/Expo - plus 1 rule. Companion MCP server provides 3 tools for environment checks, project scaffolding, and device connection.",
6+
"author": {
7+
"name": "TMHSDigital",
8+
"url": "https://github.com/TMHSDigital"
9+
},
10+
"homepage": "https://github.com/TMHSDigital/Mobile-App-Developer-Tools",
11+
"repository": "https://github.com/TMHSDigital/Mobile-App-Developer-Tools",
12+
"license": "CC-BY-NC-ND-4.0",
13+
"keywords": [
14+
"mobile",
15+
"react-native",
16+
"expo",
17+
"flutter",
18+
"ios",
19+
"android",
20+
"app-development",
21+
"mobile-dev",
22+
"cursor-plugin",
23+
"mcp"
24+
],
25+
"category": "developer-tools",
26+
"tags": [
27+
"mobile",
28+
"expo",
29+
"react-native"
30+
],
31+
"logo": "assets/logo.png",
32+
"skills": "./skills/",
33+
"rules": "./rules/"
34+
}

.cursorrules

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Cursor Rules
2+
3+
## Writing Style
4+
5+
- **No em dashes.** Never use `—` (em dash). Use a hyphen `-`, a comma, a period, or rewrite the sentence.
6+
- **No filler words.** Cut "basically", "simply", "just", "actually", "in order to", "leverage", "utilize". Say what you mean.
7+
- **No hedge stacking.** One qualifier max. Not "it might potentially possibly help" but "it may help".
8+
- **Active voice.** "The server returns X" not "X is returned by the server".
9+
- **Short sentences.** If a sentence has more than one comma-separated clause, split it.
10+
- **No marketing tone.** Don't say "powerful", "seamless", "robust", "comprehensive", "elegant". Describe what it does, not how great it is.
11+
- **Parallel structure in lists.** Every item in a bullet list or table column should use the same grammatical form (all verb phrases, all noun phrases, etc.).
12+
- **Code over prose.** When explaining how something works, show a code example first. Add prose only if the code isn't self-explanatory.
13+
14+
## Skill File Conventions
15+
16+
- Every skill lives in `skills/<skill-name>/SKILL.md`
17+
- YAML frontmatter is required with `name` (matching the directory name) and `description` (one line, when-to-use guidance)
18+
- Required sections in order: Trigger, Required Inputs, Workflow, Key References (if applicable), Example Interaction, MCP Usage, Common Pitfalls, See Also
19+
- Keep `## MCP Usage` present even for non-MCP skills (state that no MCP tool exists yet)
20+
21+
## Rule File Conventions
22+
23+
- Rules use `.mdc` extension in the `rules/` directory
24+
- YAML frontmatter must include `description` and `alwaysApply` (boolean)
25+
- If `alwaysApply` is false, include `globs` to scope when the rule activates
26+
27+
## Mobile Development Conventions
28+
29+
- Default framework: Expo (React Native) with TypeScript
30+
- Flutter support is planned but not yet implemented
31+
- Prefer Expo SDK libraries over raw React Native community packages when available
32+
- Use file-based routing (Expo Router) over React Navigation stack-based routing
33+
- Always include platform checks (`Platform.OS`) when writing platform-specific code
34+
- Never hardcode API keys, signing credentials, or tokens in source files
35+
36+
## MCP Tool Naming
37+
38+
- All MCP tool names use `mobile_camelCase` prefix (e.g. `mobile_checkDevEnvironment`, `mobile_scaffoldProject`)
39+
- Each tool lives in its own file under `mcp-server/src/tools/`
40+
- Each tool file exports `register(server: McpServer): void`
41+
- Use `.js` extension on all imports (ESM)
42+
43+
## Release Checklist
44+
45+
When preparing a release:
46+
1. Update version in `.cursor-plugin/plugin.json`
47+
2. Update version in `mcp-server/package.json`
48+
3. Update version in `packages/mobile-dev-tools/package.json`
49+
4. Update `CHANGELOG.md` with new entry
50+
5. Update `ROADMAP.md` current version marker
51+
6. Update `CLAUDE.md` version reference
52+
7. Verify counts in `plugin.json` description match disk
53+
8. Run `pytest tests/ -v` to verify all tests pass
54+
9. Build MCP server: `cd mcp-server && npm run build`

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# No API keys required for v0.1.0.
2+
# Future versions may use keys for app store submission, push notifications, etc.
3+
# EXPO_TOKEN=your_expo_token_here

.github/workflows/ci.yml

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
test-plugin:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v4
14+
15+
- name: Set up Python
16+
uses: actions/setup-python@v5
17+
with:
18+
python-version: '3.12'
19+
cache: 'pip'
20+
cache-dependency-path: requirements-test.txt
21+
22+
- name: Install test dependencies
23+
run: pip install -r requirements-test.txt
24+
25+
- name: Run test suite
26+
run: pytest tests/ -v --tb=short
27+
28+
build-mcp:
29+
runs-on: ubuntu-latest
30+
defaults:
31+
run:
32+
working-directory: mcp-server
33+
strategy:
34+
matrix:
35+
node-version: [20, 22]
36+
steps:
37+
- uses: actions/checkout@v4
38+
39+
- name: Set up Node.js ${{ matrix.node-version }}
40+
uses: actions/setup-node@v4
41+
with:
42+
node-version: ${{ matrix.node-version }}
43+
cache: 'npm'
44+
cache-dependency-path: mcp-server/package-lock.json
45+
46+
- name: Install dependencies
47+
run: npm ci
48+
49+
- name: Build
50+
run: npm run build
51+
52+
- name: Smoke test (server starts without crashing)
53+
run: |
54+
timeout 5 node dist/index.js || code=$?
55+
if [ "${code:-0}" -eq 124 ]; then
56+
echo "Server started and ran for 5s without crashing."
57+
else
58+
echo "Server exited with code $code"
59+
exit 1
60+
fi
61+
62+
build-npm-package:
63+
runs-on: ubuntu-latest
64+
defaults:
65+
run:
66+
working-directory: packages/mobile-dev-tools
67+
steps:
68+
- uses: actions/checkout@v4
69+
70+
- name: Set up Node.js
71+
uses: actions/setup-node@v4
72+
with:
73+
node-version: 22
74+
cache: 'npm'
75+
cache-dependency-path: packages/mobile-dev-tools/package-lock.json
76+
77+
- name: Install dependencies
78+
run: npm ci
79+
80+
- name: Build
81+
run: npm run build

.github/workflows/codeql.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: CodeQL
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
schedule:
9+
- cron: '0 6 * * 1'
10+
11+
jobs:
12+
analyze:
13+
runs-on: ubuntu-latest
14+
permissions:
15+
security-events: write
16+
strategy:
17+
matrix:
18+
language: [javascript-typescript]
19+
steps:
20+
- uses: actions/checkout@v4
21+
22+
- name: Initialize CodeQL
23+
uses: github/codeql-action/init@v3
24+
with:
25+
languages: ${{ matrix.language }}
26+
27+
- name: Autobuild
28+
uses: github/codeql-action/autobuild@v3
29+
30+
- name: Perform CodeQL Analysis
31+
uses: github/codeql-action/analyze@v3

.github/workflows/publish-npm.yml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
name: Publish to npm
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
8+
jobs:
9+
publish-mcp-server:
10+
runs-on: ubuntu-latest
11+
permissions:
12+
id-token: write
13+
defaults:
14+
run:
15+
working-directory: mcp-server
16+
steps:
17+
- uses: actions/checkout@v4
18+
19+
- name: Set up Node.js
20+
uses: actions/setup-node@v4
21+
with:
22+
node-version: 22
23+
registry-url: 'https://registry.npmjs.org'
24+
cache: 'npm'
25+
cache-dependency-path: mcp-server/package-lock.json
26+
27+
- name: Install and build
28+
run: |
29+
npm ci
30+
npm run build
31+
32+
- name: Publish @tmhs/mobile-mcp
33+
run: npm publish --access public --provenance
34+
env:
35+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
36+
37+
publish-npm-package:
38+
runs-on: ubuntu-latest
39+
permissions:
40+
id-token: write
41+
defaults:
42+
run:
43+
working-directory: packages/mobile-dev-tools
44+
steps:
45+
- uses: actions/checkout@v4
46+
47+
- name: Set up Node.js
48+
uses: actions/setup-node@v4
49+
with:
50+
node-version: 22
51+
registry-url: 'https://registry.npmjs.org'
52+
cache: 'npm'
53+
cache-dependency-path: packages/mobile-dev-tools/package-lock.json
54+
55+
- name: Install and build
56+
run: |
57+
npm ci
58+
npm run build
59+
60+
- name: Publish @tmhsdigital/mobile-dev-tools
61+
run: npm publish --access public --provenance
62+
env:
63+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

.github/workflows/release.yml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
create-release:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- uses: actions/checkout@v4
16+
17+
- name: Extract version from tag
18+
id: version
19+
run: echo "version=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT"
20+
21+
- name: Extract changelog for this version
22+
id: changelog
23+
run: |
24+
version="${{ steps.version.outputs.version }}"
25+
# Extract the section for this version from CHANGELOG.md
26+
changelog=$(awk "/^## \[${version}\]/{found=1; next} /^## \[/{if(found) exit} found{print}" CHANGELOG.md)
27+
if [ -z "$changelog" ]; then
28+
changelog="Release v${version}"
29+
fi
30+
# Write to file for gh release
31+
echo "$changelog" > release_notes.md
32+
cat release_notes.md
33+
34+
- name: Set up Node.js
35+
uses: actions/setup-node@v4
36+
with:
37+
node-version: 22
38+
cache: 'npm'
39+
cache-dependency-path: mcp-server/package-lock.json
40+
41+
- name: Build MCP server
42+
working-directory: mcp-server
43+
run: |
44+
npm ci
45+
npm run build
46+
47+
- name: Build NPM package
48+
working-directory: packages/mobile-dev-tools
49+
run: |
50+
npm ci
51+
npm run build
52+
53+
- name: Set up Python
54+
uses: actions/setup-python@v5
55+
with:
56+
python-version: '3.12'
57+
cache: 'pip'
58+
cache-dependency-path: requirements-test.txt
59+
60+
- name: Run tests
61+
run: |
62+
pip install -r requirements-test.txt
63+
pytest tests/ -v --tb=short
64+
65+
- name: Count components
66+
id: counts
67+
run: |
68+
skills=$(ls -d skills/*/SKILL.md 2>/dev/null | wc -l)
69+
rules=$(ls rules/*.mdc 2>/dev/null | wc -l)
70+
echo "skills=$skills" >> "$GITHUB_OUTPUT"
71+
echo "rules=$rules" >> "$GITHUB_OUTPUT"
72+
73+
- name: Create GitHub release
74+
env:
75+
GH_TOKEN: ${{ github.token }}
76+
run: |
77+
version="${{ steps.version.outputs.version }}"
78+
skills="${{ steps.counts.outputs.skills }}"
79+
rules="${{ steps.counts.outputs.rules }}"
80+
title="v${version} - ${skills} skills, ${rules} rules"
81+
82+
gh release create "v${version}" \
83+
--title "$title" \
84+
--notes-file release_notes.md

0 commit comments

Comments
 (0)