mobile-best-practices 1.0.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/README.md +64 -0
- package/assets/data/anti-patterns.csv +114 -0
- package/assets/data/architectures.csv +50 -0
- package/assets/data/code-snippets.csv +80 -0
- package/assets/data/gradle-deps.csv +79 -0
- package/assets/data/libraries.csv +102 -0
- package/assets/data/performance.csv +229 -0
- package/assets/data/platforms/android.csv +247 -0
- package/assets/data/platforms/flutter.csv +55 -0
- package/assets/data/platforms/ios.csv +61 -0
- package/assets/data/platforms/react-native.csv +56 -0
- package/assets/data/project-templates.csv +19 -0
- package/assets/data/reasoning-rules.csv +57 -0
- package/assets/data/security.csv +438 -0
- package/assets/data/testing.csv +74 -0
- package/assets/data/ui-patterns.csv +92 -0
- package/assets/references/CHECKLIST.md +49 -0
- package/assets/references/CODE-RULES.md +123 -0
- package/assets/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/assets/scripts/core.py +432 -0
- package/assets/scripts/search.py +104 -0
- package/assets/skills/all.md +245 -0
- package/assets/skills/android.md +168 -0
- package/assets/skills/flutter.md +153 -0
- package/assets/skills/ios.md +149 -0
- package/assets/skills/react-native.md +154 -0
- package/assets/templates/base/quick-reference.md +41 -0
- package/assets/templates/base/skill-content.md +60 -0
- package/assets/templates/platforms/agent.json +11 -0
- package/assets/templates/platforms/antigravity.json +13 -0
- package/assets/templates/platforms/claude.json +27 -0
- package/assets/templates/platforms/codebuddy.json +11 -0
- package/assets/templates/platforms/codex.json +11 -0
- package/assets/templates/platforms/continue.json +11 -0
- package/assets/templates/platforms/copilot.json +11 -0
- package/assets/templates/platforms/cursor.json +11 -0
- package/assets/templates/platforms/gemini.json +11 -0
- package/assets/templates/platforms/kiro.json +11 -0
- package/assets/templates/platforms/opencode.json +11 -0
- package/assets/templates/platforms/qoder.json +11 -0
- package/assets/templates/platforms/roocode.json +11 -0
- package/assets/templates/platforms/trae.json +11 -0
- package/assets/templates/platforms/windsurf.json +11 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +28 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/versions.d.ts +2 -0
- package/dist/commands/versions.d.ts.map +1 -0
- package/dist/commands/versions.js +30 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +103 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import prompts from 'prompts';
|
|
4
|
+
import { SUPPORTED_PLATFORMS } from '../types/index.js';
|
|
5
|
+
import { installForPlatform } from '../utils/index.js';
|
|
6
|
+
export async function initCommand(options) {
|
|
7
|
+
let aiPlatform = options.ai;
|
|
8
|
+
let mobilePlatform = options.platform;
|
|
9
|
+
if (!aiPlatform) {
|
|
10
|
+
const response = await prompts({
|
|
11
|
+
type: 'select',
|
|
12
|
+
name: 'platform',
|
|
13
|
+
message: 'Which AI assistant are you using?',
|
|
14
|
+
choices: [
|
|
15
|
+
{ title: 'Claude Code', value: 'claude' },
|
|
16
|
+
{ title: 'Cursor', value: 'cursor' },
|
|
17
|
+
{ title: 'Windsurf', value: 'windsurf' },
|
|
18
|
+
{ title: 'GitHub Copilot', value: 'copilot' },
|
|
19
|
+
{ title: 'Kiro', value: 'kiro' },
|
|
20
|
+
{ title: 'Codex CLI', value: 'codex' },
|
|
21
|
+
{ title: 'Gemini CLI', value: 'gemini' },
|
|
22
|
+
{ title: 'Roo Code', value: 'roocode' },
|
|
23
|
+
{ title: 'Continue', value: 'continue' },
|
|
24
|
+
{ title: 'OpenCode', value: 'opencode' },
|
|
25
|
+
{ title: 'Qoder', value: 'qoder' },
|
|
26
|
+
{ title: 'CodeBuddy', value: 'codebuddy' },
|
|
27
|
+
{ title: 'Trae', value: 'trae' },
|
|
28
|
+
{ title: 'Antigravity', value: 'antigravity' },
|
|
29
|
+
{ title: 'All assistants', value: 'all' },
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
if (!response.platform) {
|
|
33
|
+
console.log(chalk.yellow('Installation cancelled.'));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
aiPlatform = response.platform;
|
|
37
|
+
}
|
|
38
|
+
if (!mobilePlatform) {
|
|
39
|
+
const response = await prompts({
|
|
40
|
+
type: 'select',
|
|
41
|
+
name: 'mobilePlatform',
|
|
42
|
+
message: 'Which mobile platform are you building for?',
|
|
43
|
+
choices: [
|
|
44
|
+
{ title: 'Android (Jetpack Compose)', value: 'android' },
|
|
45
|
+
{ title: 'iOS (SwiftUI)', value: 'ios' },
|
|
46
|
+
{ title: 'Flutter (Dart)', value: 'flutter' },
|
|
47
|
+
{ title: 'React Native (TypeScript)', value: 'react-native' },
|
|
48
|
+
{ title: 'All platforms', value: 'all' },
|
|
49
|
+
],
|
|
50
|
+
});
|
|
51
|
+
if (!response.mobilePlatform) {
|
|
52
|
+
console.log(chalk.yellow('Installation cancelled.'));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
mobilePlatform = response.mobilePlatform;
|
|
56
|
+
}
|
|
57
|
+
const projectDir = process.cwd();
|
|
58
|
+
const aiPlatforms = aiPlatform === 'all' ? SUPPORTED_PLATFORMS : [aiPlatform];
|
|
59
|
+
for (const p of aiPlatforms) {
|
|
60
|
+
const spinner = ora(`Installing for ${chalk.cyan(p)} (${chalk.dim(mobilePlatform)})...`).start();
|
|
61
|
+
try {
|
|
62
|
+
installForPlatform(p, projectDir, mobilePlatform);
|
|
63
|
+
spinner.succeed(`Installed for ${chalk.green(p)} (${mobilePlatform})`);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
spinner.fail(`Failed for ${chalk.red(p)}: ${error.message}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
console.log();
|
|
70
|
+
console.log(chalk.green('Mobile Best Practices skill installed successfully!'));
|
|
71
|
+
console.log(chalk.dim(`Platform: ${mobilePlatform}`));
|
|
72
|
+
console.log();
|
|
73
|
+
console.log(chalk.dim('Usage:'));
|
|
74
|
+
if (aiPlatform === 'claude' || aiPlatform === 'all') {
|
|
75
|
+
console.log(chalk.dim(' Just chat naturally with Claude Code:'));
|
|
76
|
+
if (mobilePlatform === 'android') {
|
|
77
|
+
console.log(chalk.white(' "Build a product list screen with Compose"'));
|
|
78
|
+
}
|
|
79
|
+
else if (mobilePlatform === 'ios') {
|
|
80
|
+
console.log(chalk.white(' "Build a settings screen with SwiftUI"'));
|
|
81
|
+
}
|
|
82
|
+
else if (mobilePlatform === 'flutter') {
|
|
83
|
+
console.log(chalk.white(' "Build a product list with BLoC"'));
|
|
84
|
+
}
|
|
85
|
+
else if (mobilePlatform === 'react-native') {
|
|
86
|
+
console.log(chalk.white(' "Build a product list with React Navigation"'));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.log(chalk.white(' "Build a product list screen for my e-commerce app"'));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
console.log();
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BnD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export async function updateCommand() {
|
|
4
|
+
const spinner = ora('Checking for updates...').start();
|
|
5
|
+
try {
|
|
6
|
+
// Check npm for latest version
|
|
7
|
+
const response = await fetch('https://registry.npmjs.org/mobile-best-practices/latest');
|
|
8
|
+
if (!response.ok) {
|
|
9
|
+
spinner.info('Package not yet published to npm. Run locally with: npm link');
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const data = await response.json();
|
|
13
|
+
const { version: localVersion } = await import('../../package.json', { with: { type: 'json' } });
|
|
14
|
+
if (data.version === localVersion) {
|
|
15
|
+
spinner.succeed(`Already on latest version: ${chalk.green(localVersion)}`);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
spinner.info(`Update available: ${chalk.yellow(localVersion)} -> ${chalk.green(data.version)}`);
|
|
19
|
+
console.log();
|
|
20
|
+
console.log(chalk.dim(' Run to update:'));
|
|
21
|
+
console.log(chalk.white(' npm install -g mobile-best-practices@latest'));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
spinner.warn('Could not check for updates. Using local version.');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEvD,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAExF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAEjG,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;YAClC,OAAO,CAAC,OAAO,CAAC,8BAA8B,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChG,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AAsBA,wBAAgB,eAAe,IAAI,IAAI,CAUtC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
const VERSIONS = [
|
|
3
|
+
{
|
|
4
|
+
version: '1.0.0',
|
|
5
|
+
date: '2026-02-12',
|
|
6
|
+
changes: [
|
|
7
|
+
'Initial release',
|
|
8
|
+
'1,738 mobile best practices across 15 CSV files',
|
|
9
|
+
'Support for 15 AI coding assistants',
|
|
10
|
+
'BM25 search engine with auto-domain detection',
|
|
11
|
+
'--stack and --persist flags',
|
|
12
|
+
'79 copy-paste code snippets (Android, iOS, Flutter, React Native)',
|
|
13
|
+
'78 Gradle dependency declarations',
|
|
14
|
+
'49 architecture patterns',
|
|
15
|
+
'415 platform-specific guidelines (Android 246, iOS 60, Flutter 54, React Native 55)',
|
|
16
|
+
'Reference URLs for all entries',
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
export function versionsCommand() {
|
|
21
|
+
console.log(chalk.bold('\nMobile Best Practices - Version History\n'));
|
|
22
|
+
for (const v of VERSIONS) {
|
|
23
|
+
console.log(` ${chalk.green(v.version)} ${chalk.dim(`(${v.date})`)}`);
|
|
24
|
+
for (const change of v.changes) {
|
|
25
|
+
console.log(` ${chalk.dim('-')} ${change}`);
|
|
26
|
+
}
|
|
27
|
+
console.log();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,QAAQ,GAAc;IAC1B;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,iBAAiB;YACjB,iDAAiD;YACjD,qCAAqC;YACrC,+CAA+C;YAC/C,6BAA6B;YAC7B,mEAAmE;YACnE,mCAAmC;YACnC,0BAA0B;YAC1B,qFAAqF;YACrF,gCAAgC;SACjC;KACF;CACF,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAEvE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QACvE,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { initCommand } from './commands/init.js';
|
|
4
|
+
import { updateCommand } from './commands/update.js';
|
|
5
|
+
import { versionsCommand } from './commands/versions.js';
|
|
6
|
+
const program = new Command();
|
|
7
|
+
program
|
|
8
|
+
.name('mobile-best-practices')
|
|
9
|
+
.description('CLI to install Mobile Best Practices skill for AI coding assistants')
|
|
10
|
+
.version('1.0.0');
|
|
11
|
+
program
|
|
12
|
+
.command('init')
|
|
13
|
+
.description('Install mobile best practices skill for your AI assistant')
|
|
14
|
+
.option('--ai <platform>', 'AI assistant (claude, cursor, windsurf, copilot, kiro, codex, gemini, roocode, continue, opencode, qoder, codebuddy, trae, antigravity, all)')
|
|
15
|
+
.option('--platform <mobile>', 'Mobile platform (android, ios, flutter, react-native, all)')
|
|
16
|
+
.option('--offline', 'Skip GitHub, use bundled assets')
|
|
17
|
+
.action(initCommand);
|
|
18
|
+
program
|
|
19
|
+
.command('update')
|
|
20
|
+
.description('Check for and install updates')
|
|
21
|
+
.action(updateCommand);
|
|
22
|
+
program
|
|
23
|
+
.command('versions')
|
|
24
|
+
.description('List available versions and changelog')
|
|
25
|
+
.action(versionsCommand);
|
|
26
|
+
program.parse();
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,uBAAuB,CAAC;KAC7B,WAAW,CAAC,qEAAqE,CAAC;KAClF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,iBAAiB,EAAE,8IAA8I,CAAC;KACzK,MAAM,CAAC,qBAAqB,EAAE,4DAA4D,CAAC;KAC3F,MAAM,CAAC,WAAW,EAAE,iCAAiC,CAAC;KACtD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface PlatformConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
type: 'skill' | 'rules' | 'instructions' | 'workflow' | 'skills';
|
|
5
|
+
installPath: string;
|
|
6
|
+
files: Record<string, string>;
|
|
7
|
+
settings?: {
|
|
8
|
+
file: string;
|
|
9
|
+
permissions: string[];
|
|
10
|
+
};
|
|
11
|
+
ruleFormat?: string;
|
|
12
|
+
skillPath: string;
|
|
13
|
+
}
|
|
14
|
+
export type AIPlatform = 'claude' | 'cursor' | 'windsurf' | 'copilot' | 'kiro' | 'codex' | 'gemini' | 'roocode' | 'continue' | 'opencode' | 'qoder' | 'codebuddy' | 'trae' | 'agent' | 'antigravity' | 'all';
|
|
15
|
+
export declare const SUPPORTED_PLATFORMS: AIPlatform[];
|
|
16
|
+
export type MobilePlatform = 'android' | 'ios' | 'flutter' | 'react-native' | 'all';
|
|
17
|
+
export declare const MOBILE_PLATFORMS: MobilePlatform[];
|
|
18
|
+
export interface Version {
|
|
19
|
+
version: string;
|
|
20
|
+
date: string;
|
|
21
|
+
changes: string[];
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,GACN,OAAO,GACP,QAAQ,GACR,SAAS,GACT,UAAU,GACV,UAAU,GACV,OAAO,GACP,WAAW,GACX,MAAM,GACN,OAAO,GACP,aAAa,GACb,KAAK,CAAC;AAEV,eAAO,MAAM,mBAAmB,EAAE,UAAU,EAgB3C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,cAAc,GAAG,KAAK,CAAC;AAEpF,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAK5C,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const SUPPORTED_PLATFORMS = [
|
|
2
|
+
'claude',
|
|
3
|
+
'cursor',
|
|
4
|
+
'windsurf',
|
|
5
|
+
'copilot',
|
|
6
|
+
'kiro',
|
|
7
|
+
'codex',
|
|
8
|
+
'gemini',
|
|
9
|
+
'roocode',
|
|
10
|
+
'continue',
|
|
11
|
+
'opencode',
|
|
12
|
+
'qoder',
|
|
13
|
+
'codebuddy',
|
|
14
|
+
'trae',
|
|
15
|
+
'agent',
|
|
16
|
+
'antigravity',
|
|
17
|
+
];
|
|
18
|
+
export const MOBILE_PLATFORMS = [
|
|
19
|
+
'android',
|
|
20
|
+
'ios',
|
|
21
|
+
'flutter',
|
|
22
|
+
'react-native',
|
|
23
|
+
];
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,OAAO;IACP,WAAW;IACX,MAAM;IACN,OAAO;IACP,aAAa;CACd,CAAC;AAIF,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD,SAAS;IACT,KAAK;IACL,SAAS;IACT,cAAc;CACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PlatformConfig, MobilePlatform } from '../types/index.js';
|
|
2
|
+
export declare function getAssetsDir(): string;
|
|
3
|
+
export declare function getTemplatesDir(): string;
|
|
4
|
+
export declare function loadPlatformConfig(platform: string): PlatformConfig;
|
|
5
|
+
export declare function ensureDir(dir: string): void;
|
|
6
|
+
export declare function copyDir(src: string, dest: string): void;
|
|
7
|
+
export declare function generateSkillFile(config: PlatformConfig, targetDir: string, mobilePlatform?: MobilePlatform): void;
|
|
8
|
+
export declare function installForPlatform(platform: string, projectDir: string, mobilePlatform?: MobilePlatform): void;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxE,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAMnE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGvD;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,EACjB,cAAc,GAAE,cAAsB,GACrC,IAAI,CA2CN;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,cAAc,GAAE,cAAsB,GACrC,IAAI,CA+CN"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, cpSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = dirname(__filename);
|
|
6
|
+
export function getAssetsDir() {
|
|
7
|
+
return join(__dirname, '..', '..', 'assets');
|
|
8
|
+
}
|
|
9
|
+
export function getTemplatesDir() {
|
|
10
|
+
return join(getAssetsDir(), 'templates');
|
|
11
|
+
}
|
|
12
|
+
export function loadPlatformConfig(platform) {
|
|
13
|
+
const configPath = join(getTemplatesDir(), 'platforms', `${platform}.json`);
|
|
14
|
+
if (!existsSync(configPath)) {
|
|
15
|
+
throw new Error(`Platform config not found: ${platform}`);
|
|
16
|
+
}
|
|
17
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
18
|
+
}
|
|
19
|
+
export function ensureDir(dir) {
|
|
20
|
+
if (!existsSync(dir)) {
|
|
21
|
+
mkdirSync(dir, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function copyDir(src, dest) {
|
|
25
|
+
ensureDir(dest);
|
|
26
|
+
cpSync(src, dest, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
export function generateSkillFile(config, targetDir, mobilePlatform = 'all') {
|
|
29
|
+
const assetsDir = getAssetsDir();
|
|
30
|
+
const skillsDir = join(assetsDir, 'skills');
|
|
31
|
+
const skillPath = config.skillPath;
|
|
32
|
+
// Try to load platform-specific skill file
|
|
33
|
+
const skillFileName = mobilePlatform === 'all' ? 'all.md' : `${mobilePlatform}.md`;
|
|
34
|
+
const platformSkillPath = join(skillsDir, skillFileName);
|
|
35
|
+
let content;
|
|
36
|
+
if (existsSync(platformSkillPath)) {
|
|
37
|
+
// Use platform-specific SKILL.md
|
|
38
|
+
content = readFileSync(platformSkillPath, 'utf-8');
|
|
39
|
+
content = content.replace(/\{SKILL_PATH\}/g, skillPath);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Fallback to template-based generation
|
|
43
|
+
const baseContent = readFileSync(join(getTemplatesDir(), 'base', 'skill-content.md'), 'utf-8');
|
|
44
|
+
const quickRef = readFileSync(join(getTemplatesDir(), 'base', 'quick-reference.md'), 'utf-8');
|
|
45
|
+
let processedBase = baseContent.replace(/\{SKILL_PATH\}/g, skillPath);
|
|
46
|
+
let processedQuickRef = quickRef.replace(/\{SKILL_PATH\}/g, skillPath);
|
|
47
|
+
content = `---
|
|
48
|
+
name: mobile-best-practices
|
|
49
|
+
description: "Mobile development intelligence for Android, iOS, Flutter, and React Native. 1,738 best practices."
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
${processedBase}
|
|
53
|
+
|
|
54
|
+
${processedQuickRef}
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
const targetFile = join(targetDir, config.files.skill || config.files.rule || config.files.instructions || config.files.workflow || 'SKILL.md');
|
|
58
|
+
ensureDir(dirname(targetFile));
|
|
59
|
+
writeFileSync(targetFile, content, 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
export function installForPlatform(platform, projectDir, mobilePlatform = 'all') {
|
|
62
|
+
const config = loadPlatformConfig(platform);
|
|
63
|
+
const targetDir = join(projectDir, config.installPath);
|
|
64
|
+
ensureDir(targetDir);
|
|
65
|
+
// Copy data and scripts
|
|
66
|
+
const assetsDir = getAssetsDir();
|
|
67
|
+
if (config.type === 'skill' || config.type === 'skills') {
|
|
68
|
+
copyDir(join(assetsDir, 'data'), join(targetDir, 'data'));
|
|
69
|
+
copyDir(join(assetsDir, 'scripts'), join(targetDir, 'scripts'));
|
|
70
|
+
copyDir(join(assetsDir, 'references'), join(targetDir, 'references'));
|
|
71
|
+
generateSkillFile(config, targetDir, mobilePlatform);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// For rules/instructions/workflow, generate a single file
|
|
75
|
+
generateSkillFile(config, targetDir, mobilePlatform);
|
|
76
|
+
// Also copy data and scripts to a shared location
|
|
77
|
+
const sharedDir = join(projectDir, '.mobile-best-practices');
|
|
78
|
+
copyDir(join(assetsDir, 'data'), join(sharedDir, 'data'));
|
|
79
|
+
copyDir(join(assetsDir, 'scripts'), join(sharedDir, 'scripts'));
|
|
80
|
+
}
|
|
81
|
+
// Create settings file if needed (Claude only)
|
|
82
|
+
if (config.settings) {
|
|
83
|
+
const settingsPath = join(projectDir, config.settings.file);
|
|
84
|
+
ensureDir(dirname(settingsPath));
|
|
85
|
+
let settings = {};
|
|
86
|
+
if (existsSync(settingsPath)) {
|
|
87
|
+
settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
88
|
+
}
|
|
89
|
+
if (!settings.permissions) {
|
|
90
|
+
settings.permissions = { allow: [] };
|
|
91
|
+
}
|
|
92
|
+
if (!settings.permissions.allow) {
|
|
93
|
+
settings.permissions.allow = [];
|
|
94
|
+
}
|
|
95
|
+
for (const perm of config.settings.permissions) {
|
|
96
|
+
if (!settings.permissions.allow.includes(perm)) {
|
|
97
|
+
settings.permissions.allow.push(perm);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mobile-best-practices",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI to install Mobile Best Practices skill for AI coding assistants",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mobile-best-practices": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"assets"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "npx tsc",
|
|
15
|
+
"dev": "npx tsx src/index.ts",
|
|
16
|
+
"_prepublishOnly": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"commander": "^12.1.0",
|
|
20
|
+
"chalk": "^5.3.0",
|
|
21
|
+
"ora": "^8.1.1",
|
|
22
|
+
"prompts": "^2.4.2"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^22.0.0",
|
|
26
|
+
"@types/prompts": "^2.4.9",
|
|
27
|
+
"typescript": "^5.7.2"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"mobile",
|
|
31
|
+
"android",
|
|
32
|
+
"ios",
|
|
33
|
+
"flutter",
|
|
34
|
+
"react-native",
|
|
35
|
+
"best-practices",
|
|
36
|
+
"claude",
|
|
37
|
+
"cursor",
|
|
38
|
+
"windsurf",
|
|
39
|
+
"copilot",
|
|
40
|
+
"ai-skill",
|
|
41
|
+
"jetpack-compose",
|
|
42
|
+
"swiftui",
|
|
43
|
+
"architecture",
|
|
44
|
+
"mvvm",
|
|
45
|
+
"clean-architecture"
|
|
46
|
+
],
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "git+https://github.com/tungnk123/mobile-best-practices.git",
|
|
51
|
+
"directory": "cli"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://github.com/tungnk123/mobile-best-practices#readme",
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/tungnk123/mobile-best-practices/issues"
|
|
56
|
+
}
|
|
57
|
+
}
|