project-validator
npx skills add https://github.com/toss/apps-in-toss-skills --skill project-validator
Agent 安装分布
Skill 文档
Project Validator
Validates apps-in-toss project configuration, structure, and policies for both web and React Native projects.
Supported Project Types:
- Web projects using
@apps-in-toss/web-framework - React Native projects using
@apps-in-toss/granitewith Metro bundler - Unity game projects (WebGL builds using
@apps-in-toss/web-framework)
How to Use This Skill
When validating an apps-in-toss project, follow these steps:
- Identify the project type (Web or React Native)
- Read and check the relevant files using the Read tool
- Compare against the schema in the reference documentation
- Report findings to the user with specific issues and solutions
Validation Checklist
Project Structure
Check that the project has:
- â
package.jsonexists - â
granite.config.tsexists - â ï¸
src/directory exists (recommended) - â ï¸
tsconfig.jsonexists (recommended for TypeScript projects)
package.json Validation
Check:
- â File is valid JSON
- â
Has
@apps-in-toss/framework,@apps-in-toss/web-framework, or@granite-js/react-nativein dependencies or devDependencies - â ï¸ Has TDS (Toss Design System) package (strongly recommended for consistent Toss UX):
- For React Native with
@apps-in-toss/framework< 1.0.0:@toss-design-system/react-native - For React Native with
@apps-in-toss/framework>= 1.0.0:@toss/tds-react-native - For Web with
@apps-in-toss/web-framework< 1.0.0:@toss-design-system/mobile - For Web with
@apps-in-toss/web-framework>= 1.0.0:@toss/tds-mobile
- For React Native with
- â ï¸ Has
namefield - â ï¸ Has
versionfield - â ï¸ Has
scriptsfield with common scripts (dev, build, etc.)
granite.config.ts Validation
For Web Projects
Check against web-granite-config-schema.md:
Required checks:
- â File exists and is readable
- â
Imports
defineConfigfrom@apps-in-toss/web-framework/config - â
Has
export default defineConfigstatement - â
Contains required fields:
appName(string)brand(object withdisplayName,primaryColor,icon)permissions(array)web.port(number)web.commands.dev(string)web.commands.build(string)
Optional recommended fields:
- â ï¸
navigationBar(object) - â ï¸
webViewProps(object) - â ï¸
outdir(string)
For React Native Projects
Check against react-native-granite-config-schema.md:
Required checks:
- â File exists and is readable
- â
Imports
defineConfigfrom@granite-js/react-native/config - â
Imports
appsInTossfrom@apps-in-toss/framework/plugins - â
Has
export default defineConfigstatement - â
Contains required fields:
scheme(string)appName(string)
- â
Contains
appsInTossplugin in plugins array with:brand(object withdisplayName,primaryColor,icon)permissions(array)
Optional recommended fields:
- â ï¸
navigationBar(object) - â ï¸
entryFile(string) - â ï¸
outdir(string)
Validation Workflow
When Starting a New Project
- Read
package.jsonto identify project type and framework version - Read
granite.config.tsto determine app type (game vs non-game) - Identify configuration schema to use:
- Web apps (including Unity games): web-granite-config-schema.md
- React Native apps: react-native-granite-config-schema.md
- For non-game apps: Check if TDS package is installed (recommended for better UX)
- For Unity game apps: Check for Unity SDK installation or WebGL build artifacts (see unity-game-validation.md)
- Check all required fields against the appropriate schema
- Report any missing or incorrect configuration
- Provide specific solutions from the schema documentation
When Debugging Configuration Issues
- Ask the user what issues they’re experiencing
- Read the relevant configuration files
- Compare against schema requirements
- Identify the root cause
- Provide the solution from Common Issues and Solutions
When Reviewing Project Setup
- Systematically check all validation points
- Report critical errors (â) first
- Then report warnings (â ï¸)
- Suggest improvements based on best practices
Reporting Validation Results
When reporting validation results to the user:
â Success
All required checks passed. The project configuration is valid.
â Critical Error
Required configuration is missing or invalid. The project may not work correctly.
- Report these with high priority
- Provide specific file location (e.g.,
granite.config.ts:15) - Include the exact fix from the schema documentation
â ï¸ Warning
Non-critical issue detected. The project may work, but best practices recommend addressing these.
- Report these after critical errors
- Explain why the recommendation matters
- Provide optional improvement suggestions
Common Issues and Solutions
Missing Framework Dependencies
Issue: package.json doesn’t have required framework packages
Solution for Web:
npm install @apps-in-toss/web-framework
Solution for React Native:
npm install @granite-js/react-native @apps-in-toss/framework
Missing Required Field: appName
Issue: granite.config.ts is missing the appName field
Solution: Add appName to granite.config.ts:
export default defineConfig({
appName: 'my-app',
// ...
});
Missing Required Field: brand
Issue: granite.config.ts is missing the brand configuration
Solution: Add complete brand object:
export default defineConfig({
brand: {
displayName: 'My App',
primaryColor: '#3182F6',
icon: 'https://static.toss.im/icons/app-icon.png',
},
// ...
});
Missing Required Field: permissions
Issue: granite.config.ts is missing the permissions array
Solution: Add permissions array (can be empty):
export default defineConfig({
permissions: [],
// or with specific permissions:
permissions: [
{ name: 'clipboard', access: 'read' },
{ name: 'camera', access: 'access' },
],
// ...
});
Missing appsInToss Plugin (React Native)
Issue: React Native project doesn’t have appsInToss plugin
Solution: Add the plugin to the plugins array:
import { appsInToss } from '@apps-in-toss/framework/plugins';
export default defineConfig({
plugins: [
appsInToss({
brand: {
displayName: 'My App',
primaryColor: '#3182F6',
icon: 'https://static.toss.im/icons/app-icon.png',
},
permissions: [],
}),
],
});
Incorrect Import Path
Issue: Using wrong import path for defineConfig
Solution for Web:
import { defineConfig } from '@apps-in-toss/web-framework/config';
Solution for React Native:
import { defineConfig } from '@granite-js/react-native/config';
Required File Missing: granite.config.ts
Issue: Project doesn’t have a granite.config.ts file
Solution: Create the file using the appropriate template:
- Web projects: See web-granite-config-schema.md
- React Native projects: See react-native-granite-config-schema.md
Missing Export Statement
Issue: granite.config.ts doesn’t export the configuration
Solution: Add export statement:
export default defineConfig({ /* config */ });
Missing TDS (Toss Design System) Package
Issue: Mini-app doesn’t have TDS package in package.json
Important: TDS is strongly recommended for consistent Toss UX and better review approval chances.
Solution for React Native:
Check framework version in package.json:
If @apps-in-toss/framework < 1.0.0:
npm install @toss-design-system/react-native
If @apps-in-toss/framework >= 1.0.0:
npm install @toss/tds-react-native
Solution for Web:
Check framework version in package.json:
If @apps-in-toss/web-framework < 1.0.0:
npm install @toss-design-system/mobile
If @apps-in-toss/web-framework >= 1.0.0:
npm install @toss/tds-mobile
TDS Documentation:
- React Native: https://tossmini-docs.toss.im/tds-react-native
- Web: https://tossmini-docs.toss.im/tds-mobile
Note: Game apps (appType: ‘game’) may be exempt from TDS requirement
Reference Documentation
Always consult these references when validating:
- web-granite-config-schema.md â Full schema and examples for web
granite.config.ts - react-native-granite-config-schema.md â Full schema and examples for React Native
granite.config.ts - unity-game-validation.md â Validation guide for Unity WebGL game projects
- Apps-in-Toss Unity official docs (key takeaways for validation):
- Platform model & precheck (overview, runtime-structure, precheck): WebGL/WASM + JS bridge; no native plugins; mobile/touch targets; file I/O and sockets limited; AR/XR/Compute constrained.
- Engine versions (recommend-engine): Prefer Unity 2023.3 LTS; 2022.3 stable; 2021.3 legacy; avoid 2024.2 beta for production.
- Migration flow (migration-guide): Precheck â WebGL conversion â Apps-in-Toss SDK integration â UX/perf optimization â
.aitpackaging/monitoring. - Performance goals (perf-optimization, perf-measure): Startup <3s target (<5s max), avg FPS â¥30 on mobile, memory <200MB (critical >300MB), first frame <5s, battery ~90â110% of native.
- Runtime/startup/loading (runtime/performance, startup-speed, loading): Adaptive frame/quality, batching/instancing/LOD/culling, pooled updates; avoid heavy first-frame work; progressive/prioritized loading with unload paths and cache limits; scene transitions near 2s when possible.
- Debugging (debug-exception): Centralized logging to web/Apps-in-Toss, global exception handler with recovery, in-app profiler/console hooks for WebGL.
Best Practices for Validation
- Be Specific: When reporting issues, include exact file paths and line numbers if possible
- Provide Context: Explain why a field is required or recommended
- Offer Solutions: Always provide the exact code fix from the schema documentation
- Prioritize: Report critical errors before warnings
- Be Thorough: Check all required fields, not just the obvious ones
- Check TDS Usage: Verify if TDS package is installed and recommend it for consistent Toss UX
- Provide Documentation Links: Include relevant TDS documentation links when suggesting TDS
Example Validation Report
Validating apps-in-toss project...
â
package.json found and valid
â
granite.config.ts found
Project Type: Web (detected @apps-in-toss/web-framework v1.2.0)
App Type: general (non-game)
â Critical Errors:
1. Missing required field: brand
Location: granite.config.ts
Fix: Add brand configuration with displayName, primaryColor, and icon
2. Missing required field: permissions
Location: granite.config.ts
Fix: Add permissions array (can be empty: permissions: [])
â ï¸ Warnings:
1. Missing recommended field: navigationBar
Suggestion: Add navigationBar for better UX
2. TDS package not found
Recommendation: Install @toss/tds-mobile (for @apps-in-toss/web-framework >= 1.0.0)
Command: npm install @toss/tds-mobile
Benefit: Provides consistent Toss UX and improves review approval chances
Documentation: https://tossmini-docs.toss.im/tds-mobile
Consult: references/web-granite-config-schema.md for complete examples