web-artifacts-builder-jp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited web-artifacts-builder-jp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
単一HTMLファイルで完結するWebアーティファクト(ミニアプリ・ツール・デモ)の構築を支援するスキルです。HTML + CSS + JavaScript を1ファイルにまとめ、日本語UIコンポーネントやi18n設定を組み込みます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>アプリ名</title>
<style>
/* CSS をここに記述 */
</style>
</head>
<body>
<!-- HTML をここに記述 -->
<script>
// JavaScript をここに記述
</script>
</body>
</html>function toWareki(date) {
return new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
era: 'long', year: 'numeric', month: 'long', day: 'numeric'
}).format(date);
}
// 例: "令和8年3月4日"<select id="prefecture" name="prefecture">
<option value="">都道府県を選択</option>
<optgroup label="北海道・東北">
<option value="01">北海道</option>
<option value="02">青森県</option>
<!-- ...東北各県 -->
</optgroup>
<optgroup label="関東">
<option value="13">東京都</option>
<!-- ...関東各都県 -->
</optgroup>
<!-- ...全47都道府県をグループ分けして配置 -->
</select>async function searchAddress(zipcode) {
const code = zipcode.replace("-", "");
const res = await fetch(
`https://zipcloud.ibsnet.co.jp/api/search?zipcode=${code}`
);
const data = await res.json();
if (data.results) {
const addr = data.results[0];
return {
prefecture: addr.address1, // 都道府県
city: addr.address2, // 市区町村
town: addr.address3 // 町域
};
}
return null;
}<label>氏名 <input type="text" id="name" placeholder="山田 太郎"></label>
<label>ふりがな <input type="text" id="furigana" placeholder="やまだ たろう"></label>
<script>
// compositionイベントを利用してIME入力中の読みを取得
const nameInput = document.getElementById("name");
const furiganaInput = document.getElementById("furigana");
nameInput.addEventListener("compositionupdate", (e) => {
// 変換前のひらがな入力をふりがなフィールドに反映
furiganaInput.value += e.data;
});
</script><!-- 言語設定 -->
<html lang="ja">
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- OGP 日本語設定 -->
<meta property="og:locale" content="ja_JP">
<meta property="og:title" content="アプリ名">
<meta property="og:description" content="アプリの説明文">// 日付フォーマット
new Intl.DateTimeFormat('ja-JP').format(date); // "2026/3/4"
// 数値フォーマット(カンマ区切り)
new Intl.NumberFormat('ja-JP').format(1234567); // "1,234,567"
// 通貨フォーマット
new Intl.NumberFormat('ja-JP', {
style: 'currency', currency: 'JPY'
}).format(1000); // "¥1,000"<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap"
rel="stylesheet">
<style>
body {
font-family: "Noto Sans JP", sans-serif;
}
</style>display=swap で FOIT(Flash of Invisible Text)を防止preconnect でDNS解決を先行させる/* ベースのレスポンシブ設定 */
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: "Noto Sans JP", sans-serif;
line-height: 1.8;
padding: 1rem;
max-width: 800px;
margin: 0 auto;
}
/* モバイルファースト: タブレット以上 */
@media (min-width: 768px) {
body { padding: 2rem; }
}
/* 日本語テキストの折り返し */
p, li, td {
word-break: normal;
overflow-wrap: break-word;
}
/* フォームの入力欄(iOSでのズーム防止: 16px以上) */
input, select, textarea {
font-size: 16px;
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.