
Workflow
Orchestrate embedded firmware build, flash, debug, and observe across Keil, GCC, EIDE, J-Link, OpenOCD, and probe-rs from one workspace-aware workflow.
Install
npx skills add https://github.com/zhinkgit/embeddedskills --skill workflowWhat is this skill?
- Thin orchestration: discovers Keil / GCC / EIDE projects and selects build, flash, debug, observe backends
- CLI entrypoints: workflow_plan, workflow_run for plan, build, build-flash, build-debug, observe, diagnose
- Observe candidates: jlink:rtt, jlink:swo, openocd:semihosting, openocd:itm, probe-rs:rtt
- Unified config from `.embeddedskills/config.json` plus `.embeddedskills/state.json`—no duplicate workflow config schema
- CLI overrides beat config: e.g. `--build-backend=keil` wins over preferred_build auto
Adoption & trust: 1 installs on skills.sh; 340 GitHub stars; 3/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
Recommended Skills
Azure Kubernetesmicrosoft/azure-skills
Github Actions Docsxixu-me/skills
Deploy To Vercelvercel-labs/agent-skills
Vercel Cli With Tokensvercel-labs/agent-skills
Turborepovercel/turborepo
Docker Expertsickn33/antigravity-awesome-skills
Journey fit
Common Questions / FAQ
Is Workflow safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Workflow
{ "preferred_build": "auto", "preferred_flash": "auto", "preferred_debug": "auto", "preferred_observe": "auto" } # Workflow `workflow` 是一个薄编排层,只负责: - 发现当前 workspace 中的 Keil / GCC / EIDE 工程 - 选择构建、烧录、调试、观测后端 - 串联 `.embeddedskills/state.json` - 聚合底层脚本输出 当前 `observe` 阶段会返回 `jlink:rtt`、`jlink:swo`、`openocd:semihosting`、`openocd:itm`、`probe-rs:rtt` 这几类候选观测后端。 它不会重写底层构建器、烧录器或 GDB 解析逻辑。 ## 命令 ```bash python workflow/scripts/workflow_plan.py --json python workflow/scripts/workflow_run.py plan --json python workflow/scripts/workflow_run.py build --json python workflow/scripts/workflow_run.py build-flash --json python workflow/scripts/workflow_run.py build-debug --json python workflow/scripts/workflow_run.py observe --json python workflow/scripts/workflow_run.py diagnose --json ``` ## 配置 workflow 不再维护独立的工程配置结构,所有工程参数统一从 `.embeddedskills/config.json` 读取。 ### 工程级共享配置 在 `.embeddedskills/config.json` 中,`workflow` 段仅包含首选后端配置: ```json { "workflow": { "preferred_build": "auto", "preferred_flash": "auto", "preferred_debug": "auto", "preferred_observe": "auto" }, "keil": { "project": "...", "target": "..." }, "gcc": { "project": "...", "preset": "..." }, "eide": { "project": "...", "config": "..." }, "jlink": { "device": "...", "interface": "SWD" }, "openocd": { "board": "...", "interface": "..." }, "probe-rs": { "chip": "...", "protocol": "swd" } } ``` ### 参数解析顺序 1. **CLI 参数**(如 `--build-backend=keil`)优先级最高 2. **`.embeddedskills/config.json`** 中的 `workflow` 段配置 3. **自动发现**(当 `preferred_*` 为 `"auto"` 时) 成功执行后,实际使用的后端会自动写回 `.embeddedskills/config.json` 的 `workflow` 段,供下次使用。 ### 与其他 Skill 的协同 workflow 与其他 Skill 的协同只通过以下方式: - `.embeddedskills/config.json`:读取各 Skill 的工程配置 - `.embeddedskills/state.json`:读取/写入运行状态 - 子进程调用底层 Skill 脚本 """workflow 规划:发现工程、候选后端和状态。""" from __future__ import annotations import argparse import json import sys from pathlib import Path ROOT_DIR = Path(__file__).resolve().parents[2] if str(ROOT_DIR) not in sys.path: sys.path.insert(0, str(ROOT_DIR)) from workflow_runtime import ( # noqa: E402 get_state_entry, load_effective_project_config, load_workspace_state, make_result, make_timing, now_iso, output_json, parameter_context, workspace_root, ) def discover_projects(root: Path) -> dict: keil_projects = sorted(str(path.resolve()) for path in root.rglob("*.uvprojx")) gcc_projects = sorted(str(path.parent.resolve()) for path in root.rglob("CMakePresets.json")) eide_projects = sorted(str(path.parents[1].resolve()) for path in root.rglob(".eide/eide.yml")) return { "keil_projects": keil_projects, "gcc_projects": gcc_projects, "eide_projects": eide_projects, } def main() -> None: parser = argparse.ArgumentParser(description="workflow plan") parser.add_argument("--workspace", default=None, help="workspace 根目录,默认当前目录") parser.add_argument("--config", default=None, help="workflow config.json 路径(已废弃,仅保留兼容性)") parser.add_argument("--json", action="store_true", dest="as_json") args = parser.parse_args() started_at = now_iso() started_ts = __import__("time").time() workspace = workspace_root(args.workspace) try: full_config, config_path = load_effective_project_config(str(workspace), args.config) except (FileNotFoundError, ValueError, json.JSONDecodeError) as exc: result = make_result( status="error", action="plan", summary=str(exc), context=parameter_context(provider="workflow", workspace=str(workspace)), error={"code": "invalid_config", "message": str(exc)}, timing=make_timing(started_at, (__import__("time").time() - started_ts) * 1000), ) if args.as_json: output_json(result) else: print(f"错误: {exc}", file=sys.stderr) sys.exit(1) workflow_config = full_config.get("workflow", {}) state = load_work