diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index a1a20e7f..635339c4 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -33,8 +33,8 @@ "repo": "https://github.com/Yeachan-Heo/oh-my-codex.git", "ref": "main", "adapter": "codex-plugin", - "commit": "304fb3b4825c4132c273732b14d2d5e86b54f8e3", - "syncedAt": "2026-09-07T16:00:01Z" + "commit": "cb955b0d5becbef76d2c1f0096b6e1f238e1e7f7", + "syncedAt": "2026-09-11T16:00:01Z" }, { "id": "ui-ux-pro-max", @@ -105,8 +105,8 @@ "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", "adapter": "claude-skill", - "commit": "09ad58f0d58decc9d30799ca83374ff2604ef16b", - "syncedAt": "2026-09-10T23:40:59Z" + "commit": "b3073f8fcf5d2ebeda621a424097dde9dd771cea", + "syncedAt": "2026-09-11T16:00:01Z" }, { "id": "grill-me", @@ -141,8 +141,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "ccef3db535aa163a883f6ac000bdceb16b13e5e5", - "syncedAt": "2026-09-10T23:40:59Z" + "commit": "d155ba9ebfffe4742efefda8d68c2e0e8e490924", + "syncedAt": "2026-09-11T16:00:01Z" }, { "id": "shuorenhua", diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index f5c88e96..7322f5b1 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-09-10T23:43:18Z" + "syncedAt": "2026-09-11T16:02:21Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index bb958250..5dd188f3 100644 --- a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "next-skills", "repo": "https://github.com/vercel/next.js.git", "ref": "canary", - "commit": "ccef3db535aa163a883f6ac000bdceb16b13e5e5", + "commit": "d155ba9ebfffe4742efefda8d68c2e0e8e490924", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-09-10T23:40:59Z" + "syncedAt": "2026-09-11T16:00:01Z" } diff --git a/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json b/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json index 63c98b1c..b3f9d244 100644 --- a/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json +++ b/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "oh-my-codex", - "version": "0.21.4", + "version": "0.21.5", "description": "oh-my-codex 是 Codex CLI 的多 Agent 编排、结构化工作流、插件级 hooks、MCP 和 HUD 扩展插件。", "author": { "name": "Yeachan Heo", diff --git a/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json index 7a3e2d26..6a76558d 100644 --- a/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "oh-my-codex", "repo": "https://github.com/Yeachan-Heo/oh-my-codex.git", "ref": "main", - "commit": "304fb3b4825c4132c273732b14d2d5e86b54f8e3", + "commit": "cb955b0d5becbef76d2c1f0096b6e1f238e1e7f7", "adapter": "codex-plugin", "sourcePath": "plugins/oh-my-codex", - "syncedAt": "2026-09-07T16:00:01Z" + "syncedAt": "2026-09-11T16:00:01Z" } diff --git a/plugins/codex/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md index 252879a8..fa437d25 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md @@ -15,8 +15,7 @@ Use when working code is bloated, noisy, repetitive, over-abstracted, or AI-gene the user requests cleanup/refactor/deslop; or a follow-up left duplicate/dead code, weak boundaries, missing tests, fallback-like paths, or wrappers. Inputs are the requested feature/files and behavior to preserve. A file list scope is valid; keep the pass bounded -to it. In the Ralph workflow, run this skill on Ralph's changed files only, standard mode -unless explicitly requested otherwise. +to it. Limit the pass to the calling task's changed files unless broader cleanup was requested. ## Before editing @@ -24,7 +23,7 @@ unless explicitly requested otherwise. 2. **Create a cleanup plan before code**: list scope and smells, include fallback findings/classifications/escalation, and order safest/highest-signal fixes first. 3. **Inventory fallback-like code** in scope: quick hacks, temporary workaround, temporary fallback, just bypass, just skip, fallback if it fails, swallowed errors, silent defaults, broad compatibility shims, and duplicate alternate execution paths. 4. Classify each fallback: **Masking fallback slop** hides evidence, bypasses the contract, suppresses validation, swallows failures, silently defaults, or adds untested paths; **Grounded compatibility/fail-safe fallback** is narrow at an external/version/fail-safe boundary, documents rationale, preserves failure evidence, and tests primary plus fallback. -5. Prefer root-cause repair, deletion, boundary repair, or explicit failure behavior. For broad/ambiguous/cross-layer/architectural findings, invoke `$ralplan` for consensus resolution; when already inside ralplan, ralph, team, or another OMX workflow, do not spawn a nested `$ralplan`—attach the finding to the active handoff. +5. Prefer root-cause repair, deletion, boundary repair, or explicit failure behavior. For broad/ambiguous/cross-layer/architectural findings, invoke `$ralplan` for consensus resolution; when already inside ralplan, ultragoal, team, or another OMX workflow, do not spawn a nested `$ralplan`—attach the finding to the active handoff. ## Smell taxonomy and passes diff --git a/plugins/codex/plugins/oh-my-codex/skills/best-practice-research/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/best-practice-research/SKILL.md index be6fe73e..f52ec051 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/best-practice-research/SKILL.md @@ -26,7 +26,7 @@ This skill is terminal and read-only by default. It gathers evidence and produce - The answer is fully repo-local; use `explore` for codebase facts. - The main question is whether to adopt, replace, upgrade, or compare dependencies; use `dependency-expert`. -- The user only needs implementation against already-grounded requirements; use `executor`, `$ralph`, or `$team` as appropriate. +- The user only needs implementation against already-grounded requirements; execute directly, or use `$team` when coordinated parallel work is warranted. - The task can be answered from stable local project conventions without current external lookup. ## Specialist Routing diff --git a/plugins/codex/plugins/oh-my-codex/skills/code-review/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/code-review/SKILL.md index 10491446..77569662 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/code-review/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/code-review/SKILL.md @@ -87,7 +87,7 @@ Combine the `code-reviewer` recommendation and architect status. Approval requir Approval criteria: **APPROVE** only when `code-reviewer` returns APPROVE, architect status is `CLEAR`, and both independent lanes returned evidence. **REQUEST CHANGES** for a blocker, unresolved high/critical finding, or unavailable lane. **COMMENT** may record non-blocking findings. -Do not self-review as a fallback. If the `code-reviewer` or `architect` path is missing, unavailable, skipped, or fails, block approval until independent lane evidence exists. On the explicit Ralph path, findings may trigger automatic fix follow-up without another permission prompt; plain `code-review` itself remains read-only and does **not** promise auto-fix. +Do not self-review as a fallback. If the `code-reviewer` or `architect` path is missing, unavailable, skipped, or fails, block approval until independent lane evidence exists. On the supported `omx ralph` CLI compatibility path, findings may trigger automatic fix follow-up without another permission prompt; plain `code-review` itself remains read-only and does **not** promise auto-fix. ## Evidence/output contract diff --git a/plugins/codex/plugins/oh-my-codex/skills/deep-interview/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/deep-interview/SKILL.md index b3fb437b..a9f02427 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/deep-interview/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/deep-interview/SKILL.md @@ -12,7 +12,7 @@ Deep Interview is an intent-first Socratic clarification loop before planning or - The request is broad, ambiguous, or missing concrete acceptance criteria - The user says "deep interview", "interview me", "ask me everything", "don't assume", or "ouroboros" - The user wants to avoid misaligned implementation from underspecified requirements -- You need a requirements artifact before handing off to `ralplan`, `autopilot`, `ralph`, or `team` +- You need a requirements artifact before handing off to `ralplan`, `autopilot`, `ultragoal`, or `team` @@ -149,7 +149,7 @@ If no flag is provided, use **Standard**. Repeat until ambiguity `<= threshold`, the pressure pass is complete, the readiness gates are explicit, the user exits with warning, or max rounds are reached. This is a stop condition: below threshold, do not open a new ordinary interview branch. ### 2a) Generate next question -If the initial context is oversized and no prompt-safe summary has been recorded yet, the next question must be only a summary request. Do not score ambiguity, do not run readiness gates, and do not hand off to `$ultragoal`, `$ralplan`, `$autopilot`, `$ralph`, or `$team` until that summary answer is captured. +If the initial context is oversized and no prompt-safe summary has been recorded yet, the next question must be only a summary request. Do not score ambiguity, do not run readiness gates, and do not hand off to `$ultragoal`, `$ralplan`, `$autopilot`, or `$team` until that summary answer is captured. Use: - Original idea @@ -429,13 +429,13 @@ Only set `execution_contract_required:true` when the selected downstream workflo ### Goal-mode follow-ups -Include these product-facing suggestions when they fit the clarified spec, without removing the existing `$ultragoal`, `$ralplan`, `$autopilot`, `$ralph`, and `$team` handoff options: +Include these product-facing suggestions when they fit the clarified spec, without removing the existing `$ultragoal`, `$ralplan`, `$autopilot`, and `$team` handoff options: - **`$ultragoal`** — default goal-mode follow-up for implementation or general goal-oriented follow-up specs that should be converted into durable Codex/OMX goals with sequential completion tracking. -- **`$autoresearch-goal`** — use when the clarified context is a research project: a research question, reference/literature gathering, evaluator-backed analysis, or professor/critic-style deliverable. +- **`$autoresearch`** — use when the clarified context is a research project: a research question, reference/literature gathering, evaluator-backed analysis, or professor/critic-style deliverable. - **`$performance-goal`** — use when the clarified context is an optimization or performance project with measurable speed, latency, throughput, memory, benchmark, or evaluator criteria. -Recommend `$ultragoal` as the default durable goal-mode follow-up because it supersedes Ralph for goal tracking. Preserve `$team` for coordinated parallel implementation and keep `$ralph` only as an explicit fallback for persistent single-owner execution/verification when the user specifically selects it. +Recommend `$ultragoal` as the default durable goal-mode follow-up because it supersedes Ralph for goal tracking. Preserve `$team` for coordinated parallel implementation. ### 1. **`$ultragoal` (Default durable execution follow-up)** - **Input Artifact:** `.omx/specs/deep-interview-{slug}.md` (optionally accompanied by the transcript/context snapshot for traceability) @@ -444,7 +444,7 @@ Recommend `$ultragoal` as the default durable goal-mode follow-up because it sup - **Skipped / Already-Satisfied Stages:** Requirement interview, ambiguity clarification, doc/context preflight, and early intent-boundary elicitation - **Expected Output:** `.omx/ultragoal/brief.md`, `.omx/ultragoal/goals.json`, `.omx/ultragoal/ledger.jsonl`, implementation evidence, verification evidence, and final cleanup/review-gate evidence - **Best When:** The clarified spec is execution-ready or the user explicitly wants durable goal tracking as the next step -- **Next Recommended Step:** Run the Ultragoal completion loop; launch `$team` only inside an active Ultragoal story when parallel lanes are warranted, and use `$ralph` only as an explicit fallback when the user asks for that legacy persistence mode +- **Next Recommended Step:** Run the Ultragoal completion loop; launch `$team` only inside an active Ultragoal story when parallel lanes are warranted ### 2. **`$ralplan` (Recommended when architecture/test-shape review is still needed)** - **Input Artifact:** `.omx/specs/deep-interview-{slug}.md` (optionally accompanied by the transcript/context snapshot for traceability) @@ -453,7 +453,7 @@ Recommend `$ultragoal` as the default durable goal-mode follow-up because it sup - **Skipped / Already-Satisfied Stages:** Requirements discovery, ambiguity clarification, and early intent-boundary elicitation - **Expected Output:** Canonical planning artifacts under `.omx/plans/`, especially `prd-*.md` and `test-spec-*.md` - **Best When:** Requirements are clear enough to stop interviewing, but architectural validation / consensus planning is still desirable -- **Next Recommended Step:** Use the approved planning artifacts with `$ultragoal` as the default durable goal-mode follow-up (optionally with `$team` for parallel lanes); choose `$autoresearch-goal` for research validation or `$performance-goal` for measurable optimization, and use `$ralph` only as an explicit fallback when a narrow single-owner persistence loop is requested +- **Next Recommended Step:** Use the approved planning artifacts with `$ultragoal` as the default durable goal-mode follow-up (optionally with `$team` for parallel lanes); choose `$autoresearch` for research validation or `$performance-goal` for measurable optimization ### 3. **`$autopilot`** - **Input Artifact:** `.omx/specs/deep-interview-{slug}.md` @@ -462,27 +462,18 @@ Recommend `$ultragoal` as the default durable goal-mode follow-up because it sup - **Skipped / Already-Satisfied Stages:** Initial requirement discovery and ambiguity reduction - **Expected Output:** Planning/execution progress, QA evidence, and validation artifacts produced by autopilot - **Best When:** The clarified spec is already strong enough for direct planning + execution without an additional consensus gate -- **Next Recommended Step:** Continue through autopilot's execution/QA/validation flow; if coordination-heavy execution emerges, prefer `$team` under a leader-owned `$ultragoal` ledger, using `$ralph` only as an explicit fallback when a narrow single-owner persistence loop is requested +- **Next Recommended Step:** Continue through autopilot's execution/QA/validation flow; if coordination-heavy execution emerges, prefer `$team` under a leader-owned `$ultragoal` ledger -### 4. **`$ralph` (Explicit fallback only)** -- **Input Artifact:** `.omx/specs/deep-interview-{slug}.md` -- **Invocation:** `$ralph ` -- **Consumer Behavior:** Use the spec's acceptance criteria and boundary constraints as the persistence target. Do not reopen requirements discovery unless the user explicitly asks to refine further. -- **Skipped / Already-Satisfied Stages:** Requirement interview, ambiguity clarification, and initial scope-definition work -- **Expected Output:** Iterative execution progress and verification evidence tracked against the clarified criteria -- **Best When:** The user explicitly asks for Ralph's persistent sequential completion pressure; otherwise use `$ultragoal` for durable goal tracking and completion checkpoints -- **Next Recommended Step:** If this explicit fallback is selected, continue Ralph's persistence loop; if work expands into coordination-heavy lanes, hand off to `$team` under `$ultragoal` checkpointing rather than promoting Ralph as the next default - -### 5. **`$team`** +### 4. **`$team`** - **Input Artifact:** `.omx/specs/deep-interview-{slug}.md` - **Invocation:** `$team ` - **Consumer Behavior:** Treat the spec as shared execution context for coordinated parallel work. Preserve the clarified intent, non-goals, decision boundaries, and acceptance criteria as common lane constraints. - **Skipped / Already-Satisfied Stages:** Requirement clarification and early ambiguity reduction -- **Expected Output:** Coordinated multi-agent execution against the shared spec, with evidence that can later feed Ultragoal checkpoints by default, or an explicit Ralph verification pass only when requested +- **Expected Output:** Coordinated multi-agent execution against the shared spec, with final verification evidence and checkpoints in an already-active Ultragoal ledger when applicable - **Best When:** The task is large, multi-lane, or blocker-sensitive enough to justify coordinated parallel execution instead of a single persistent loop -- **Next Recommended Step:** Follow the team verification path when the coordinated execution phase finishes; checkpoint completion through `$ultragoal` by default, escalating to a separate Ralph loop only when the user explicitly asks for that persistent verification/fix owner +- **Next Recommended Step:** Follow the team verification path when the coordinated execution phase finishes; checkpoint an already-active `$ultragoal` ledger when applicable. Do not start another execution loop solely to verify. -### 6. **Refine further** +### 5. **Refine further** - **Input Artifact:** Existing transcript, context snapshot, and current spec draft - **Invocation:** Continue the interview loop - **Consumer Behavior:** Re-enter questioning to resolve the highest-leverage remaining uncertainty @@ -534,7 +525,7 @@ Recommend `$ultragoal` as the default durable goal-mode follow-up because it sup - [ ] Fuzzy or conflicting terminology was challenged against repo language/current code behavior when applicable - [ ] Scenario-based edge-case grilling was used when boundary ambiguity would materially affect implementation - [ ] Durable docs/ADR/memory updates, if any, were explicitly opted into and public-safe -- [ ] Handoff options provided (`$ultragoal`, `$ralplan`, `$autopilot`, `$ralph`, `$team`) plus context-sensitive goal-mode suggestions (`$autoresearch-goal`, `$performance-goal`) when applicable +- [ ] Handoff options provided (`$ultragoal`, `$ralplan`, `$autopilot`, `$team`) plus context-sensitive goal-mode suggestions (`$autoresearch`, `$performance-goal`) when applicable - [ ] No direct implementation performed in this mode diff --git a/plugins/codex/plugins/oh-my-codex/skills/design/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/design/SKILL.md index 70df397c..81b2ee4f 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/design/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/design/SKILL.md @@ -12,7 +12,7 @@ Shared operating, delegation, state, hook, team, cancellation, and verification ## Use when - Product, UX, frontend, or design-system decisions need a repo-local source of truth. -- A feature needs a design brief before `$ralph`, a designer lane, or implementation. +- A feature needs a design brief before a designer lane or implementation. - Existing UI, assets, screenshots, or constraints need an actionable design summary. Do not use it for visual-reference implementation matching (use `$visual-ralph`), screenshot comparison alone, or backend/infrastructure work without user-facing design impact. diff --git a/plugins/codex/plugins/oh-my-codex/skills/hud/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/hud/SKILL.md index 22404884..88d0b91d 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/hud/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/hud/SKILL.md @@ -95,4 +95,4 @@ If the TUI statusline is not showing: If `omx hud` shows "No active modes": - This is expected when no workflows are running -- Start a workflow (ralph, autopilot, etc.) and check again +- Start an explicitly requested supported workflow (`$autopilot` or `$ultragoal`) and check again diff --git a/plugins/codex/plugins/oh-my-codex/skills/plan/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/plan/SKILL.md index 9a563989..8faaac22 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/plan/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/plan/SKILL.md @@ -14,7 +14,7 @@ Plan creates concise, actionable work plans. Auto-detects interview vs direct, s -- Want direct execution — use `ultragoal`/`team`/`ralph` +- Want direct execution — execute the scoped task directly; use `ultragoal` only for durable goals or `team` for coordinated parallel work - Simple focused fix with obvious scope — skip planning diff --git a/plugins/codex/plugins/oh-my-codex/skills/ralplan/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/ralplan/SKILL.md index 8b962c76..e7913519 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/ralplan/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/ralplan/SKILL.md @@ -92,7 +92,7 @@ Before any execution lane begins, ralplan must emit terminal planning state (com Ralplan is not complete, skippable, or ready for execution merely because `.omx/plans/prd-*.md` and `.omx/plans/test-spec-*.md` exist. Those files are planning artifacts, not consensus evidence. -Before any Autopilot, Pipeline, Ultragoal, Team, Ralph, or implementation handoff, persist a durable handoff record that distinguishes: +Before any Autopilot, Ultragoal, Team, or implementation handoff, persist a durable handoff record that distinguishes: - `planning_artifacts`: PRD/test-spec paths. - `ralplan_architect_review`: the completed Architect review with an approving verdict. @@ -106,13 +106,13 @@ Follow the Plan skill's full documentation for consensus mode details. ## Goal-Mode Follow-up Suggestions -When a bound `ralplan_execution_handoff` permits execution, include product-facing goal-mode suggestions alongside the existing Ralph and team options. Record the requested lane and persist the handoff without claiming host-issued authority. +When a bound `ralplan_execution_handoff` permits execution, include product-facing goal-mode suggestions alongside coordinated Team execution. Record the requested lane and persist the handoff without claiming host-issued authority. - `$ultragoal` — **default goal-mode follow-up** for implementation or general goal-oriented follow-up plans that should become durable Codex/OMX goals with sequential completion tracking. - `$autoresearch` — research-project follow-up when the plan centers on a question, literature/reference gathering, evaluator-backed research, or a professor/critic-style research deliverable. (`$autoresearch-goal` was retired to a sunset stub in OMX 0.21.) - `$performance-goal` — optimization/performance follow-up when the plan centers on speed, latency, throughput, memory, benchmark, or other measurable performance work. -Keep `$team` as a first-class execution option and keep `$ralph` available only as an explicit fallback where appropriate: use Ultragoal as the default durable goal-mode follow-up, Team for coordinated parallel implementation, and Ralph only for intentionally selected persistent single-owner completion/verification pressure. For parallelizable durable-goal delivery, recommend `$ultragoal` + `$team` together: Ultragoal remains the leader-owned `.omx/ultragoal` ledger/Codex-goal wrapper while Team runs parallel lanes and returns checkpoint-ready evidence. Do not present Ralph as the recommended follow-up when durable goal tracking is needed; present Ultragoal as the superseding default, with Team for parallel delivery and Ralph only as an explicit fallback when its narrow persistence loop is specifically desired. +Use `$ultragoal` for durable goal tracking and `$team` for coordinated parallel implementation. When combined, Ultragoal owns the ledger and Team returns checkpoint-ready execution evidence. Use the available-agent-types roster to produce explicit role/staffing allocation, reasoning-by-lane guidance, concrete launch hints (including `omx team` when parallel delivery is justified), and team verification responsibilities for any future receipt-authorized execution path. ## Pre-context Intake @@ -130,80 +130,15 @@ Before consensus planning or execution handoff, ensure a grounded context snapsh - likely codebase touchpoints 4. If ambiguity remains high, gather brownfield facts first. `omx explore` is deprecated; use normal repository inspection tools/subagents for simple read-only repository lookups and `omx sparkshell` only for explicit shell-native read-only evidence. Then run `$deep-interview --quick ` before continuing. 5. If the plan depends on official docs, version-aware framework guidance, best practices, or external dependency behavior, use `$best-practice-research` as the bounded evidence wrapper and auto-delegate `researcher` for the official/upstream lookup before finalizing the planning handoff so execution does not start from repo-local recall alone. -6. If a prior `$autoresearch` or `$autoresearch-goal` run exists, treat its approved artifact as evidence for the plan. Do not include Autoresearch as a final architecture or runtime component unless the user explicitly requested ongoing research automation; otherwise synthesize the evidence into the `$ralplan` ADR, risks, and verification steps. +6. If a prior `$autoresearch` run exists, treat its approved artifact as evidence for the plan. Read historical artifacts from `$autoresearch-goal` only as compatibility input. Do not include Autoresearch as a final architecture or runtime component unless the user explicitly requested ongoing research automation; otherwise synthesize the evidence into the `$ralplan` ADR, risks, and verification steps. Do not hand off to execution modes until this intake is complete; if urgency forces progress, explicitly document the risk tradeoffs. -## Pre-Execution Gate +## Routing boundary -### Why the Gate Exists - -Execution modes (ralph, autopilot, team, ultrawork) spin up heavy multi-agent orchestration. When launched on a vague request like "ralph improve the app", agents have no clear target — they waste cycles on scope discovery that should happen during planning, often delivering partial or misaligned work that requires rework. - -The ralplan-first gate intercepts underspecified execution requests and redirects them through the ralplan consensus planning workflow. This ensures: -- **Explicit scope**: A PRD defines exactly what will be built -- **Test specification**: Acceptance criteria are testable before code is written -- **Consensus**: Planner, Architect, and Critic agree on the approach -- **No wasted execution**: Agents start with a clear, bounded task - -### Good vs Bad Prompts - -**Passes the gate** (specific enough for direct execution): -- `ralph fix the null check in src/hooks/bridge.ts:326` -- `autopilot implement issue #42` -- `team add validation to function processKeywordDetector` -- `ralph do:\n1. Add input validation\n2. Write tests\n3. Update README` -- `ultrawork add the user model in src/models/user.ts` - -**Gated — redirected to ralplan** (needs scoping first): -- `ralph fix this` -- `autopilot build the app` -- `team improve performance` -- `ralph add authentication` -- `ultrawork make it better` - -**Bypass the gate** (when you know what you want): -- `force: ralph refactor the auth module` -- `! autopilot optimize everything` - -### When the Gate Does NOT Trigger - -The gate auto-passes when it detects **any** concrete signal. You do not need all of them — one is enough: - -| Signal Type | Example prompt | Why it passes | -|---|---|---| -| File path | `ralph fix src/hooks/bridge.ts` | References a specific file | -| Issue/PR number | `ralph implement #42` | Has a concrete work item | -| camelCase symbol | `ralph fix processKeywordDetector` | Names a specific function | -| PascalCase symbol | `ralph update UserModel` | Names a specific class | -| snake_case symbol | `team fix user_model` | Names a specific identifier | -| Test runner | `ralph npm test && fix failures` | Has an explicit test target | -| Numbered steps | `ralph do:\n1. Add X\n2. Test Y` | Structured deliverables | -| Acceptance criteria | `ralph add login - acceptance criteria: ...` | Explicit success definition | -| Error reference | `ralph fix TypeError in auth` | Specific error to address | -| Code block | `ralph add: \`\`\`ts ... \`\`\`` | Concrete code provided | -| Escape prefix | `force: ralph do it` or `! ralph do it` | Explicit user override | - -### End-to-End Flow Example - -1. User types: `ralph add user authentication` -2. Gate detects: execution keyword (`ralph`) + underspecified prompt (no files, functions, or test spec) -3. Gate redirects to **ralplan** with message explaining the redirect -4. Ralplan consensus runs: - - **Planner** creates initial plan (which files, what auth method, what tests) - - **Architect** reviews for soundness - - **Critic** validates quality and testability -5. Architect and Critic approval completes the planning lifecycle and persists `ralplan_consensus_gate.complete:true` as lifecycle evidence. -6. Execution begins when the session-bound, review-cycle-bound `ralplan_execution_handoff` authorizes the selected lane. An active supervised Autopilot run authorizes its defining Ultragoal next stage; standalone Ralplan records the user's selected lane. - -### Troubleshooting - -| Issue | Solution | -|-------|----------| -| Gate fires on a well-specified prompt | Add a file reference, function name, or issue number to anchor the request | -| Want to bypass the gate | Prefix with `force:` or `!` (e.g., `force: ralph fix it`) | -| Gate does not fire on a vague prompt | The gate only catches prompts with <=15 effective words and no concrete anchors; add more detail or use `$ralplan` explicitly | -| Redirected to ralplan but want to stop planning | Cancel or abandon through the workflow's administrative path. Advisory is cooperative and does not enforce host permissions; a real security gate would require an explicit host-issued, host-verified receipt. | +Ordinary scoped tasks stay in the direct execution lane described by `templates/AGENTS.md`. +Explicit workflow requests follow the keyword registry (`src/hooks/keyword-registry.ts`) and their owning skill contracts; this card does not define a second activation table. +Once Ralplan is active, preserve the planning/execution and consensus handoff requirements above. A conversational “just do it” is not a substitute for the required review evidence. ## Scenario Examples diff --git a/plugins/codex/plugins/oh-my-codex/skills/visual-ralph/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/visual-ralph/SKILL.md index 269e8414..c0da9fc5 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/visual-ralph/SKILL.md @@ -1,13 +1,13 @@ --- name: visual-ralph -description: "Visual Ralph orchestration for frontend UI from generated references, static references, or live URL targets, using $ralph with built-in visual verdict and pixel-diff evidence until the implementation matches and leaves a reproducible design system." +description: "Visual Ralph orchestration for frontend UI from generated references, static references, or live URL targets, using $ultragoal with built-in visual verdict and pixel-diff evidence until the implementation matches and leaves a reproducible design system." --- # Visual Ralph Skill Use `$visual-ralph` for measured frontend implementation from an approved generated reference, static image, or live-URL baseline. The loop is: -`description / URL -> approved reference -> $ralph implementation -> Visual Ralph verdict + pixel diff -> reusable design system`. +`description / URL -> approved reference -> $ultragoal implementation -> Visual Ralph verdict + pixel diff -> reusable design system`. For URL cloning, this skill owns the migrated `$web-clone` use case; preserve URL, viewport, fidelity, and interaction notes here. Do not invoke standalone `$web-clone`. @@ -19,7 +19,7 @@ Shared operating, delegation, state, hook, team, cancellation, and verification - A live URL or generated raster mockup needs measured implementation and pixel-level iteration. - The result must leave reusable repo-native tokens/components, not only a matching screenshot. -Do not use it for a durable `DESIGN.md` brief (`$design`), non-visual backend work, comparison-only fixes that can go directly to `$ralph`, or deterministic SVG/code-native assets. +Do not use it for a durable `DESIGN.md` brief (`$design`), non-visual backend work, comparison-only fixes that can be executed directly, or deterministic SVG/code-native assets. ## Workflow @@ -41,11 +41,11 @@ Copy the approved reference into `.omx/artifacts/visual-ralph//reference.p ### 3. Approval gate -Stop after generation or URL capture and obtain approval of one reference image/state (or a targeted regeneration/capture adjustment). Before approval, do not implement or invoke `$ralph`. After approval, the image/baseline is the visual source of truth; major pivots require an explicit user request. +Stop after generation or URL capture and obtain approval of one reference image/state (or a targeted regeneration/capture adjustment). Before approval, do not implement or invoke `$ultragoal`. After approval, the image/baseline is the visual source of truth; major pivots require an explicit user request. -### 4. Hand off to `$ralph` +### 4. Hand off to `$ultragoal` -Pass the approved reference/baseline, URL and permission note when applicable, viewport/content state, interaction parity and exclusions, user description, detected frontend context, screenshot command/viewport, and the completion checklist. Ralph edits, runs, captures, and iterates after approval until matched or blocked. +Pass the approved reference/baseline, URL and permission note when applicable, viewport/content state, interaction parity and exclusions, user description, detected frontend context, screenshot command/viewport, and the completion checklist. The active Ultragoal execution lane edits, runs, captures, and iterates after approval until matched or blocked. ### 5. Verdict before every edit @@ -66,7 +66,7 @@ Do not declare done until the approved reference/baseline and reproduction comma ## Handoff template ```text -$ralph "Implement the approved frontend reference. +$ultragoal "Implement the approved frontend reference. Reference: Source URL and permission/scope: Viewport/content state: diff --git a/plugins/codex/plugins/ppt-master/README.md b/plugins/codex/plugins/ppt-master/README.md index 16d4e579..751ca01a 100644 --- a/plugins/codex/plugins/ppt-master/README.md +++ b/plugins/codex/plugins/ppt-master/README.md @@ -8,7 +8,7 @@

hugohe3%2Fppt-master | Trendshift - GitHub Trending Repository of the Day + Star History Rank

English | [中文](./README_CN.md) diff --git a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json index c26aec66..40d51989 100644 --- a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "ppt-master", "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", - "commit": "09ad58f0d58decc9d30799ca83374ff2604ef16b", + "commit": "b3073f8fcf5d2ebeda621a424097dde9dd771cea", "adapter": "claude-skill", "sourcePath": "skills/ppt-master", - "syncedAt": "2026-09-10T23:40:59Z" + "syncedAt": "2026-09-11T16:00:01Z" } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/canvas-formats.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/canvas-formats.md index ee6b88dc..27e80bc9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/canvas-formats.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/canvas-formats.md @@ -24,7 +24,7 @@ Custom canvases likewise use `0 0 W H` with positive integer pixels; a fractiona ## Platform Keep-clear -Canvas dimensions imply no title band, content topology, or recurring chrome; reserve space only for a real output obstruction. For `story`, keep meaning-bearing text, identity, and calls to action within `y=120..1740` by default because mobile story controls occupy the top and bottom; images, backgrounds, and texture may stay full bleed. An exact target-platform overlay guide or installed template overrides this advisory band. +Canvas dimensions imply no title band, content topology, or recurring chrome; reserve space only for a real output obstruction. For `story`, keep meaning-bearing text, identity, and calls to action within `y=120..1740` by default because mobile story controls occupy the top and bottom; images, backgrounds, and texture may stay full bleed. An exact target-platform overlay guide or installed template overrides this advisory band. Story starting geometry: 80 px margins, 920 px measure, title band ≈ 90 px; regions stack, side-by-side only for near-square halves, and the band below 1740 carries bleed, texture, or a cropped element, not dead space. ## Typography Scale Start @@ -48,7 +48,10 @@ low = round(span * 0.025); start = round(span * 0.029); high = round(span * 0.03 | `wechat` | 900 | 23–30 | 26 | | `moments` | 1080 | 27–36 | 31 | | `xiaohongshu` | 1660 | 42–55 | 48 | -| `story` / `banner` | 1920 | 48–63 | 56 | +| `banner` | 1920 | 48–63 | 56 | +| `story` | 1920 | 48–63 | 56 | | `a4` | 1754 | 44–58 | 51 | +`story` and `banner` share one span but not one measure: the same body size sits on a 1920 px line in `banner` and a 1080 px line in `story` (about half the characters per line), so portrait pages often settle at the low end of the band. + **Default — starting anchor, not a floor (may override when confirmed identity, source fidelity, or target viewing conditions require it)**: start from the table or formula, then resolve the complete role ramp and page density from the content and delivery context. The band only surfaces unusual values; falling outside it is not a validation failure. Apply the viewing-distance baseline in [`shared-standards-core.md`](./shared-standards-core.md) instead of silently shrinking a recurring role to make content fit. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md index 386abef1..73a498a3 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md @@ -66,13 +66,13 @@ The hash is a synchronization receipt, not proof of semantic equivalence; never ### Table schema — `ppt-master.semantic-table.v2` -Every payload carries that exact `schema`; `columns` holds the optional header row and `rows` the body rows; `column_widths` / `row_heights` are relative weights. A cell is a string or an object with `text` (or `paragraphs` for rich text), `fill`, `color`, `align` (`l` / `ctr` / `r`), `valign` (`top` / `middle` / `bottom`), `bold`, `font_size`, `padding`, and per-side `borders` (each side is `{"style": "none"}` or `{"style": "solid", "color", "width"}`; a border without `style` is rejected); exact repetition may be factored into `defaults.cell` / `defaults.paragraph` / `defaults.run` (cell fields such as `align`, `valign`, `padding`, `font_size` go under `defaults.cell`, never directly under `defaults`) and named `cell_styles`. Merged cells use positive `row_span` / `col_span` on the anchor with every covered cell as `{"merge_continuation": true}`. The complete field grammar: [`native-data.md`](../scripts/docs/native-data.md). +Every payload carries that exact `schema`; `columns` holds the optional header row and `rows` the body rows; `column_widths` / `row_heights` are relative weights. A cell is a string or an object with `text` (or `paragraphs` for rich text), `fill`, `color`, `align` (`l` / `ctr` / `r`), `valign` (`top` / `middle` / `bottom`), `bold`, `font_size`, `padding`, and per-side `borders` keyed `left` / `right` / `top` / `bottom` / `diagonal_down` / `diagonal_up` (full words, unlike `align`; each side is `{"style": "none"}` or `{"style": "solid", "color", "width"}`; a border without `style` is rejected); exact repetition may be factored into `defaults.cell` / `defaults.paragraph` / `defaults.run` (cell fields such as `align`, `valign`, `padding`, `font_size` go under `defaults.cell`, never directly under `defaults`) and named `cell_styles`. Merged cells use positive `row_span` / `col_span` on the anchor with every covered cell as `{"merge_continuation": true}`. The complete field grammar: [`native-data.md`](../scripts/docs/native-data.md). **Hard rule — the table payload is complete**: every row, summary line, value, and cell style that must survive `--native-charts-and-tables` is in `columns` / `rows`, because fallback text is discarded on that route. A payload holding only `font_size` and a uniform border is not complete when the fallback draws a header band, row or column fills, first-column emphasis, non-uniform row heights, or sparse rules. Numeric or currency columns use cell objects with `align: "r"` (`text-anchor="end"` does not carry). ### Chart schemas -Supported `type` values: `column`, `bar`, `line`, `area` (each with `grouping`), `pie`, `doughnut`, `pieOfPie`, `barOfPie`, `radar`, `radarMarkers`, `radarFilled`, `scatter`, `bubble`, `combo`, `treemap`, `sunburst`, `histogram`, `pareto`, `boxWhisker`, `waterfall`, `funnel`, `stock`. Category charts take `categories` plus `series[].values`; XY charts take `series[].x` / `y` (bubble adds `size`); combo takes `plots[]` or typed `series[]`; ChartEx types take their own hierarchy or value fields. `data_labels` (column / bar / line / area plots only; other types show values through companion text), `axes`, `axis_titles`, `show_legend` / `legend_position`, companion text (`caption`, `source`, `note`), and `style.colors` are the chrome fields. 3D aliases and `surface` are unsupported; exploded pie, `map`, `heatmap`, `bullet`, and `gantt` fail fast. Every field, enum, and range: [`native-data.md`](../scripts/docs/native-data.md). +Supported `type` values: `column`, `bar`, `line`, `area` (each with `grouping`), `pie`, `doughnut`, `pieOfPie`, `barOfPie`, `radar`, `radarMarkers`, `radarFilled`, `scatter`, `bubble`, `combo`, `treemap`, `sunburst`, `histogram`, `pareto`, `boxWhisker`, `waterfall`, `funnel`, `stock`. Category charts take `categories` plus `series[].values`; XY charts take `series[].x` / `y` (bubble adds `size`); combo takes `plots[]` or typed `series[]`; ChartEx types take their own hierarchy or value fields. `data_labels` (column / bar / line / area plots only; other types show values through companion text), `axes` (per axis `minimum` / `maximum` / `major_unit`, never `min` / `max`), `axis_titles`, `show_legend` / `legend_position`, companion text (`caption`, `source`, `note`), and `style.colors` are the chrome fields. 3D aliases and `surface` are unsupported; exploded pie, `map`, `heatmap`, `bullet`, and `gantt` fail fast. Every field, enum, and range: [`native-data.md`](../scripts/docs/native-data.md). **Chart chrome and color**: SVG-first metadata matches the fallback chrome and reads it literally — the dominant stroke of elements named `axis` becomes `style.axis_color` and of those named `grid` becomes `style.grid_color` (unlabeled lines fall back to the marker's dominant stroke), numbers keep their written form (a payload `73.0` renders as `73` unless `number_format` says otherwise), and marker text that is not a category, data label, axis label, or legend entry needs a companion entry; JSON-first owns its chrome. Generated payloads use uppercase `#RRGGBB`. Negative bars keep the series fill. The final checker tags SVG-first parity findings `blocks --native-charts-and-tables export`; that export refuses them, so clear them before exporting the native variant. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/plan-core.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/plan-core.md index 71c31075..4513f6ad 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/plan-core.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/plan-core.md @@ -163,7 +163,7 @@ python3 skills/ppt-master/scripts/visualization_recall.py validate \ **Family selection**: user/template typography is authoritative. Delivery target: an explicit user/template target first, otherwise Windows Microsoft PowerPoint (owner: [`shared-standards-core.md`](./shared-standards-core.md) §4.1) — the authoring host's installed fonts never select a face; name concrete faces installed or approved on that target; at most four families; a brand/web face leads only after user-confirmed installation, otherwise export a safe face and keep it as a Design Spec reference (fonts are not embedded; CSS tails are preview aids, not PowerPoint fallbacks). Avoid near-equivalent splits (YaHei↔PingFang, SimSun↔Songti, Arial↔Helvetica↔Segoe UI, Times↔Times New Roman). Fonts in one deck form contrast (different family, weight, or proportion) or concord (one family throughout); across the direction set include both a concord and a contrast pairing unless the user or template fixes the stack, and never default to title = body without a reason. -**Reference — PPT-safe faces (recall, not a whitelist; one concrete named face per script — a stack carries at most one Latin face and one CJK face and never a fallback list of alternatives, because export takes the first named face of each script)**: CJK sans `Microsoft YaHei` / `SimHei`, CJK serif `SimSun` / `FangSong` / `KaiTi` (their macOS counterparts `PingFang SC` / `Heiti SC` / `Songti SC` are preview aliases, never the named face), Latin sans `Arial` / `Calibri` / `Segoe UI` / `Verdana` / `Trebuchet MS`, Latin serif `Times New Roman` / `Georgia` / `Cambria` / `Palatino` / `Garamond` (`Georgia` sets old-style figures whose digits sit at different heights — a hero-number or data role needs lining figures: `Times New Roman`, `Cambria`, or any listed sans or mono), mono `Consolas` / `Courier New`, display `Impact` / `Arial Black`. Let the locked style's character pick the axis and lead the title — `Microsoft YaHei` / `Arial` are the neutral members, never the automatic lead; a neutral sans title where the style asks for character is the failure to avoid. Non-pre-installed directions — retro/pixel Press Start 2P / VT323, rounded Nunito / Quicksand / OPPO Sans (safe substitute `Trebuchet MS` / `Verdana`), modern web Inter / HarmonyOS Sans / Source Han, calligraphic 隶书 / 华文行楷 / 华文新魏 (safe substitute `KaiTi` / `FangSong`, titles only), brand faces — need target installation or stay Design Spec references. +**Reference — PPT-safe faces (recall, not a whitelist; one concrete named face per script — a stack carries at most one Latin face and one CJK face and never a fallback list of alternatives, because export takes the first named face of each script)**: CJK sans `Microsoft YaHei` / `SimHei`, CJK serif `SimSun` / `FangSong` / `KaiTi` (their macOS counterparts `PingFang SC` / `Heiti SC` / `Songti SC` are preview aliases, never the named face), Traditional Chinese sans `Microsoft JhengHei`, serif `PMingLiU` / `DFKai-SB`, Japanese sans `Yu Gothic` / `Meiryo`, serif `Yu Mincho`, Korean sans `Malgun Gothic`, serif `Batang` (text on another locale's CJK face takes that locale's glyph forms), Arabic `Segoe UI` / `Tahoma` / `Times New Roman` (one face carries both the Latin and Arabic text), Latin sans `Arial` / `Calibri` / `Segoe UI` / `Verdana` / `Trebuchet MS`, Latin serif `Times New Roman` / `Georgia` / `Cambria` / `Palatino` / `Garamond` (`Georgia` sets old-style figures whose digits sit at different heights — a hero-number or data role needs lining figures: `Times New Roman`, `Cambria`, or any listed sans or mono), mono `Consolas` / `Courier New`, display `Impact` / `Arial Black`. Let the locked style's character pick the axis and lead the title — `Microsoft YaHei` / `Arial` are the neutral members, never the automatic lead; a neutral sans title where the style asks for character is the failure to avoid. Non-pre-installed directions — retro/pixel Press Start 2P / VT323, rounded Nunito / Quicksand / OPPO Sans (safe substitute `Trebuchet MS` / `Verdana`), modern web Inter / HarmonyOS Sans / Source Han, calligraphic 隶书 / 华文行楷 / 华文新魏 (safe substitute `KaiTi` / `FangSong`, titles only), brand faces — need target installation or stay Design Spec references. **Role extension after confirmation**: while composing the roster, add a lowercase snake_case role with an exact stack only for a recurring role that materially needs a different family (`annotation`, `footer`, `footnote`, `data`, `emphasis`, `quote`, `code`), coherent with the confirmed heading/body system and locked style; one-off garnish stays omitted and Default names any added role in one compact `Role rationale` line in §IV. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/svg-effects.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/svg-effects.md index 2e2a3a35..056c26dc 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/svg-effects.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/svg-effects.md @@ -177,7 +177,7 @@ Preset patterns are a separate PPT interface in [`native-data-interface.md`](./n A filter is native-effect metadata, not a pixel-filter surface: one direct `` referenced as a direct `filter="url(#id)"` on a ``, -``, ``, ``, ``, or a helper-authored preset group, +``, ``, ``, ``, ``, or a helper-authored preset group, built from `feDropShadow` or the blur + flood + composite + merge graph below with explicit `stdDeviation`, `dx`/`dy`, and `flood-opacity`. A meaningful offset becomes one outer shadow; zero offset — even `feDropShadow` with diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/video-design.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/video-design.md index 4fa01e3a..4b9d492b 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/video-design.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/video-design.md @@ -65,6 +65,7 @@ Conditional design guidance for presentations whose intended use is recorded, se | Progressive reveal, continuing geometry, or timed emphasis materially aids explanation | Enable/load the appropriate animation capability | | Quick generates a PPTX for recorded, self-running, or video delivery | **Hard rule**: enable Custom Animations before SVG authoring, use semantic groups and page-specific choreography, and complete the stage with a validated `animations.json` before base export; deck-wide `-a auto` and page transitions do not satisfy it; pages or groups may stay static — no coverage quota | | Quick directly delivers a narrated video or MP4 | **Mandatory**: also enable Speaker Notes, Narration Audio, and video export; write the complete per-scene narration to `notes/total.md` before P01 as page-design input (agent-authored wording may be finalized after the roster, final/literal input stays verbatim); resolve narration-governed timing before audio, requiring timestamped page-local SRT for cue sync or subtitle delivery | +| Default generates a recorded or self-running deck and the workflow writes the narration itself | Enable Speaker Notes, Narration Audio, and Custom Animations at Stage 2; write the complete per-scene narration to `notes/total.md` after the approved roster/lock and before Step 5 as page-design input (agent-authored wording may be finalized during final-SVG validation, before audio) | | The user explicitly requests static or page-transition-only playback | Keep object animation off; retain the remaining notes/audio/video outcomes | Default never forces object animation or audio merely because a deck may later be recorded; the Quick requirement selects the capability, not motion coverage. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_identity.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_identity.py index 20dd54b4..6192874e 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_identity.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_identity.py @@ -148,40 +148,64 @@ def _layout_text_sizes(pkg: "OoxmlPackage") -> list[dict]: return _rank(sizes, 10) -def _sample_observed(pkg: "OoxmlPackage") -> dict: +def _theme_font_refs(fonts: dict) -> dict[str, str]: + """Map `+mj-lt` / `+mn-ea` style theme references to their declared faces.""" + refs: dict[str, str] = {} + for prefix, role in (("+mj", "title"), ("+mn", "body")): + pair = fonts.get(role) or {} + for suffix, slot in (("lt", "latin"), ("ea", "ea"), ("cs", "cs")): + face = pair.get(slot) + if face: + refs[f"{prefix}-{suffix}"] = face + return refs + + +def _sample_observed(pkg: "OoxmlPackage", font_refs: dict[str, str]) -> dict: """Aggregate run-level fonts, explicit point sizes, and explicit fill colors. Theme extraction reports the *declared* identity; a hand-edited deck often overrides it per shape / run. This is a frequency sample of run-level usage (not a full style resolution — it misses schemeClr + master/layout inheritance, and counts chart/gradient fills), enough for the workflow to - recommend theme vs observed. `sizes_pt` only counts runs that set an explicit - `sz`; runs inheriting the placeholder size are not seen here (use - `theme.sizes` for those), so a small sample is a hint, not the full picture. + recommend theme vs observed. Theme font references (`+mn-ea`) count as the + face they resolve to. `sizes_pt` only counts runs that set an explicit `sz` + and ranks by the characters those runs carry, so a size split across many + short runs does not outrank the size that sets most of the text; runs + inheriting the placeholder size are not seen here (use `theme.sizes` for + those), so a small sample is a hint, not the full picture. """ latin: dict[str, int] = {} ea: dict[str, int] = {} - sizes: dict[float, int] = {} + size_runs: dict[float, int] = {} + size_chars: dict[float, int] = {} colors: dict[str, int] = {} for slide in pkg.iter_slides(): root = slide.part.xml for tag, bucket in (("a:latin", latin), ("a:ea", ea)): for elem in root.iterfind(f".//{tag}", NS): face = (elem.attrib.get("typeface") or "").strip() - if face and not face.startswith("+"): # skip +mj-*/+mn-* theme refs + if face.startswith("+"): + face = font_refs.get(face, "") + if face: bucket[face] = bucket.get(face, 0) + 1 - for elem in root.iterfind(".//a:rPr", NS): - sz = (elem.attrib.get("sz") or "").strip() + for run in root.iterfind(".//a:r", NS): + rpr = run.find("a:rPr", NS) + sz = (rpr.attrib.get("sz") or "").strip() if rpr is not None else "" if sz.isdigit(): pt = int(sz) / 100 - sizes[pt] = sizes.get(pt, 0) + 1 + size_runs[pt] = size_runs.get(pt, 0) + 1 + size_chars[pt] = size_chars.get(pt, 0) + len(run.findtext("a:t", "", NS)) for elem in root.iterfind(".//a:srgbClr", NS): val = (elem.attrib.get("val") or "").strip().upper() if val: colors[f"#{val}"] = colors.get(f"#{val}", 0) + 1 + ranked_sizes = sorted(size_chars, key=lambda pt: (-size_chars[pt], -size_runs[pt], pt)) return { "fonts": {"latin": _rank(latin, 5), "ea": _rank(ea, 5)}, - "sizes_pt": _rank(sizes, 8), + "sizes_pt": [ + {"value": pt, "count": size_runs[pt], "chars": size_chars[pt]} + for pt in ranked_sizes[:8] + ], "colors": _rank(colors, 8), } @@ -233,7 +257,7 @@ def extract_identity(pptx_path: Path) -> dict: "slide_count": pkg.slide_count, "canvas": canvas, "theme": {"palette": palette, "fonts": fonts, "sizes": sizes}, - "observed": _sample_observed(pkg), + "observed": _sample_observed(pkg, _theme_font_refs(fonts)), "layout_sizes_pt": _layout_text_sizes(pkg), } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_inventory.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_inventory.py index 658cae12..3c4b00af 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_inventory.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_inventory.py @@ -173,6 +173,12 @@ def _summary_view(inventory: dict) -> dict: "slide_index": slide.get("slide_index"), "page_type": slide.get("page_type"), "text_block_count": len(slide.get("text_blocks", [])), + # Blocks include empty and decorative frames; the non-space + # character count is the density signal. + "text_char_count": sum( + len("".join(str(block.get("text") or "").split())) + for block in slide.get("text_blocks", []) + ), "table_count": len(slide.get("tables", [])), "chart_count": len(slide.get("charts", [])), "diagram_count": len(slide.get("diagrams", [])), diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/compact_svg_styles.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/compact_svg_styles.py index 57629105..cd0fd18c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/compact_svg_styles.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/compact_svg_styles.py @@ -33,6 +33,7 @@ from typing import Optional from xml.etree import ElementTree as ET from console_encoding import configure_utf8_stdio +from pptx_to_svg.preset_authoring import authored_preset_encoding from svg_to_pptx.drawingml.utils import INHERITABLE_ATTRS configure_utf8_stdio() @@ -141,6 +142,11 @@ def _local_name(name: object) -> str: return name.rsplit("}", 1)[-1] if isinstance(name, str) else "" +def _is_preset_atom(element: ET.Element) -> bool: + """Return whether an element is a helper-owned authored preset group.""" + return isinstance(element.tag, str) and authored_preset_encoding(element) is not None + + def is_canonical_presentation_value( value: str, *, @@ -339,7 +345,10 @@ def _promote_common_group_defaults( stats: StyleCompactionStats, ) -> None: """Factor proven direct-child repetition into an existing SVG group.""" - if _local_name(element.tag) in _DEFINITION_SUBTREES: + if ( + _local_name(element.tag) in _DEFINITION_SUBTREES + or _is_preset_atom(element) + ): return for child in element: _promote_common_group_defaults(child, stats) @@ -357,6 +366,10 @@ def _promote_common_group_defaults( ] if len(children) < 2: return + # Helper-owned preset atoms keep their paint local; the preset contract + # rejects paint that only arrives from an ancestor group. + if any(_is_preset_atom(child) for child in children): + return element_styles = _style_declarations(element.get("style")) if element_styles is None: @@ -404,7 +417,10 @@ def _remove_redundant_inherited_styles( inherited: dict[str, str], stats: StyleCompactionStats, ) -> None: - if _local_name(element.tag) in _DEFINITION_SUBTREES: + if ( + _local_name(element.tag) in _DEFINITION_SUBTREES + or _is_preset_atom(element) + ): return declarations = _style_declarations(element.get("style")) if declarations is None: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/conversion.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/conversion.md index cd2b29bd..0f402c81 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/conversion.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/conversion.md @@ -61,8 +61,10 @@ Useful options: `--no-images`, and `--filter-images` map to the PDF image mode. `--no-images` (or `--images none`) also applies to web pages (images stay remote links, no `_files/`) and is a no-op on Markdown/text. -- A `.md` / `.markdown` / `.txt` URL whose body is not HTML is saved verbatim - under a `Source:` header, named by the URL's filename stem. +- A URL that serves a PDF / Office document (by Content-Type, body magic, or + suffix) is saved beside the Markdown and converted by that document's + backend; a `.md` / `.txt` URL whose body is not HTML is saved verbatim + under a `Source:` header, named by the URL stem. - Unknown backend-specific flags are passed through to each selected converter. - `-o/--output` selects one Markdown file for one input, or an output directory for multiple inputs / directory inputs. @@ -119,7 +121,7 @@ PyMuPDF is licensed under AGPL-3.0, with a commercial license available from Art Hybrid converter: pure-Python for the common formats, pandoc fallback for the rest. Native path (no external binary required): -- `.docx` — via `mammoth`; text-only tables are preserved as pipe Markdown, and OMML / Office Math equations (Word-native or MathType "Convert to Office Math") are rewritten to inline LaTeX. Classic MathType OLE objects carry no OMML and are kept only as their preview image. +- `.docx` — via `mammoth`; text-only tables (with footnotes) and chart data become pipe Markdown, and OMML / Office Math equations (Word-native or MathType "Convert to Office Math") are rewritten to inline LaTeX. Classic MathType OLE objects carry no OMML and are kept only as their preview image. - `.html` / `.htm` — via `markdownify` + `beautifulsoup4` - `.epub` — via `ebooklib` + `markdownify` - `.ipynb` — via `nbconvert` diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/native-data.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/native-data.md index 4f0811ff..de304652 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/native-data.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/native-data.md @@ -14,14 +14,14 @@ file no longer repeats. Section titles mirror the owning section of ## §2 Metadata placement and bounds -one child `` (attribute `data-pptx-json` is read-compatible, not canonical); the marker's `data-pptx-replace-with` selects the schema. Provide `x`, `y`, `width`, `height` in metadata or as `data-pptx-x/y/width/height` on the group; omitted bounds are inferred from the fallback geometry (then marker/ancestor `translate` / `scale` apply), complete explicit bounds are absolute slide coordinates. `x` / `y` are finite and inside the 32-bit DrawingML range; `width` / `height` additionally resolve to at least one EMU (tables: per resolved row and column). JSON-first markers require all four bounds in metadata. Classic charts accept root `plot_area` (`x`, `y`, `width`, `height`, a positive rectangle inside the frame → `c:manualLayout`; the frame grows past the plot on the side that carries tick labels until that strip is two axis-font ems tall, because PowerPoint drops the manual vertical layout when its labels do not fit and auto-fits the plot to the frame top instead); ChartEx rejects it. `svg_quality_checker.py` validates marker kind, JSON, bounds/fallback, table rows/columns, chart type and data shape, the authority contract, and (SVG-first) baseline freshness. +one child `` (attribute `data-pptx-json` is read-compatible, not canonical; the JSON is XML text, so `&` and `<` inside strings are written `&` and `<`); the marker's `data-pptx-replace-with` selects the schema. Provide `x`, `y`, `width`, `height` in metadata or as `data-pptx-x/y/width/height` on the group; omitted bounds are inferred from the fallback geometry (then marker/ancestor `translate` / `scale` apply), complete explicit bounds are absolute slide coordinates. `x` / `y` are finite and inside the 32-bit DrawingML range; `width` / `height` additionally resolve to at least one EMU (tables: per resolved row and column). JSON-first markers require all four bounds in metadata. Classic charts accept root `plot_area` (`x`, `y`, `width`, `height`, a positive rectangle inside the frame → `c:manualLayout`; the frame grows past the plot on the side that carries tick labels until that strip is two axis-font ems tall, because PowerPoint drops the manual vertical layout when its labels do not fit and auto-fits the plot to the frame top instead); ChartEx rejects it. `svg_quality_checker.py` validates marker kind, JSON, bounds/fallback, table rows/columns, chart type and data shape, the authority contract, and (SVG-first) baseline freshness. ## §2 Table schema — `ppt-master.semantic-table.v2` Every payload carries that exact `schema`. Native tables are rectangular grids: `columns` for the optional header row, `rows` for body rows (shorter rows padded unless `strict_grid: true`; at most 1000 resolved rows and columns); `column_widths` / `row_heights` are finite non-negative relative weights matching the grid with one positive value (`row_heights` counts the header row when `columns` is present) (a row's top and bottom padding shrink to what its resolved height can hold beside the text line, since PowerPoint would otherwise grow the row past the drawn one); `header_rows` is an integer in range; `strict_grid`, `style.band_row`, and `bold` are JSON booleans. Exact repetition may be factored into `defaults.cell` / `defaults.paragraph` / `defaults.run` and kebab-case `cell_styles` selected by `cell_style` (precedence: cell defaults → named style → cell fields; object-valued `padding` merges, everything else replaces; `