证据快照复核于 2026-09-05GitHub 数据核对日期: 2026-08-21
来源已审查独立 Skill自动化与智能体codex Profile

publish

把 Ouroboros Seed 转为经确认的 GitHub Epic 和关联实施任务。

快速了解

它能做什么

把 Ouroboros Seed 转为经确认的 GitHub Epic 和关联实施任务。

本站提供的是中文说明,不代表该项目或 Plugin 自身提供中文界面;语言支持请以上游文档为准。

能力
自动化与智能体工作流自动化集成文档

选择前先看

当 Seed 规格已准备好转为可执行的 GitHub 工作计划时使用。该技能会查找 YAML 访谈 Seed 或 JSON PM Seed,将目标和验收标准整理为 Epic 与任务 Issue,检查可能的重复内容,并在创建前请你确认 Issue 结构。

适合谁

使用 Ouroboros Seed 在 GitHub 中规划实施工作的团队。

常见任务

  • 将新生成的 Seed 发布为包含任务 Issue 的 GitHub Epic。
  • 把 PM Seed 的用户故事和成功标准转为可跟踪的实施工作。
  • 在选择 owner/repo 后发布到当前检出仓库以外的 GitHub 仓库。

权限与数据

通过 GitHub CLI 读取仓库和 Issue 信息,并且只会在交互确认后创建 GitHub 内容。

权限
  • 访问本地 Seed 文件或 Ouroboros Seed 目录。
  • 已安装并完成认证的 GitHub CLI(`gh`)。
  • 对所选 GitHub 仓库具有写入权限。
数据处理
  • 读取 Seed 中的目标、约束、验收标准、元数据及相关规划字段。
  • 将 Seed 派生的内容及其标识写入新建 GitHub Issue 的正文。
外部服务
  • 通过 GitHub CLI 使用 GitHub。
凭据
  • 已认证的 `gh` CLI 会话,且该会话有在目标仓库创建标签、Issue 和评论的权限。

局限

  • 需要已有的 YAML 或 JSON Seed;它不会自行生成 Seed。
  • 如果 GitHub CLI 不可用或未认证,技能会停止。
  • 重复检测依赖 Seed 标识,仍可能需要你自行判断。
  • 技能说明称其只创建新 Issue;除向新建 Epic 添加任务链接评论外,不会修改现有 Issue。

DSHub 已核对

  • 固定版本的技能文档说明了 YAML 和 JSON Seed 支持、仓库选择、重复检查、确认提示和 GitHub Issue 创建流程。
  • 源快照固定到一个特定的 Git 提交。
  • 已检测到 MIT 许可证。

DSHub 未核对

  • DSHub 未安装或执行此候选项。
  • 未验证 GitHub CLI 是否可用、是否已认证及仓库权限。

固定版本安装

主要操作

这个独立 Skill没有 DSH Plugin 安装操作,请根据源码文档使用真实交付方式。

访问源码项目

维护者原文

Skill 使用说明

查看 commit 03714ba 对应的 SKILL.md
维护者编写的上游内容原文于 2026/9/5skills/publish/SKILL.md 获取,正文和仓库相对媒体固定到 commit 03714ba44618,内容哈希为 d6469d708938。以下是未经 DSHub 翻译的上游原文,语言可能与当前页面不同;第三方托管的 badge 可能独立更新。

name: publish description: "Publish Seed specification as GitHub Issues for team-based project management"

/ouroboros:publish

Convert a Seed specification into structured GitHub Issues for team workflows.

Usage

ooo publish [seed_path]
/ouroboros:publish [seed_path]

Trigger keywords: "publish to github", "create issues from seed", "seed to issues"

Instructions

When the user invokes this skill:

Step 1: Prerequisite Check

1a. Verify gh CLI is installed:

command -v gh >/dev/null 2>&1 && echo "OK" || echo "MISSING"

If missing, tell the user:

GitHub CLI (gh) is not installed.
Install it: https://cli.github.com/

Stop.

1b. Verify gh is authenticated:

gh auth status

If not authenticated, tell the user:

GitHub CLI is not authenticated. Run: gh auth login

Stop.

Step 2: Locate the Seed

Ouroboros stores seeds in ~/.ouroboros/seeds/:

  • Interview seeds: ~/.ouroboros/seeds/{seed_id}.yaml (YAML)
  • PM seeds: ~/.ouroboros/seeds/pm_seed_{id}.json (JSON)

