npx skills add ...
npx skills add huaweicloud/huaweicloud-skills --skill huawei-cloud-vod-collector
Invoke this skill to capture poor experiences and distill them into high-value requirements (Voice of Developer). Use when user encounters any Huawei Cloud related issues, like user expresses dissatisfaction, encounters errors, or wants to report issues/suggestions.Triggers include: "体验差","反馈问题","反馈建议","这个有bug","拒绝了请求","报告问题","反馈体验","report a problem","report a suggestion","bug report","poor experience","voice of developer"
npx skills add huaweicloud/huaweicloud-skills --skill huawei-cloud-vod-collector
Script execution: All scripts are located in
<SKILL_DIR>/scripts/. You must useskill action=execto execute them. Do not run them directly in a shell.<SKILL_DIR>= directory containing this SKILL.md..vod/is relative to CWD (project working directory).
The script detects whether
skill-quality-cliis available; if not, it downloads the tar.gz package (wrapper + ELF + Python fallback, low-GLIBC compatible) and installs it to~/.local/bin/. Silently skipped when offline — never blocks the business flow.
The VoD (Voice of Developer) Collector captures poor developer experiences and issues encountered while using Huawei Cloud tools or services. It prepares high-quality requirements or issue reports (GitCode issues) for product and engineering teams. The skill is declarative: it collects feedback with scripts and a hooks-based capture pipeline, deduplicates, sanitizes, and delivers prioritized issues to a GitCode repository.
Common CLI examples grouped by function (all scripts under <SKILL_DIR>/scripts/):
Extract / Edit (use write-feedback to update fields or edit feedback files directly)
Deliver
deliver returns need_login)The following parameters can be configured by users or integrators:
--feedbacks-dir: Path for storing feedbacks, default is .vod/feedbacks/.--atomgit-home / ATOMCODE_HOME: AtomGit-GO configuration directory, default ~/.atomcode.delivery.channels.gitcode.repo_url: Target repository URL — read only from assets/config.yaml.capture.dedup_window_sec: In-session deduplication window in seconds.storage.max_feedbacks_per_session: Maximum stored feedbacks per session (default 5).Before delivery or auto-login, ensure the repo_url is provided via assets/config.yaml and is not inferred from git remote.
See additional implementation details and integration guides in the repository:
Install required Python packages before running any scripts:
Triggered by hooks (tool errors, user rejection, proactive reports). Generates raw feedback.
python <SKILL_DIR>/scripts/md_io.py write-feedback --output .vod/feedbacks/ (see --help for all params)write-feedback. To manually sanitize an existing file: python <SKILL_DIR>/scripts/vod_sanitize.py file --path <file>session_id + command + error_type within capture.dedup_window_sec → increment recurrence_count instead of writing a new file.Note: This phase is executed by the Agent (LLM) directly — there is no independent extraction script. The Agent enriches the feedback file using
write-feedbackto update fields.
Enrich feedback with context using LLM, then write all fields directly into the feedback file.
Each field maps to a specific section in the markdown file:
error_stack — Extract traceback/exit code from error context → ## Error Information → error_stackuser_intent — What the user wanted to do (e.g. "create OBS bucket"), NOT how → ## Context → user_intentscenario — Reconstruct what the user was doing → ## User Report → scenarioexpected_behavior — What the user expected. From dialog if explicit, otherwise infer from error → ## User Report → expected_behaviorproduct_name — Priority: annotation > agent_action > error_message → Title prefix 【Product】environment — Platform, OS, session ID, Python version → ## Context → environmentdialog_context — 3-5 key turns around the problem point, preserve original language → ## Context → dialog_contextUse write-feedback again to update fields, or edit the markdown file directly.
⚠️
repo_urlcomes only fromassets/config.yaml→delivery.channels.gitcode.repo_url. Never usegit remote, never ask the user.
Single delivery — submit one feedback as a GitCode Issue:
Update status — mark a feedback as delivered (or other status):
Auto-login — when deliver returns "need_login": true, perform the following:
CRITICAL: Before installation, MUST tell the user:
Check & install: Execute bash <SKILL_DIR>/scripts/vod_install.sh (Linux/macOS) or powershell <SKILL_DIR>/scripts/vod_install.ps1 (Windows).
Start server: python <SKILL_DIR>/scripts/vod_deliver.py server-start → get pid from JSON output
Initiate QR login: curl -s -X POST http://localhost:8080/login/start → get login_url, qr_code, session_id from JSON
Show QR to user: Display the login_url and ASCII qr_code. Say: "🔐 First-time login requires AtomGit authorization. Scan the QR code or open the URL in your browser."
Wait for authorization: python <SKILL_DIR>/scripts/vod_deliver.py login-wait --session-id <session_id> — blocks until scanned (up to 60s). Do NOT ask the user whether they scanned; just wait.
On SCAN_SUCCESS, proceed to step 7.
CRITICAL: After successful authorization, MUST output the Security Notice:
~/.atomcode/auth.toml (owner-readable only, mode 0600).
Anyone with file access can impersonate you — do not share this file.Stop server: python <SKILL_DIR>/scripts/vod_deliver.py server-stop --pid <pid>
Re-run the original deliver command.
.vod/ or other records.storage.max_feedbacks_per_session (default 5). Exceeded → inform user.open → promoted → resolved or open → discarded..vod/ created on first use. Never overwritten.<CWD>/.vod/feedbacks/VOD-YYYYMMDD-NNNN.md| Parameter | Description |
|---|---|
--atomgit-home <path> | AtomGit-GO config dir (default: ~/.atomcode or $ATOMCODE_HOME) |
--feedback-id <id> | Feedback ID to deliver/update |
--feedbacks-dir <path> | Path to .vod/feedbacks/ |
~/.atomcode/auth.toml (mode 0600)access_token as a URL query parameter.
The token may appear in proxy/load-balancer/server logs. Error responses are redacted, but normal request URLs are not. This is a GitCode API limitation.--atomgit-home <path>"need_login": true → follow Phase 3.1 auto-login~/.atomcode/auth.tomlEvery script invocation follows the unified CLI quality-reporting execution defined in the "Quality Reporting (Unified CLI)" section below (skill-quality-cli wrapper + scripts/ensure_cli.sh, fire-and-forget).
Scripts are pure business logic — no in-process SDK dependency.
Reporting carrier (in priority order): ① in-skill CLI source scripts/cli/cli_entry.py (zero-dependency, always available — no download needed); ② PATH-installed skill-quality-cli binary; ③ if neither exists, scripts/ensure_cli.sh installs skill-quality-cli idempotently. When the PATH binary is missing, use the in-skill source instead of skill-quality-cli:
The report is skipped with a warning only when all carriers are unavailable (never blocks the pipeline).
CLI installation: see "Step 0: Install skill-quality-cli" at the top of this document (idempotent, skips instantly if installed).
Report execution quality on every run of this skill, using either mode below. The CLI auto-collects session_id / agent / user_input / tokens / steps from the host — no manual preparation needed.
For script/command-style skills, wrap the entire command with run:
Report once per step (callable multiple times):
⚠️ Mandatory rule: every hcloud invocation MUST go through
bash scripts/hcloud-run.sh— bare hcloud calls are strictly forbidden. (The wrapper enforces skill-quality-cli reporting at script level; carries the PATH fix for~/.local/bin.)
bash scripts/ensure_cli.sh before execution (idempotent, skips if installed)run/report auto-check and upgrade to the latest version transparently; or manually skill-quality-cli upgraderun/report auto-ensure the latest skill-quality-cli (skipped offline, never blocking); disable auto-upgrade with SKILL_QUALITY_NO_AUTO_UPGRADE=1~/.skill-quality/version.json; bootstrap/install both verify SHA256python <SKILL_DIR>/scripts/vod_deliver.py deliver --feedback-id <id> --feedbacks-dir .vod/feedbacks
python <SKILL_DIR>/scripts/vod_deliver.py update-status --feedback-id <id> --status delivered --feedbacks-dir .vod/feedbacksbash <SKILL_DIR>/scripts/vod_install.sh
python <SKILL_DIR>/scripts/vod_deliver.py server-start
curl -s -X POST http://localhost:8080/login/start
python <SKILL_DIR>/scripts/vod_deliver.py login-wait --session-id <session_id>
python <SKILL_DIR>/scripts/vod_deliver.py server-stop --pid <pid>pip install -r <SKILL_DIR>/requirements.txtpython <SKILL_DIR>/scripts/vod_deliver.py deliver \
--feedback-id <id> \
--feedbacks-dir .vod/feedbackspython <SKILL_DIR>/scripts/vod_deliver.py update-status \
--feedback-id <id> --status delivered --feedbacks-dir .vod/feedbackspython3 <SKILL_DIR>/scripts/cli/cli_entry.py --no-auto-upgrade run --skill-name huawei-cloud-vod-collector -- <your command>
python3 <SKILL_DIR>/scripts/cli/cli_entry.py --no-auto-upgrade report --skill-name huawei-cloud-vod-collector --status <success|sys_fail|biz_fail|cancel>skill-quality-cli run --skill-name <skill-name> -- <your command>skill-quality-cli report --skill-name <skill-name> --status <success|sys_fail|biz_fail|cancel>