skills/code-standard/SKILL.md
Automatically provides support for writing code based on ISO 3166-1/3166-2 and ITU-T E.164 standard data when implementing components that handle international standard codes such as phone number inputs, country selectors, and region selectors.
npx skillsauth add astra-technology-company-limited/astra-methodology code-standardInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
When implementing phone number, country code, and region code related components, you must follow the standards below. For the detailed guide, refer to code-standard-reference.md in this directory.
Automatically applied when writing/modifying files that meet the following conditions:
phone, tel, country, region, address, locale, i18n, intl| File | Standard | Contents |
|---|---|---|
| data/iso_3166_1_countries.json | ISO 3166-1 | 249 countries — alpha-2, alpha-3, numeric, Korean name, English name, independence status |
| data/iso_3166_2_regions.json | ISO 3166-2 | 21 countries, 653 administrative regions — region code, English name, local name, subdivision type |
| data/country_calling_codes.json | ITU-T E.164 | 245 entries — international calling codes, ITU zone, shared code information |
KR, US, JP)iso_3166_1_countries.jsonKOR, USA, JPN)// Good
interface Address {
countryCode: string; // ISO 3166-1 alpha-2 (e.g., "KR")
regionCode: string; // ISO 3166-2 (e.g., "KR-11")
}
// Bad
interface Address {
country: string; // "South Korea" — direct string storage prohibited
}
KR-11, US-CA){alpha-2}-{subdivision} (country code + hyphen + subdivision code)iso_3166_2_regions.json based on the selected country+{country code}{number} (e.g., +821012345678)country_calling_codes.json// Good: Separate country code and number input, store as E.164
const phoneNumber = `${callingCode}${localNumber.replace(/[^0-9]/g, '')}`;
// e.g., "+82" + "1012345678" → "+821012345678"
// Bad: Free-form text input
const phone = userInput; // Format not guaranteed
Country selection dropdown:
iso_3166_1_countries.jsonRegion selection dropdown:
iso_3166_2_regions.jsonnameLocal) or English name (nameEn)KR-11)Phone number country code selector:
country_calling_codes.jsonflag + country name + calling code (e.g., 🇰🇷 South Korea +82)+82)| Field Purpose | Recommended Field Name | Type | Description |
|---|---|---|---|
| Country code | countryCode / NATN_CD | CHAR(2) | ISO 3166-1 alpha-2 |
| Country code (3-char) | countryAlpha3 / NATN_A3_CD | CHAR(3) | ISO 3166-1 alpha-3 |
| Region code | regionCode / RGN_CD | VARCHAR(6) | ISO 3166-2 (e.g., KR-11) |
| International phone number | phoneNumber / INTL_TELNO | VARCHAR(15) | E.164 full number |
| Calling code | callingCode / NATN_TELNO | VARCHAR(5) | International calling code (e.g., +82) |
// Country selection component data type
interface Country {
koreanName: string;
englishName: string;
alpha2: string; // Used as value
alpha3: string;
numeric: string;
}
// Region selection data type
interface Region {
code: string; // ISO 3166-2 code (e.g., "KR-11")
nameEn: string;
nameLocal?: string;
type: string;
}
// Phone number input data type
interface CallingCode {
countryNameKo: string;
alpha2: string;
callingCode: string; // e.g., "+82"
}
// Country code field
@Column(name = "NATN_CD", length = 2, columnDefinition = "CHAR(2)")
private String nationCode; // ISO 3166-1 alpha-2
// Region code field
@Column(name = "RGN_CD", length = 6)
private String regionCode; // ISO 3166-2 (e.g., "KR-11")
// International phone number field
@Column(name = "INTL_TELNO", length = 15)
private String internationalPhoneNumber; // E.164 format
# Country code field
nation_code = models.CharField(
max_length=2, verbose_name="Country Code"
) # ISO 3166-1 alpha-2
# Region code field
region_code = models.CharField(
max_length=6, verbose_name="Region Code"
) # ISO 3166-2
# International phone number field
intl_phone_number = models.CharField(
max_length=15, verbose_name="International Phone Number"
) # E.164 format
tools
Runs UAT (User Acceptance Testing) cases in TRUE PARALLEL using Playwright Test runner with isolated browser contexts per worker (separate cookies, localStorage, sessionStorage). Solves the two main limits of /user-test: (1) sequential single-page execution that does not scale beyond a few cases, and (2) one stuck case blocking the rest of the run. Reuses 100% of the /user-test UAT case Markdown+YAML format under docs/tests/uat-cases/, runs them via `npx playwright test --workers=N`, and emits the same report layout (index.html + issues.md + session.json + screenshots/) under docs/tests/uat-reports/. Use when the user asks to "run UAT in parallel", "speed up UAT", "test multi-user", "song song", "uat parallel", or runs /uat-parallel. Distinct from /user-test (sequential Chrome MCP, supports interactive mode), /test-run (developer integration tests), /test-scenario (scenario authoring).
tools
Performs end-user UAT (User Acceptance Testing) by driving a real browser through Chrome MCP, self-verifying each step with hard assertions (DOM / Network / URL / Console), auto-assigning severity on failure, and emitting an HTML report plus issues.md into a timestamped session folder. Supports two modes: interactive (URL + Vietnamese natural-language flow description) and --auto (batch-run pre-authored test cases under docs/tests/uat-cases/). Use when the user asks for "UAT", "user acceptance test", "kiểm thử người dùng", "regression test", or runs /user-test, /uat. Distinct from /test-run (developer-authored technical integration testing) and /test-scenario (scenario authoring from blueprints).
tools
Authors and validates LLM tool descriptions and input schemas (Anthropic Tool Use, MCP servers, LangChain @tool, Pydantic, Zod). Use when the user mentions "tool description", "function calling", "MCP tool", "Pydantic schema", "Zod schema", "@tool decorator", "input_schema", "tool spec", "툴 정의", "함수 호출 스키마", or when editing files that define LLM tool surfaces. Enforces the six required attributes (one-line summary, anti-pattern, synonyms, parameter examples, enum constraints, return shape) and blocks the seven known failure modes — wrong-tool selection, skipped tool, malformed arguments, retry loops, user-intent bypass, wrong side-effect, and un-auditable traces. For authoring ASTRA SKILL.md files use /skill-author instead — this skill is for *runtime* LLM tool surfaces, not for skill files themselves.
development
Creates new SKILL.md files or refactors existing skills to comply with the ASTRA skill best practices guide (docs/development/skill-best-practices.md). Use when user mentions "new skill", "create skill", "SKILL.md", "skill authoring", "스킬 작성", "스킬 만들기", or when editing any file matching skills/**/SKILL.md.