Determine the Seed source in this priority order:

  1. Explicit path argument: If the user provided a file path (.yaml or .json), read it directly
  2. Most recent seed file: Search for the most recent seed in the standard location:
    ls -t ~/.ouroboros/seeds/*.yaml ~/.ouroboros/seeds/*.json 2>/dev/null | head -5
    
    If multiple seeds exist, present the top candidates via AskUserQuestion and let the user choose.
  3. Conversation context: If ooo seed or ooo pm was just run in this conversation and the seed path was reported, use that path.

If no seed is found:

No Seed found. Run `ooo seed` or `ooo pm` first to generate a specification.

Stop.

Step 3: Parse the Seed

Detect the file format by extension and parse accordingly:

For YAML seeds (from ooo interview + ooo seed): Read the YAML file and extract:

  • goal → Epic title and description
  • constraints → Listed in Epic body
  • acceptance_criteria → Checklist items in Epic + distributed to Task issues
  • ontology_schema → Documentation section in Epic
  • evaluation_principles → Quality criteria reference
  • exit_conditions → Definition of Done
  • metadata.ambiguity_score → Confidence indicator
  • metadata.seed_id → Used for duplicate detection

For JSON seeds (from ooo pm): Read the JSON file and extract fields using the actual PMSeed schema:

PMSeed field Maps to
pm_id Seed identifier (for duplicate detection)
product_name Epic title prefix
goal Epic Goal section
constraints Epic Constraints section (array of strings)
success_criteria Acceptance Criteria checklist (array of strings)
user_stories User Stories section (array of {persona, action, benefit})
deferred_items Deferred Items section (array of strings)
decide_later_items Open Questions section (array of strings)
assumptions Assumptions section (array of strings)

Format user stories as: "As a {persona}, I want to {action}, so that {benefit}."

If any field is missing or empty, omit that section from the Epic body rather than failing.

Step 4: Detect Repository

4a. Attempt auto-detection from current directory:

gh repo view --json nameWithOwner -q '.nameWithOwner' 2>/dev/null

4b. Present the target repo choice via AskUserQuestion:

If auto-detection succeeded:

{
  "questions": [{
    "question": "Publish Seed as GitHub Issues to this repository?",
    "header": "Target Repository",
    "options": [
      {"label": "<detected_repo>", "description": "Use current repository"},
      {"label": "Other", "description": "I'll specify a different owner/repo"}
    ],
    "multiSelect": false
  }]
}

If auto-detection failed (not in a git repo):

{
  "questions": [{
    "question": "Which GitHub repository should the issues be created in? (format: owner/repo)",
    "header": "Target Repository"
  }]
}

If the user chose "Other", ask:

{
  "questions": [{
    "question": "Enter the target repository (format: owner/repo):",
    "header": "Target Repository"
  }]
}

Store the resolved repository as TARGET_REPO. All subsequent gh commands MUST include -R <TARGET_REPO> to ensure they target the correct repository.

Step 5: Duplicate Check

Before creating issues, check if this seed was already published:

gh issue list -R <TARGET_REPO> --label "ouroboros" --state all --search "<seed_id or pm_id>" --limit 5 --json number,title,state

The search uses the seed's unique identifier (metadata.seed_id for YAML seeds, pm_id for JSON seeds). This works because Step 7 persists the identifier in the Epic body (see the Seed ID field in the Epic template).

If matching issues are found, warn the user via AskUserQuestion:

{
  "questions": [{
    "question": "Found existing Ouroboros issues that may be from the same seed:\n\n<list of matching issues>\n\nCreate new issues anyway?",
    "header": "Duplicate Warning",
    "options": [
      {"label": "Create anyway", "description": "Proceed with new issues"},
      {"label": "Cancel", "description": "Do not create duplicate issues"}
    ],
    "multiSelect": false
  }]
}

If "Cancel": Stop.

Step 6: Plan Issue Structure

Before creating issues, present the planned structure to the user for review.

6a. Break down acceptance criteria into Task groups:

Analyze the acceptance criteria and group them into logical implementation units. Each unit becomes a Task issue. Use your understanding of the domain to create meaningful groupings (e.g., group by feature area, layer, or dependency order).

6b. Present the plan via AskUserQuestion:

{
  "questions": [{
    "question": "Here's the planned issue structure:\n\n**Epic**: <goal summary>\n\n**Tasks**:\n1. <task_1_title> — <brief scope>\n2. <task_2_title> — <brief scope>\n3. <task_3_title> — <brief scope>\n\nProceed with creating these issues?",
    "header": "Issue Plan",
    "options": [
      {"label": "Create issues", "description": "Publish to GitHub now"},
      {"label": "Modify plan", "description": "I want to adjust the structure first"}
    ],
    "multiSelect": false
  }]
}

If "Modify plan": Ask what to change, adjust, and re-present.

Step 7: Create GitHub Issues

IMPORTANT: Every gh command in this step MUST include -R <TARGET_REPO>.

Issue number extraction: gh issue create outputs a URL like https://github.com/owner/repo/issues/42. Extract the issue number by parsing the trailing digits:

EPIC_URL=$(gh issue create -R <TARGET_REPO> --title "..." --label "..." --body "...")
EPIC_NUM=$(echo "$EPIC_URL" | grep -o '[0-9]*$')

Apply the same extraction pattern for every Task issue created.

7a. Create labels (if they don't exist):

gh label create "ouroboros" -R <TARGET_REPO> --description "Created by Ouroboros publish" --color "6f42c1" 2>/dev/null || true
gh label create "epic" -R <TARGET_REPO> --description "Epic / parent issue" --color "0075ca" 2>/dev/null || true
gh label create "task" -R <TARGET_REPO> --description "Implementation task" --color "008672" 2>/dev/null || true

7b. Create the Epic issue:

gh issue create -R <TARGET_REPO> \
  --title "[Epic] <goal_summary>" \
  --label "ouroboros,epic" \
  --body "$(cat <<'BODY'
## Goal

<goal from seed>

## Constraints

<constraints as bullet list>

## Acceptance Criteria

- [ ] <criterion_1>
- [ ] <criterion_2>
- ...

## Ontology

| Field | Type | Description |
|-------|------|-------------|
| <field_name> | <type> | <description> |

## Evaluation Principles

| Principle | Weight | Description |
|-----------|--------|-------------|
| <name> | <weight> | <description> |

## Exit Conditions

<exit conditions as bullet list>

---

**Seed ID**: `<seed_id or pm_id>` | **Ambiguity Score**: <score> | **Seed**: `<seed_file_path>`
*Generated by [Ouroboros](https://github.com/Q00/ouroboros) via `ooo publish`*
BODY
)"

Capture the Epic issue number from the output.

7c. Create Task issues (one per implementation unit):

For each task:

gh issue create -R <TARGET_REPO> \
  --title "[Task] <task_title>" \
  --label "ouroboros,task" \
  --body "$(cat <<'BODY'
Parent: #<epic_number>

## Scope

<what this task covers>

## Acceptance Criteria

- [ ] <specific_criterion_1>
- [ ] <specific_criterion_2>

## Test Checklist

- [ ] <test_1>
- [ ] <test_2>
- [ ] <test_3>

## Pass Criteria

<measurable conditions for this task to be considered done>

---

*Part of [Epic] #<epic_number> | Generated by [Ouroboros](https://github.com/Q00/ouroboros) via `ooo publish`*
BODY
)"

7d. Update Epic with task links:

After all tasks are created, add a comment to the Epic:

gh issue comment <epic_number> -R <TARGET_REPO> --body "$(cat <<'BODY'
## Implementation Tasks

- [ ] #<task_1_number> — <task_1_title>
- [ ] #<task_2_number> — <task_2_title>
- [ ] #<task_3_number> — <task_3_title>

Track overall progress by checking off tasks as their issues are closed.
BODY
)"

Step 8: Summary

Present the results:

Published to <TARGET_REPO>:

  #<epic>  [Epic] <goal_summary>
    ├── #<task_1>  [Task] <task_1_title>
    ├── #<task_2>  [Task] <task_2_title>
    └── #<task_3>  [Task] <task_3_title>

View: https://github.com/<TARGET_REPO>/issues/<epic>

Then suggest next steps:

Next steps:
  - Assign tasks to team members on GitHub
  - Use GitHub Projects board for tracking
  - Run `ooo run` for AI-assisted implementation of individual tasks

Notes

  • No MCP required: This skill works entirely through gh CLI
  • Non-destructive: Creates new issues only, never modifies existing ones
  • Cross-repo support: All gh commands use -R <TARGET_REPO>, so seeds can be published to any repository the user has write access to
  • Works with both seed formats: YAML seeds from ooo seed and JSON seeds from ooo pm are both supported — the parser auto-detects format by file extension

RFC #1392 State Breadcrumb Footer

Your final response MUST end with exactly one breadcrumb footer line:

◆ <current state> → next: <recommended action>

Derive <current state> from live session state via ouroboros_session_status when that MCP projection is available; otherwise derive it from this skill's actual outcome. Never use a linear Step N of M footer because Ouroboros is an evolutionary loop. When the next action is genuinely a choice, list 2-3 honest options in the next: clause. The breadcrumb line must be the last line of the response.

有意识地管理

安装与管理

前置条件与目标 Profile

目标 codex Profile

交付方式 Skill 文件 — https://raw.githubusercontent.com/Q00/ouroboros/03714ba446186423dcb46e25d12bd19c3a2e82f6/skills/publish/SKILL.md

兼容性与访问范围

Requires GitHub CLI authentication and repository write access Not declared in supplied evidence

检查兼容性证据

风险事实

external-write

Creates GitHub labels, issues, and an Epic comment after confirmation.

证据
local-data-access

Reads a supplied Seed file or searches the local Ouroboros seed directory.

证据
证据与编辑审查Manifest、Bundle patch、分发与新鲜度

不可变证据

审查状态与源码活动

人工已批准

在核对来源内容和不可变发布记录后,已由人工批准发布。AI 参与了内容草稿生成,最终发布决定由人工完成。

人工审查于 2026/9/5 UTC 17:19GitHub 事实核对日期: 2026/9/5 UTC 16:31

自当前证据基线以来,没有记录到重要源码变化。

下一步

比较生态 Artifact 类型

订阅重要变化: publish