Category: tool Alibaba Cloud Skill Creator Repository-specific skill engineering workflow for . Use this skill when - Creating a new skill under . - Importing an external skill and adapting it to this repository. - Updating skill trigger quality ( and in frontmatter). - Adding or fixing smoke tests under . - Running structured benchmark loops before merge. Do not use this skill when - The user only needs to execute an existing product skill. - The task is purely application code under with no skill changes. Repository constraints (must enforce) - Skills live under . - Skill folder names use k…

, name):\n return False, f\"Name '{name}' should be kebab-case (lowercase letters, digits, and hyphens only)\"\n if name.startswith('-') or name.endswith('-') or '--' in name:\n return False, f\"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens\"\n # Check name length (max 64 characters per spec)\n if len(name) > 64:\n return False, f\"Name is too long ({len(name)} characters). Maximum is 64 characters.\"\n\n # Extract and validate description\n description = frontmatter.get('description', '')\n if not isinstance(description, str):\n return False, f\"Description must be a string, got {type(description).__name__}\"\n description = description.strip()\n if description:\n # Check for angle brackets\n if '\u003c' in description or '>' in description:\n return False, \"Description cannot contain angle brackets (\u003c or >)\"\n # Check description length (max 1024 characters per spec)\n if len(description) > 1024:\n return False, f\"Description is too long ({len(description)} characters). Maximum is 1024 characters.\"\n\n # Validate compatibility field if present (optional)\n compatibility = frontmatter.get('compatibility', '')\n if compatibility:\n if not isinstance(compatibility, str):\n return False, f\"Compatibility must be a string, got {type(compatibility).__name__}\"\n if len(compatibility) > 500:\n return False, f\"Compatibility is too long ({len(compatibility)} characters). Maximum is 500 characters.\"\n\n return True, \"Skill is valid!\"\n\nif __name__ == \"__main__\":\n if len(sys.argv) != 2:\n print(\"Usage: python quick_validate.py \u003cskill_directory>\")\n sys.exit(1)\n \n valid, message = validate_skill(sys.argv[1])\n print(message)\n sys.exit(0 if valid else 1)","content_type":"text/x-python; charset=utf-8","language":"python","size":3972,"content_sha256":"67cf5703402013936c8fb75ad6a1afecd8841d45cc5e606b634eb05825fde365"},{"filename":"scripts/run_eval.py","content":"#!/usr/bin/env python3\n\"\"\"Run trigger evaluation for a skill description.\n\nTests whether a skill's description causes Claude to trigger (read the skill)\nfor a set of queries. Outputs results as JSON.\n\"\"\"\n\nimport argparse\nimport json\nimport os\nimport select\nimport subprocess\nimport sys\nimport time\nimport uuid\nfrom concurrent.futures import ProcessPoolExecutor, as_completed\nfrom pathlib import Path\n\nfrom scripts.utils import parse_skill_md\n\n\ndef find_project_root() -> Path:\n \"\"\"Find the project root by walking up from cwd looking for .claude/.\n\n Mimics how Claude Code discovers its project root, so the command file\n we create ends up where claude -p will look for it.\n \"\"\"\n current = Path.cwd()\n for parent in [current, *current.parents]:\n if (parent / \".claude\").is_dir():\n return parent\n return current\n\n\ndef run_single_query(\n query: str,\n skill_name: str,\n skill_description: str,\n timeout: int,\n project_root: str,\n model: str | None = None,\n) -> bool:\n \"\"\"Run a single query and return whether the skill was triggered.\n\n Creates a command file in .claude/commands/ so it appears in Claude's\n available_skills list, then runs `claude -p` with the raw query.\n Uses --include-partial-messages to detect triggering early from\n stream events (content_block_start) rather than waiting for the\n full assistant message, which only arrives after tool execution.\n \"\"\"\n unique_id = uuid.uuid4().hex[:8]\n clean_name = f\"{skill_name}-skill-{unique_id}\"\n project_commands_dir = Path(project_root) / \".claude\" / \"commands\"\n command_file = project_commands_dir / f\"{clean_name}.md\"\n\n try:\n project_commands_dir.mkdir(parents=True, exist_ok=True)\n # Use YAML block scalar to avoid breaking on quotes in description\n indented_desc = \"\\n \".join(skill_description.split(\"\\n\"))\n command_content = (\n f\"---\\n\"\n f\"description: |\\n\"\n f\" {indented_desc}\\n\"\n f\"---\\n\\n\"\n f\"# {skill_name}\\n\\n\"\n f\"This skill handles: {skill_description}\\n\"\n )\n command_file.write_text(command_content)\n\n cmd = [\n \"claude\",\n \"-p\", query,\n \"--output-format\", \"stream-json\",\n \"--verbose\",\n \"--include-partial-messages\",\n ]\n if model:\n cmd.extend([\"--model\", model])\n\n # Remove CLAUDECODE env var to allow nesting claude -p inside a\n # Claude Code session. The guard is for interactive terminal conflicts;\n # programmatic subprocess usage is safe.\n env = {k: v for k, v in os.environ.items() if k != \"CLAUDECODE\"}\n\n process = subprocess.Popen(\n cmd,\n stdout=subprocess.PIPE,\n stderr=subprocess.DEVNULL,\n cwd=project_root,\n env=env,\n )\n\n triggered = False\n start_time = time.time()\n buffer = \"\"\n # Track state for stream event detection\n pending_tool_name = None\n accumulated_json = \"\"\n\n try:\n while time.time() - start_time \u003c timeout:\n if process.poll() is not None:\n remaining = process.stdout.read()\n if remaining:\n buffer += remaining.decode(\"utf-8\", errors=\"replace\")\n break\n\n ready, _, _ = select.select([process.stdout], [], [], 1.0)\n if not ready:\n continue\n\n chunk = os.read(process.stdout.fileno(), 8192)\n if not chunk:\n break\n buffer += chunk.decode(\"utf-8\", errors=\"replace\")\n\n while \"\\n\" in buffer:\n line, buffer = buffer.split(\"\\n\", 1)\n line = line.strip()\n if not line:\n continue\n\n try:\n event = json.loads(line)\n except json.JSONDecodeError:\n continue\n\n # Early detection via stream events\n if event.get(\"type\") == \"stream_event\":\n se = event.get(\"event\", {})\n se_type = se.get(\"type\", \"\")\n\n if se_type == \"content_block_start\":\n cb = se.get(\"content_block\", {})\n if cb.get(\"type\") == \"tool_use\":\n tool_name = cb.get(\"name\", \"\")\n if tool_name in (\"Skill\", \"Read\"):\n pending_tool_name = tool_name\n accumulated_json = \"\"\n else:\n return False\n\n elif se_type == \"content_block_delta\" and pending_tool_name:\n delta = se.get(\"delta\", {})\n if delta.get(\"type\") == \"input_json_delta\":\n accumulated_json += delta.get(\"partial_json\", \"\")\n if clean_name in accumulated_json:\n return True\n\n elif se_type in (\"content_block_stop\", \"message_stop\"):\n if pending_tool_name:\n return clean_name in accumulated_json\n if se_type == \"message_stop\":\n return False\n\n # Fallback: full assistant message\n elif event.get(\"type\") == \"assistant\":\n message = event.get(\"message\", {})\n for content_item in message.get(\"content\", []):\n if content_item.get(\"type\") != \"tool_use\":\n continue\n tool_name = content_item.get(\"name\", \"\")\n tool_input = content_item.get(\"input\", {})\n if tool_name == \"Skill\" and clean_name in tool_input.get(\"skill\", \"\"):\n triggered = True\n elif tool_name == \"Read\" and clean_name in tool_input.get(\"file_path\", \"\"):\n triggered = True\n return triggered\n\n elif event.get(\"type\") == \"result\":\n return triggered\n finally:\n # Clean up process on any exit path (return, exception, timeout)\n if process.poll() is None:\n process.kill()\n process.wait()\n\n return triggered\n finally:\n if command_file.exists():\n command_file.unlink()\n\n\ndef run_eval(\n eval_set: list[dict],\n skill_name: str,\n description: str,\n num_workers: int,\n timeout: int,\n project_root: Path,\n runs_per_query: int = 1,\n trigger_threshold: float = 0.5,\n model: str | None = None,\n) -> dict:\n \"\"\"Run the full eval set and return results.\"\"\"\n results = []\n\n with ProcessPoolExecutor(max_workers=num_workers) as executor:\n future_to_info = {}\n for item in eval_set:\n for run_idx in range(runs_per_query):\n future = executor.submit(\n run_single_query,\n item[\"query\"],\n skill_name,\n description,\n timeout,\n str(project_root),\n model,\n )\n future_to_info[future] = (item, run_idx)\n\n query_triggers: dict[str, list[bool]] = {}\n query_items: dict[str, dict] = {}\n for future in as_completed(future_to_info):\n item, _ = future_to_info[future]\n query = item[\"query\"]\n query_items[query] = item\n if query not in query_triggers:\n query_triggers[query] = []\n try:\n query_triggers[query].append(future.result())\n except Exception as e:\n print(f\"Warning: query failed: {e}\", file=sys.stderr)\n query_triggers[query].append(False)\n\n for query, triggers in query_triggers.items():\n item = query_items[query]\n trigger_rate = sum(triggers) / len(triggers)\n should_trigger = item[\"should_trigger\"]\n if should_trigger:\n did_pass = trigger_rate >= trigger_threshold\n else:\n did_pass = trigger_rate \u003c trigger_threshold\n results.append({\n \"query\": query,\n \"should_trigger\": should_trigger,\n \"trigger_rate\": trigger_rate,\n \"triggers\": sum(triggers),\n \"runs\": len(triggers),\n \"pass\": did_pass,\n })\n\n passed = sum(1 for r in results if r[\"pass\"])\n total = len(results)\n\n return {\n \"skill_name\": skill_name,\n \"description\": description,\n \"results\": results,\n \"summary\": {\n \"total\": total,\n \"passed\": passed,\n \"failed\": total - passed,\n },\n }\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"Run trigger evaluation for a skill description\")\n parser.add_argument(\"--eval-set\", required=True, help=\"Path to eval set JSON file\")\n parser.add_argument(\"--skill-path\", required=True, help=\"Path to skill directory\")\n parser.add_argument(\"--description\", default=None, help=\"Override description to test\")\n parser.add_argument(\"--num-workers\", type=int, default=10, help=\"Number of parallel workers\")\n parser.add_argument(\"--timeout\", type=int, default=30, help=\"Timeout per query in seconds\")\n parser.add_argument(\"--runs-per-query\", type=int, default=3, help=\"Number of runs per query\")\n parser.add_argument(\"--trigger-threshold\", type=float, default=0.5, help=\"Trigger rate threshold\")\n parser.add_argument(\"--model\", default=None, help=\"Model to use for claude -p (default: user's configured model)\")\n parser.add_argument(\"--verbose\", action=\"store_true\", help=\"Print progress to stderr\")\n args = parser.parse_args()\n\n eval_set = json.loads(Path(args.eval_set).read_text())\n skill_path = Path(args.skill_path)\n\n if not (skill_path / \"SKILL.md\").exists():\n print(f\"Error: No SKILL.md found at {skill_path}\", file=sys.stderr)\n sys.exit(1)\n\n name, original_description, content = parse_skill_md(skill_path)\n description = args.description or original_description\n project_root = find_project_root()\n\n if args.verbose:\n print(f\"Evaluating: {description}\", file=sys.stderr)\n\n output = run_eval(\n eval_set=eval_set,\n skill_name=name,\n description=description,\n num_workers=args.num_workers,\n timeout=args.timeout,\n project_root=project_root,\n runs_per_query=args.runs_per_query,\n trigger_threshold=args.trigger_threshold,\n model=args.model,\n )\n\n if args.verbose:\n summary = output[\"summary\"]\n print(f\"Results: {summary['passed']}/{summary['total']} passed\", file=sys.stderr)\n for r in output[\"results\"]:\n status = \"PASS\" if r[\"pass\"] else \"FAIL\"\n rate_str = f\"{r['triggers']}/{r['runs']}\"\n print(f\" [{status}] rate={rate_str} expected={r['should_trigger']}: {r['query'][:70]}\", file=sys.stderr)\n\n print(json.dumps(output, indent=2))\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":11464,"content_sha256":"43e3b8f80dbf69c343967ba77e268fae991d9fa3ed68b32a0ff02532cd48657f"},{"filename":"scripts/run_loop.py","content":"#!/usr/bin/env python3\n\"\"\"Run the eval + improve loop until all pass or max iterations reached.\n\nCombines run_eval.py and improve_description.py in a loop, tracking history\nand returning the best description found. Supports train/test split to prevent\noverfitting.\n\"\"\"\n\nimport argparse\nimport json\nimport random\nimport sys\nimport tempfile\nimport time\nimport webbrowser\nfrom pathlib import Path\n\nimport anthropic\n\nfrom scripts.generate_report import generate_html\nfrom scripts.improve_description import improve_description\nfrom scripts.run_eval import find_project_root, run_eval\nfrom scripts.utils import parse_skill_md\n\n\ndef split_eval_set(eval_set: list[dict], holdout: float, seed: int = 42) -> tuple[list[dict], list[dict]]:\n \"\"\"Split eval set into train and test sets, stratified by should_trigger.\"\"\"\n random.seed(seed)\n\n # Separate by should_trigger\n trigger = [e for e in eval_set if e[\"should_trigger\"]]\n no_trigger = [e for e in eval_set if not e[\"should_trigger\"]]\n\n # Shuffle each group\n random.shuffle(trigger)\n random.shuffle(no_trigger)\n\n # Calculate split points\n n_trigger_test = max(1, int(len(trigger) * holdout))\n n_no_trigger_test = max(1, int(len(no_trigger) * holdout))\n\n # Split\n test_set = trigger[:n_trigger_test] + no_trigger[:n_no_trigger_test]\n train_set = trigger[n_trigger_test:] + no_trigger[n_no_trigger_test:]\n\n return train_set, test_set\n\n\ndef run_loop(\n eval_set: list[dict],\n skill_path: Path,\n description_override: str | None,\n num_workers: int,\n timeout: int,\n max_iterations: int,\n runs_per_query: int,\n trigger_threshold: float,\n holdout: float,\n model: str,\n verbose: bool,\n live_report_path: Path | None = None,\n log_dir: Path | None = None,\n) -> dict:\n \"\"\"Run the eval + improvement loop.\"\"\"\n project_root = find_project_root()\n name, original_description, content = parse_skill_md(skill_path)\n current_description = description_override or original_description\n\n # Split into train/test if holdout > 0\n if holdout > 0:\n train_set, test_set = split_eval_set(eval_set, holdout)\n if verbose:\n print(f\"Split: {len(train_set)} train, {len(test_set)} test (holdout={holdout})\", file=sys.stderr)\n else:\n train_set = eval_set\n test_set = []\n\n client = anthropic.Anthropic()\n history = []\n exit_reason = \"unknown\"\n\n for iteration in range(1, max_iterations + 1):\n if verbose:\n print(f\"\\n{'='*60}\", file=sys.stderr)\n print(f\"Iteration {iteration}/{max_iterations}\", file=sys.stderr)\n print(f\"Description: {current_description}\", file=sys.stderr)\n print(f\"{'='*60}\", file=sys.stderr)\n\n # Evaluate train + test together in one batch for parallelism\n all_queries = train_set + test_set\n t0 = time.time()\n all_results = run_eval(\n eval_set=all_queries,\n skill_name=name,\n description=current_description,\n num_workers=num_workers,\n timeout=timeout,\n project_root=project_root,\n runs_per_query=runs_per_query,\n trigger_threshold=trigger_threshold,\n model=model,\n )\n eval_elapsed = time.time() - t0\n\n # Split results back into train/test by matching queries\n train_queries_set = {q[\"query\"] for q in train_set}\n train_result_list = [r for r in all_results[\"results\"] if r[\"query\"] in train_queries_set]\n test_result_list = [r for r in all_results[\"results\"] if r[\"query\"] not in train_queries_set]\n\n train_passed = sum(1 for r in train_result_list if r[\"pass\"])\n train_total = len(train_result_list)\n train_summary = {\"passed\": train_passed, \"failed\": train_total - train_passed, \"total\": train_total}\n train_results = {\"results\": train_result_list, \"summary\": train_summary}\n\n if test_set:\n test_passed = sum(1 for r in test_result_list if r[\"pass\"])\n test_total = len(test_result_list)\n test_summary = {\"passed\": test_passed, \"failed\": test_total - test_passed, \"total\": test_total}\n test_results = {\"results\": test_result_list, \"summary\": test_summary}\n else:\n test_results = None\n test_summary = None\n\n history.append({\n \"iteration\": iteration,\n \"description\": current_description,\n \"train_passed\": train_summary[\"passed\"],\n \"train_failed\": train_summary[\"failed\"],\n \"train_total\": train_summary[\"total\"],\n \"train_results\": train_results[\"results\"],\n \"test_passed\": test_summary[\"passed\"] if test_summary else None,\n \"test_failed\": test_summary[\"failed\"] if test_summary else None,\n \"test_total\": test_summary[\"total\"] if test_summary else None,\n \"test_results\": test_results[\"results\"] if test_results else None,\n # For backward compat with report generator\n \"passed\": train_summary[\"passed\"],\n \"failed\": train_summary[\"failed\"],\n \"total\": train_summary[\"total\"],\n \"results\": train_results[\"results\"],\n })\n\n # Write live report if path provided\n if live_report_path:\n partial_output = {\n \"original_description\": original_description,\n \"best_description\": current_description,\n \"best_score\": \"in progress\",\n \"iterations_run\": len(history),\n \"holdout\": holdout,\n \"train_size\": len(train_set),\n \"test_size\": len(test_set),\n \"history\": history,\n }\n live_report_path.write_text(generate_html(partial_output, auto_refresh=True, skill_name=name))\n\n if verbose:\n def print_eval_stats(label, results, elapsed):\n pos = [r for r in results if r[\"should_trigger\"]]\n neg = [r for r in results if not r[\"should_trigger\"]]\n tp = sum(r[\"triggers\"] for r in pos)\n pos_runs = sum(r[\"runs\"] for r in pos)\n fn = pos_runs - tp\n fp = sum(r[\"triggers\"] for r in neg)\n neg_runs = sum(r[\"runs\"] for r in neg)\n tn = neg_runs - fp\n total = tp + tn + fp + fn\n precision = tp / (tp + fp) if (tp + fp) > 0 else 1.0\n recall = tp / (tp + fn) if (tp + fn) > 0 else 1.0\n accuracy = (tp + tn) / total if total > 0 else 0.0\n print(f\"{label}: {tp+tn}/{total} correct, precision={precision:.0%} recall={recall:.0%} accuracy={accuracy:.0%} ({elapsed:.1f}s)\", file=sys.stderr)\n for r in results:\n status = \"PASS\" if r[\"pass\"] else \"FAIL\"\n rate_str = f\"{r['triggers']}/{r['runs']}\"\n print(f\" [{status}] rate={rate_str} expected={r['should_trigger']}: {r['query'][:60]}\", file=sys.stderr)\n\n print_eval_stats(\"Train\", train_results[\"results\"], eval_elapsed)\n if test_summary:\n print_eval_stats(\"Test \", test_results[\"results\"], 0)\n\n if train_summary[\"failed\"] == 0:\n exit_reason = f\"all_passed (iteration {iteration})\"\n if verbose:\n print(f\"\\nAll train queries passed on iteration {iteration}!\", file=sys.stderr)\n break\n\n if iteration == max_iterations:\n exit_reason = f\"max_iterations ({max_iterations})\"\n if verbose:\n print(f\"\\nMax iterations reached ({max_iterations}).\", file=sys.stderr)\n break\n\n # Improve the description based on train results\n if verbose:\n print(f\"\\nImproving description...\", file=sys.stderr)\n\n t0 = time.time()\n # Strip test scores from history so improvement model can't see them\n blinded_history = [\n {k: v for k, v in h.items() if not k.startswith(\"test_\")}\n for h in history\n ]\n new_description = improve_description(\n client=client,\n skill_name=name,\n skill_content=content,\n current_description=current_description,\n eval_results=train_results,\n history=blinded_history,\n model=model,\n log_dir=log_dir,\n iteration=iteration,\n )\n improve_elapsed = time.time() - t0\n\n if verbose:\n print(f\"Proposed ({improve_elapsed:.1f}s): {new_description}\", file=sys.stderr)\n\n current_description = new_description\n\n # Find the best iteration by TEST score (or train if no test set)\n if test_set:\n best = max(history, key=lambda h: h[\"test_passed\"] or 0)\n best_score = f\"{best['test_passed']}/{best['test_total']}\"\n else:\n best = max(history, key=lambda h: h[\"train_passed\"])\n best_score = f\"{best['train_passed']}/{best['train_total']}\"\n\n if verbose:\n print(f\"\\nExit reason: {exit_reason}\", file=sys.stderr)\n print(f\"Best score: {best_score} (iteration {best['iteration']})\", file=sys.stderr)\n\n return {\n \"exit_reason\": exit_reason,\n \"original_description\": original_description,\n \"best_description\": best[\"description\"],\n \"best_score\": best_score,\n \"best_train_score\": f\"{best['train_passed']}/{best['train_total']}\",\n \"best_test_score\": f\"{best['test_passed']}/{best['test_total']}\" if test_set else None,\n \"final_description\": current_description,\n \"iterations_run\": len(history),\n \"holdout\": holdout,\n \"train_size\": len(train_set),\n \"test_size\": len(test_set),\n \"history\": history,\n }\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"Run eval + improve loop\")\n parser.add_argument(\"--eval-set\", required=True, help=\"Path to eval set JSON file\")\n parser.add_argument(\"--skill-path\", required=True, help=\"Path to skill directory\")\n parser.add_argument(\"--description\", default=None, help=\"Override starting description\")\n parser.add_argument(\"--num-workers\", type=int, default=10, help=\"Number of parallel workers\")\n parser.add_argument(\"--timeout\", type=int, default=30, help=\"Timeout per query in seconds\")\n parser.add_argument(\"--max-iterations\", type=int, default=5, help=\"Max improvement iterations\")\n parser.add_argument(\"--runs-per-query\", type=int, default=3, help=\"Number of runs per query\")\n parser.add_argument(\"--trigger-threshold\", type=float, default=0.5, help=\"Trigger rate threshold\")\n parser.add_argument(\"--holdout\", type=float, default=0.4, help=\"Fraction of eval set to hold out for testing (0 to disable)\")\n parser.add_argument(\"--model\", required=True, help=\"Model for improvement\")\n parser.add_argument(\"--verbose\", action=\"store_true\", help=\"Print progress to stderr\")\n parser.add_argument(\"--report\", default=\"auto\", help=\"Generate HTML report at this path (default: 'auto' for temp file, 'none' to disable)\")\n parser.add_argument(\"--results-dir\", default=None, help=\"Save all outputs (results.json, report.html, log.txt) to a timestamped subdirectory here\")\n args = parser.parse_args()\n\n eval_set = json.loads(Path(args.eval_set).read_text())\n skill_path = Path(args.skill_path)\n\n if not (skill_path / \"SKILL.md\").exists():\n print(f\"Error: No SKILL.md found at {skill_path}\", file=sys.stderr)\n sys.exit(1)\n\n name, _, _ = parse_skill_md(skill_path)\n\n # Set up live report path\n if args.report != \"none\":\n if args.report == \"auto\":\n timestamp = time.strftime(\"%Y%m%d_%H%M%S\")\n live_report_path = Path(tempfile.gettempdir()) / f\"skill_description_report_{skill_path.name}_{timestamp}.html\"\n else:\n live_report_path = Path(args.report)\n # Open the report immediately so the user can watch\n live_report_path.write_text(\"\u003chtml>\u003cbody>\u003ch1>Starting optimization loop...\u003c/h1>\u003cmeta http-equiv='refresh' content='5'>\u003c/body>\u003c/html>\")\n webbrowser.open(str(live_report_path))\n else:\n live_report_path = None\n\n # Determine output directory (create before run_loop so logs can be written)\n if args.results_dir:\n timestamp = time.strftime(\"%Y-%m-%d_%H%M%S\")\n results_dir = Path(args.results_dir) / timestamp\n results_dir.mkdir(parents=True, exist_ok=True)\n else:\n results_dir = None\n\n log_dir = results_dir / \"logs\" if results_dir else None\n\n output = run_loop(\n eval_set=eval_set,\n skill_path=skill_path,\n description_override=args.description,\n num_workers=args.num_workers,\n timeout=args.timeout,\n max_iterations=args.max_iterations,\n runs_per_query=args.runs_per_query,\n trigger_threshold=args.trigger_threshold,\n holdout=args.holdout,\n model=args.model,\n verbose=args.verbose,\n live_report_path=live_report_path,\n log_dir=log_dir,\n )\n\n # Save JSON output\n json_output = json.dumps(output, indent=2)\n print(json_output)\n if results_dir:\n (results_dir / \"results.json\").write_text(json_output)\n\n # Write final HTML report (without auto-refresh)\n if live_report_path:\n live_report_path.write_text(generate_html(output, auto_refresh=False, skill_name=name))\n print(f\"\\nReport: {live_report_path}\", file=sys.stderr)\n\n if results_dir and live_report_path:\n (results_dir / \"report.html\").write_text(generate_html(output, auto_refresh=False, skill_name=name))\n\n if results_dir:\n print(f\"Results saved to: {results_dir}\", file=sys.stderr)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":13685,"content_sha256":"bafdb8e25c740813c735c54bf0489b9e87146da4cf697265927513c5430112d7"},{"filename":"scripts/utils.py","content":"\"\"\"Shared utilities for skill-creator scripts.\"\"\"\n\nfrom pathlib import Path\n\n\n\ndef parse_skill_md(skill_path: Path) -> tuple[str, str, str]:\n \"\"\"Parse a SKILL.md file, returning (name, description, full_content).\"\"\"\n content = (skill_path / \"SKILL.md\").read_text()\n lines = content.split(\"\\n\")\n\n if lines[0].strip() != \"---\":\n raise ValueError(\"SKILL.md missing frontmatter (no opening ---)\")\n\n end_idx = None\n for i, line in enumerate(lines[1:], start=1):\n if line.strip() == \"---\":\n end_idx = i\n break\n\n if end_idx is None:\n raise ValueError(\"SKILL.md missing frontmatter (no closing ---)\")\n\n name = \"\"\n description = \"\"\n frontmatter_lines = lines[1:end_idx]\n i = 0\n while i \u003c len(frontmatter_lines):\n line = frontmatter_lines[i]\n if line.startswith(\"name:\"):\n name = line[len(\"name:\"):].strip().strip('\"').strip(\"'\")\n elif line.startswith(\"description:\"):\n value = line[len(\"description:\"):].strip()\n # Handle YAML multiline indicators (>, |, >-, |-)\n if value in (\">\", \"|\", \">-\", \"|-\"):\n continuation_lines: list[str] = []\n i += 1\n while i \u003c len(frontmatter_lines) and (frontmatter_lines[i].startswith(\" \") or frontmatter_lines[i].startswith(\"\\t\")):\n continuation_lines.append(frontmatter_lines[i].strip())\n i += 1\n description = \" \".join(continuation_lines)\n continue\n else:\n description = value.strip('\"').strip(\"'\")\n i += 1\n\n return name, description, content\n","content_type":"text/x-python; charset=utf-8","language":"python","size":1661,"content_sha256":"3af8ae62c40c73ab712207436a0d9a981e845f25c5a7040229eb189cc8e45bb1"}],"content_json":{"type":"doc","content":[{"type":"paragraph","content":[{"text":"Category: tool","type":"text"}]},{"type":"heading","attrs":{"level":1},"content":[{"text":"Alibaba Cloud Skill Creator","type":"text"}]},{"type":"paragraph","content":[{"text":"Repository-specific skill engineering workflow for ","type":"text"},{"text":"alicloud-skills","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Use this skill when","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Creating a new skill under ","type":"text"},{"text":"skills/**","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Importing an external skill and adapting it to this repository.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Updating skill trigger quality (","type":"text"},{"text":"name","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"description","type":"text","marks":[{"type":"code_inline"}]},{"text":" in frontmatter).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Adding or fixing smoke tests under ","type":"text"},{"text":"tests/**","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Running structured benchmark loops before merge.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Do not use this skill when","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The user only needs to execute an existing product skill.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The task is purely application code under ","type":"text"},{"text":"apps/","type":"text","marks":[{"type":"code_inline"}]},{"text":" with no skill changes.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Repository constraints (must enforce)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skills live under ","type":"text"},{"text":"skills/\u003cdomain>/\u003csubdomain>/\u003cskill-name>/","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skill folder names use kebab-case and should start with ","type":"text"},{"text":"alicloud-","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Every skill must include ","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" frontmatter with ","type":"text"},{"text":"name","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"description","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"skills/**/SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" content must stay English-only.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Smoke tests must be in ","type":"text"},{"text":"tests/\u003cdomain>/\u003csubdomain>/\u003cskill-name>-test/SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generated evidence goes to ","type":"text"},{"text":"output/\u003cskill-or-test-skill>/","type":"text","marks":[{"type":"code_inline"}]},{"text":" only.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If skill inventory changes, refresh README index with ","type":"text"},{"text":"scripts/update_skill_index.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Every create/refresh pass MUST start by re-fetching the upstream official docs","type":"text","marks":[{"type":"strong"}]},{"text":" — do not edit a skill from memory or from the previous draft alone. See \"Fetching latest Alibaba Cloud documentation\".","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Standard deliverable layout","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"skills/\u003cdomain>/\u003csubdomain>/\u003cskill-name>/\n├── SKILL.md\n├── agents/openai.yaml\n├── references/\n│ └── sources.md\n└── scripts/ (optional)\n\ntests/\u003cdomain>/\u003csubdomain>/\u003cskill-name>-test/\n└── SKILL.md","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Capture intent","type":"text"}]}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Confirm domain/subdomain and target skill name.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Confirm whether this is new creation, migration, or refactor.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Confirm expected outputs and success criteria.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-fetch the upstream documentation now","type":"text","marks":[{"type":"strong"}]},{"text":", even for a refresh — see \"Fetching latest Alibaba Cloud documentation\". Diff what you find against the existing skill before changing anything.","type":"text"}]}]}]},{"type":"ordered_list","attrs":{"order":2,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Implement skill changes","type":"text"}]}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For new skills: scaffold structure and draft ","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"agents/openai.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For migration from external repo: copy full source tree first, then adapt.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep adaptation minimal but explicit:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Replace environment-specific instructions that do not match this repo.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add repository validation and output discipline sections.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep reusable bundled resources (","type":"text"},{"text":"scripts/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"references/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"assets/","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Always ground the skill in the latest official Alibaba Cloud documentation (see \"Fetching latest Alibaba Cloud documentation\" below) and record every authoritative URL in ","type":"text"},{"text":"references/sources.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"ordered_list","attrs":{"order":3,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add smoke test","type":"text"}]}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create or update ","type":"text"},{"text":"tests/**/\u003cskill-name>-test/SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep it minimal, reproducible, and low-risk.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include exact pass criteria and evidence location.","type":"text"}]}]}]},{"type":"ordered_list","attrs":{"order":4,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate locally","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Run script compile validation for the skill:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 tests/common/compile_skill_scripts.py \\\n --skill-path skills/\u003cdomain>/\u003csubdomain>/\u003cskill-name> \\\n --output output/\u003cskill-name>-test/compile-check.json","type":"text"}]},{"type":"paragraph","content":[{"text":"Refresh skill index when inventory changed:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"scripts/update_skill_index.sh","type":"text"}]},{"type":"paragraph","content":[{"text":"Confirm index presence:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"rg -n \"\u003cskill-name>\" README.md README.zh-CN.md README.zh-TW.md","type":"text"}]},{"type":"paragraph","content":[{"text":"Optional broader checks:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"make test\nmake build-cli","type":"text"}]},{"type":"ordered_list","attrs":{"order":5,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Benchmark loop (optional, for major skills)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If the user asks for quantitative skill evaluation, reuse bundled tooling:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/run_eval.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/aggregate_benchmark.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"eval-viewer/generate_review.py","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"Prefer placing benchmark artifacts in a sibling workspace directory and keep per-iteration outputs.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Definition of done","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skill path and naming follow repository conventions.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Frontmatter is complete and trigger description is explicit.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Test skill exists and has objective pass criteria.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation artifacts are saved under ","type":"text"},{"text":"output/","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"README skill index is refreshed if inventory changed.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/sources.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" lists every upstream URL consulted in this pass, with last-checked date in the note.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Model ids, parameter names, quotas, and pricing in ","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" cite a URL fetched in this pass — none copied forward unverified.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Fetching latest Alibaba Cloud documentation","type":"text"}]},{"type":"paragraph","content":[{"text":"Hard rule: every create or refresh pass starts here.","type":"text","marks":[{"type":"strong"}]},{"text":" Re-fetch the upstream doc tree first, diff it against the existing skill, then write. Do not trust model memory and do not trust the prior draft — Alibaba Cloud rotates model ids, parameter names, and pricing on a weekly cadence.","type":"text"}]},{"type":"paragraph","content":[{"text":"Order of authority (stop at the first source that fully answers the question):","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Help Center (","type":"text"},{"text":"help.aliyun.com/zh/...","type":"text","marks":[{"type":"code_inline"}]},{"text":") — primary source","type":"text"}]},{"type":"paragraph","content":[{"text":"The Chinese path (","type":"text"},{"text":"/zh/","type":"text","marks":[{"type":"code_inline"}]},{"text":") ships first and is the most accurate. The English path (","type":"text"},{"text":"/en/","type":"text","marks":[{"type":"code_inline"}]},{"text":") often lags by weeks; only link to it after confirming parity.","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URL pattern","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"When to use","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Product overview","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://help.aliyun.com/zh/\u003cproduct-slug>/product-overview/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"First read for a new skill","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"API reference","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://help.aliyun.com/zh/\u003cproduct-slug>/\u003capi-reference-slug>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Authoritative request/response schema","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quick start","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://help.aliyun.com/zh/\u003cproduct-slug>/getting-started/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Minimal end-to-end example","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pricing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://help.aliyun.com/zh/\u003cproduct-slug>/billing-overview","type":"text","marks":[{"type":"code_inline"}]},{"text":" (or ","type":"text"},{"text":"model-pricing","type":"text","marks":[{"type":"code_inline"}]},{"text":" for Model Studio)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cost-relevant decisions","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Legacy article id","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://help.aliyun.com/document_detail/\u003cid>.html","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Older articles only — replace with the ","type":"text"},{"text":"/zh/","type":"text","marks":[{"type":"code_inline"}]},{"text":" slug when one exists","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Fetch with ","type":"text"},{"text":"WebFetch","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"WebFetch(url=\"https://help.aliyun.com/zh/\u003cproduct-slug>/\u003capi-reference-slug>\",\n prompt=\"Extract endpoint, parameters, response schema, model ids, and limits.\")","type":"text"}]},{"type":"paragraph","content":[{"text":"If the response is a redirect notice, re-issue ","type":"text"},{"text":"WebFetch","type":"text","marks":[{"type":"code_inline"}]},{"text":" against the redirect URL.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Bailian / Model Studio (","type":"text"},{"text":"/zh/model-studio/...","type":"text","marks":[{"type":"code_inline"}]},{"text":") — entry portal","type":"text"}]},{"type":"paragraph","content":[{"text":"For any DashScope-backed skill (LLM, image, video, audio, embedding, rerank, agent, application), the canonical entry is:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"https://help.aliyun.com/zh/model-studio/models","type":"text"}]},{"type":"paragraph","content":[{"text":"From this page, walk into the topic sub-trees below. Always check ","type":"text"},{"text":"newly-released-models","type":"text","marks":[{"type":"code_inline"}]},{"text":" first — that page is the source of truth for which model ids are GA right now and which were silently retired.","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Topic","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URL slug under ","type":"text"},{"text":"/zh/model-studio/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Notes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Model catalog (entry)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"models","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full list of currently-served models, links into each detail page","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Model release log","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"newly-released-models","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Authoritative for new/retired model ids and dates","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pricing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"model-pricing","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Per-model token/image/second pricing","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Getting started","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"getting-started/models","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Account, key, region prerequisites","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"OpenAI-compatible mode","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai-compatible","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"When the user wants ","type":"text"},{"text":"openai","type":"text","marks":[{"type":"code_inline"}]},{"text":" SDK shape","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quick start (per modality)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\u003cmodality>-quick-start","type":"text","marks":[{"type":"code_inline"}]},{"text":" (e.g. ","type":"text"},{"text":"emoji-quick-start","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Smallest working example","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Text generation (Qwen)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"qwen","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"qwen-coder","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"qwen-vl-ocr","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"qwen3-coder-next","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Family-specific guides","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Image generation/editing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"wan-image-generation-and-editing-api-reference","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"wan-image-generation-api-reference","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"qwen-image-edit-guide","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"z-image-api-reference","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wan / Qwen / Z image lines","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Video generation","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"use-video-generation","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"image-to-video-general-api-reference","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"wan-video-editing-api-reference","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"text-to-video-prompt","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wan video + prompt guide","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Avatar/face/emoji video","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"emoji-detect-api","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"emoji-api","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"liveportrait-*","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"videoretalk-*","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"animate-anyone-*","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Avatar/digital-human pipelines","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Audio (TTS)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"qwen-tts-realtime","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"qwen-tts-voice-cloning","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"qwen-tts-voice-design","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Realtime, cloning, voice design","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Audio (ASR)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"qwen-asr","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"qwen-asr-filetrans-api","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"recorded-speech-recognition-qwen","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Streaming and file-transcribe","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File handling","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"get-temporary-file-url","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"OSS temporary URL upload for media APIs","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Embeddings & rerank","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"embedding-api-details","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"text-embedding-async-api","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"text-rerank-api","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Vector + rerank stack","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Application & agent","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"agent-application","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"bailian-application-api","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Hosted Bailian application/agent runtime","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tool integration","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"cline","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"langchain","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"dify-integration","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Third-party client wiring","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"If a slug is unknown, GET the entry page first and let the sidebar tell you the current path — slugs occasionally change.","type":"text"}]},{"type":"paragraph","content":[{"text":"DashScope runtime base URLs:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"Mainland: https://dashscope.aliyuncs.com/api/v1/...\nSingapore: https://dashscope-intl.aliyuncs.com/api/v1/...","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. OpenAPI Portal metadata (","type":"text"},{"text":"api.aliyun.com","type":"text","marks":[{"type":"code_inline"}]},{"text":") — machine-readable spec","type":"text"}]},{"type":"paragraph","content":[{"text":"Use this for non-DashScope products (ECS, OSS, RDS, SLS, ESA, …) when you need exact request/response field types or a complete API list.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"# All products (one-time index, EN labels)\nhttps://api.aliyun.com/meta/v1/products.json?language=EN_US\n\n# All APIs for a product/version\nhttps://api.aliyun.com/meta/v1/products/\u003cProduct>/versions/\u003cYYYY-MM-DD>/api-docs.json\n\n# Single API definition (full schema)\nhttps://api.aliyun.com/meta/v1/products/\u003cProduct>/versions/\u003cYYYY-MM-DD>/apis/\u003cApiName>/api.json","type":"text"}]},{"type":"paragraph","content":[{"text":"Repository helpers already wrap these endpoints — reuse them rather than writing one-off scrapers:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/products_from_openapi_meta.py # refresh product index\npython3 scripts/apis_from_openapi_meta.py # fetch APIs per product (env-driven)","type":"text"}]},{"type":"paragraph","content":[{"text":"Browsable portal: ","type":"text"},{"text":"https://api.aliyun.com/product/\u003cProduct>","type":"text","marks":[{"type":"code_inline"}]},{"text":" — for human inspection and to confirm a ","type":"text"},{"text":"\u003cProduct>","type":"text","marks":[{"type":"code_inline"}]},{"text":" code before scripting.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. Official SDKs and CLIs","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Source","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URL pattern","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use for","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"GitHub orgs","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://github.com/aliyun","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"https://github.com/AliyunContainerService","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"https://github.com/alibabacloud-sdk","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reference SDK code, examples","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PyPI","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://pypi.org/project/dashscope/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"https://pypi.org/project/alibabacloud-\u003cproduct>/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Python install + current version","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"npm","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://www.npmjs.com/package/@alicloud/\u003cproduct>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Node install + current version","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Aliyun CLI","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://github.com/aliyun/aliyun-cli","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"aliyun \u003cproduct> help","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Shell-based skills","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5. Recording sources","type":"text"}]},{"type":"paragraph","content":[{"text":"Every skill MUST list the URLs it actually consulted in this pass, in ","type":"text"},{"text":"references/sources.md","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# Sources\n\n- [\u003cHuman title>](\u003cURL>) — what this covers (last checked YYYY-MM-DD)","type":"text"}]},{"type":"paragraph","content":[{"text":"Include at minimum: API reference, model/version notice (","type":"text"},{"text":"newly-released-models","type":"text","marks":[{"type":"code_inline"}]},{"text":" for Model Studio), pricing (if relevant), and SDK home page. Date-stamp each entry — that is how the next maintainer knows what is stale.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Red flags — STOP and re-fetch","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Editing the skill without opening any upstream URL in this session.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Copying model ids, parameter names, or quotas forward from the existing draft.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Linking only to ","type":"text"},{"text":"/en/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pages without checking ","type":"text"},{"text":"/zh/","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Saving raw HTML/JSON dumps under ","type":"text"},{"text":"references/","type":"text","marks":[{"type":"code_inline"}]},{"text":" instead of summarizing into ","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Writing ","type":"text"},{"text":"curl","type":"text","marks":[{"type":"code_inline"}]},{"text":" loops when ","type":"text"},{"text":"scripts/products_from_openapi_meta.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"scripts/apis_from_openapi_meta.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" already cover the call.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"References","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/schemas.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/sources.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"aliyun-skill-creator","author":"@skillopedia","source":{"stars":391,"repo_name":"alicloud-skills","origin_url":"https://github.com/cinience/alicloud-skills/blob/HEAD/skills/platform/skills/aliyun-skill-creator/SKILL.md","repo_owner":"cinience","body_sha256":"bc47d3c6f4d5ea23b42369c6c8319adac7cacea53bae5bbe0a1a7c6fcde8d214","cluster_key":"97d3bab7deac46ccff9277e772ac71bc1f90d70e6ea6567ca9e09cee552dffd6","clean_bundle":{"format":"clean-skill-bundle-v1","source":"cinience/alicloud-skills/skills/platform/skills/aliyun-skill-creator/SKILL.md","attachments":[{"id":"5e5bc280-7b80-535b-afd6-50b86e822f3c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5e5bc280-7b80-535b-afd6-50b86e822f3c/attachment.md","path":"agents/analyzer.md","size":10376,"sha256":"bf68f4cac5a56c673a928c2e6d619586c5b93ea364026ab37547772cb45a663a","contentType":"text/markdown; charset=utf-8"},{"id":"bfba8828-95b1-5477-b0d5-d279fceb9941","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bfba8828-95b1-5477-b0d5-d279fceb9941/attachment.md","path":"agents/comparator.md","size":7287,"sha256":"fe1fc9787c495d864c5d6eada47396478572325fde1b33a96d78bf4b849b7a3e","contentType":"text/markdown; charset=utf-8"},{"id":"fa03a969-1efc-5edd-9b81-1b64474130f5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fa03a969-1efc-5edd-9b81-1b64474130f5/attachment.md","path":"agents/grader.md","size":9049,"sha256":"57134da0c1a4eea33fbd74a1c9c44aa814f07d6bc64de303edb586f941e5d21a","contentType":"text/markdown; charset=utf-8"},{"id":"5bca3b2b-a94a-52dc-96de-6ea0d08da393","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5bca3b2b-a94a-52dc-96de-6ea0d08da393/attachment.yaml","path":"agents/openai.yaml","size":249,"sha256":"027eedbce502c138fc4e5382b1af6146ae3e4f5a0311d491637eca07c15ac4a0","contentType":"application/yaml; charset=utf-8"},{"id":"ba55d85f-3a52-58a9-ab34-a7bd98938288","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ba55d85f-3a52-58a9-ab34-a7bd98938288/attachment.html","path":"assets/eval_review.html","size":7058,"sha256":"ce477dcc74dc1c0d1d3352646a79167b5a63634e936b1019160025065974e452","contentType":"text/html; charset=utf-8"},{"id":"d9ba8c51-18ad-52d7-a034-237931bc95ce","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d9ba8c51-18ad-52d7-a034-237931bc95ce/attachment.py","path":"eval-viewer/generate_review.py","size":16365,"sha256":"fc9d1b9243fe5ab6012ebd579bd76d0035de1b79fd3b969de114defab26478fb","contentType":"text/x-python; charset=utf-8"},{"id":"1b05c658-a07d-5057-9b9b-c6e2fa0be0c8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1b05c658-a07d-5057-9b9b-c6e2fa0be0c8/attachment.html","path":"eval-viewer/viewer.html","size":44998,"sha256":"a53213426ee1100441d701a3a0d49cda7a842f992d2c36463f4d3cc0258575fa","contentType":"text/html; charset=utf-8"},{"id":"e4b088c8-5ebc-59b9-bd83-7c2b5baaf0c2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e4b088c8-5ebc-59b9-bd83-7c2b5baaf0c2/attachment.md","path":"references/schemas.md","size":12061,"sha256":"8e8876180a8989b406a4d3edddf875b04cdfd5805cc8616686d552b11ce4455f","contentType":"text/markdown; charset=utf-8"},{"id":"c3e8fbd7-1ac0-59b5-b4aa-98f83b69ff54","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c3e8fbd7-1ac0-59b5-b4aa-98f83b69ff54/attachment.md","path":"references/sources.md","size":5687,"sha256":"873a398d1200e3e38f12354c2af92e6297ac65c8db406ec1fcb565dacdd7b38a","contentType":"text/markdown; charset=utf-8"},{"id":"c7414993-0580-540c-8b7c-66d2d2efdaea","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c7414993-0580-540c-8b7c-66d2d2efdaea/attachment.py","path":"scripts/__init__.py","size":0,"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","contentType":"text/x-python; charset=utf-8"},{"id":"99f9b914-f755-5961-a69b-7ac96ab18949","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/99f9b914-f755-5961-a69b-7ac96ab18949/attachment.py","path":"scripts/aggregate_benchmark.py","size":14386,"sha256":"123ef128ea5ccc01a4b1ac212ef5567f21e9c13d3d240609780beeb3200c49aa","contentType":"text/x-python; charset=utf-8"},{"id":"39b96a68-0dba-5af5-887e-d912127a92e0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/39b96a68-0dba-5af5-887e-d912127a92e0/attachment.py","path":"scripts/generate_report.py","size":12847,"sha256":"13df7118a3c50c83c4c3250a606d5f2b20b25a3d44cbc392b3d669ec75281453","contentType":"text/x-python; charset=utf-8"},{"id":"c385f804-fc61-52e0-b3b8-4e840d9873e2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c385f804-fc61-52e0-b3b8-4e840d9873e2/attachment.py","path":"scripts/improve_description.py","size":10723,"sha256":"0dc43232db7ac6361775c894f4a1dbac958cb510c51a1230ff9e7fb30a74a7e8","contentType":"text/x-python; charset=utf-8"},{"id":"65bf7aa6-168f-506f-b2d2-a71c132d751a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/65bf7aa6-168f-506f-b2d2-a71c132d751a/attachment.py","path":"scripts/package_skill.py","size":4234,"sha256":"1a33059b0db1ef73375d46d513e5ea81369d2e8838c970597b0d52ddef8d1c0f","contentType":"text/x-python; charset=utf-8"},{"id":"84945684-635e-5d36-98b7-67d286ac3adc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/84945684-635e-5d36-98b7-67d286ac3adc/attachment.py","path":"scripts/quick_validate.py","size":3972,"sha256":"67cf5703402013936c8fb75ad6a1afecd8841d45cc5e606b634eb05825fde365","contentType":"text/x-python; charset=utf-8"},{"id":"5d546bad-b28d-55d4-9853-db20dc3ffab6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5d546bad-b28d-55d4-9853-db20dc3ffab6/attachment.py","path":"scripts/run_eval.py","size":11464,"sha256":"43e3b8f80dbf69c343967ba77e268fae991d9fa3ed68b32a0ff02532cd48657f","contentType":"text/x-python; charset=utf-8"},{"id":"ecb4d37d-3f95-51d7-a215-35991cc71938","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ecb4d37d-3f95-51d7-a215-35991cc71938/attachment.py","path":"scripts/run_loop.py","size":13685,"sha256":"bafdb8e25c740813c735c54bf0489b9e87146da4cf697265927513c5430112d7","contentType":"text/x-python; charset=utf-8"},{"id":"c18c78d1-a2e2-5658-a952-d522013d1f3b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c18c78d1-a2e2-5658-a952-d522013d1f3b/attachment.py","path":"scripts/utils.py","size":1661,"sha256":"3af8ae62c40c73ab712207436a0d9a981e845f25c5a7040229eb189cc8e45bb1","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"5bc242240ecb3672a3cbc85f09dcbbc982f1e5d7cac10057781461e000e23cfa","attachment_count":18,"text_attachments":18,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/platform/skills/aliyun-skill-creator/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"testing-qa","category_label":"Testing"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"testing-qa","import_tag":"clean-skills-v1","description":"Use when creating, migrating, or optimizing skills for this alicloud-skills repository. Use whenever users ask to add a new skill, import an external skill, refactor skill structure, improve trigger descriptions, add smoke tests under tests/**, or benchmark skill quality before merge."}},"renderedAt":1782981284647}

Category: tool Alibaba Cloud Skill Creator Repository-specific skill engineering workflow for . Use this skill when - Creating a new skill under . - Importing an external skill and adapting it to this repository. - Updating skill trigger quality ( and in frontmatter). - Adding or fixing smoke tests under . - Running structured benchmark loops before merge. Do not use this skill when - The user only needs to execute an existing product skill. - The task is purely application code under with no skill changes. Repository constraints (must enforce) - Skills live under . - Skill folder names use k…