diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index 3977bb62..0b02e874 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -24,8 +24,8 @@ "repo": "https://github.com/Yeachan-Heo/oh-my-codex.git", "ref": "main", "adapter": "codex-plugin", - "commit": "54e79b031cbfc823590064bb45a713baadfe67cd", - "syncedAt": "2026-08-29T16:00:00Z" + "commit": "8513abf70609061770a97100ef8964c8ebb40700", + "syncedAt": "2026-08-31T16:00:00Z" }, { "id": "ui-ux-pro-max", @@ -33,8 +33,8 @@ "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", "adapter": "claude-skill", - "commit": "8bd29e775453ebcae52b6e6514fbf134df0c5770", - "syncedAt": "2026-08-27T16:00:00Z" + "commit": "d279284fb12d40f27e72393d51e0bbb785cf80a1", + "syncedAt": "2026-08-31T16:00:00Z" }, { "id": "caveman", @@ -60,8 +60,8 @@ "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", "adapter": "claude-skill", - "commit": "b4a618b97e35f5dadf3a00d51f410c84a2567d4d", - "syncedAt": "2026-08-30T16:00:00Z" + "commit": "63c1308d112b6b1205d86244a156cca1abef5087", + "syncedAt": "2026-08-31T16:00:00Z" }, { "id": "frontend-slides", @@ -96,8 +96,8 @@ "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", "adapter": "claude-skill", - "commit": "035fdad700fa38071c46ec698c9d810f6ec103ec", - "syncedAt": "2026-08-30T16:00:00Z" + "commit": "4e6fdc50136c3aea64a746f6bb4adf1c3305ec87", + "syncedAt": "2026-08-31T16:00:00Z" }, { "id": "grill-me", @@ -114,8 +114,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "2fe6f962a1982594bdda96a7de16c594677266d2", - "syncedAt": "2026-08-30T16:00:00Z" + "commit": "8330e4c4cd6a83694628e6e50ee757665cbdce33", + "syncedAt": "2026-08-31T16:00:00Z" } ] } diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index f1f2a282..6b993f2a 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-08-30T16:01:52Z" + "syncedAt": "2026-08-31T16:01:53Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index cbf92f7f..3b53b3c4 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": "2fe6f962a1982594bdda96a7de16c594677266d2", + "commit": "8330e4c4cd6a83694628e6e50ee757665cbdce33", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-08-30T16:00:00Z" + "syncedAt": "2026-08-31T16:00:00Z" } 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 3d2c5d59..2e50a574 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.0", + "version": "0.21.1", "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 9c21457c..823e12a3 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": "54e79b031cbfc823590064bb45a713baadfe67cd", + "commit": "8513abf70609061770a97100ef8964c8ebb40700", "adapter": "codex-plugin", "sourcePath": "plugins/oh-my-codex", - "syncedAt": "2026-08-29T16:00:00Z" + "syncedAt": "2026-08-31T16:00:00Z" } 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 e484c80e..8b962c76 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/ralplan/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/ralplan/SKILL.md @@ -13,10 +13,19 @@ Ralplan is the canonical consensus-planning stage used by Autopilot between `$de $ralplan "task description" ``` +Standalone advisory planning is explicitly opt-in: + +```text +$ralplan --advisory "task description" +``` + +Advisory runs the same sequential Planner → Architect → Critic review lifecycle, binds the plan and both review artifacts to exact bytes and one tracker-backed iteration, then returns to the caller with `active:false`. It is a cooperative workflow pause, not a security fence or permission system. It never emits a `PreToolUse` allow/block decision, never completes the host consensus gate, never authorizes execution, and never suppresses unrelated host behavior. Terminal state must carry explicit `false` values for the consensus gate, host verification, and execution handoff rather than omitting them. A later concrete affirmative execution request may produce non-authoritative routing context, but it does not persist a permission, rewrite terminal evidence, or create an automatic handoff; quotations, code, examples, documentation, questions, modal requests, negations, and vague approval remain classifier negatives. `approved+proven` requires complete lifecycle digests plus post-write revalidation. Administrative abandonment is append-only, idempotent for prepared or committed journals, and records a separate byte-bound admin event without rewriting the original closeout journal. Real enforcement requires an explicit host-issued, host-verified receipt or capability on a non-user-mintable surface; local Advisory files, prompts, session/thread fields, tracker records, and HERDR observability cannot substitute for it. On Darwin, each Advisory evidence artifact is limited to 128 KiB by the pinned-directory reader; other supported platforms allow up to 8 MiB. + ## Flags - `--interactive`: Enables user prompts at key decision points (draft review in step 2 and final approval in step 6). Without this flag the workflow runs fully automated — Planner → Architect → Critic loop — and outputs the final plan without asking for confirmation. - `--deliberate`: Forces deliberate mode for high-risk work. Adds pre-mortem (3 scenarios) and expanded test planning (unit/integration/e2e/observability). Without this flag, deliberate mode can still auto-enable when the request explicitly signals high risk (auth/security, migrations, destructive changes, production incidents, compliance/PII, public API breakage). +- `--advisory`: Standalone only. It cannot be combined with Autopilot, Pipeline, Team, Ralph, Ultragoal, execution flags, or unknown flags. Activation requires canonical session, root thread, and turn identity. ## Ontology-heavy review @@ -194,7 +203,7 @@ The gate auto-passes when it detects **any** concrete signal. You do not need al | 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 skip planning | In the ralplan workflow, say "just do it" or "skip planning" to transition directly to execution | +| 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. | ## Scenario Examples diff --git a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json index e6474eef..850ea236 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": "035fdad700fa38071c46ec698c9d810f6ec103ec", + "commit": "4e6fdc50136c3aea64a746f6bb4adf1c3305ec87", "adapter": "claude-skill", "sourcePath": "skills/ppt-master", - "syncedAt": "2026-08-30T16:00:00Z" + "syncedAt": "2026-08-31T16:00:00Z" } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md index 197d806c..f9ec11e9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md @@ -209,7 +209,7 @@ Mechanical repetition comes from reusing one carrier and topology without a page - **Mandatory — per-page module line**: before drawing each page, write one line `P modules: core[, structure][, native-shape][, effects][, image][, native-data][, chart | table | formula | link | web-image]` naming the triggered modules the page uses; a module the pre-P01 sweep did not read is read completely before that page's first SVG line, and a page whose carrier mix uses a module's capability without naming it is a defect the carrier receipt exposes. - **Phased generation** (recommended): 1. **Visual Construction Phase**: generate all pages sequentially, applying every triggered branch while drawing. **MUST embed one object-scoped plot-area marker** per §IX-named or Quick-promoted value-driven chart object ([`executor-chart.md`](./executor-chart.md) §2); calibration follows in [`verify-charts`](../workflows/stages/verify-charts.md). Write every `=yes` native marker plus JSON metadata atomically ([`native-data-interface.md`](./native-data-interface.md) §2) and stamp its baseline before the page's gate — `python3 ${SKILL_DIR}/scripts/stamp_native_fallbacks.py /svg_output/.svg --write`, rerun after any visible edit inside the marker group. **Reach for native presets** per §3.0 as you draw, decided by the object's intent, never by scanning finished paths; several presets for one page go through one `preset_shape_svg.py render-batch --input -` round (gradient/pattern paint stays ordinary SVG; a justified §6.4 shadow/glow stays on the helper-authored shape). - 2. **Quality gates**: owned by the route — [`generate-pptx.md`](../workflows/generate-pptx.md) Step 6 (first-page, final, carrier receipt) or [`quick-generate.md`](../workflows/profiles/quick-generate.md) §4 (one lockless final check). Run each checker unfiltered, review the complete issue set, fix every error plus selected warnings in one consolidated pass, verify once; never check between individual fixes, never `cat` a passing report, never defer errors past `finalize_svg.py` (it rewrites SVG and masks violations). Every `warning` is advisory. + 2. **Quality gates**: owned by the route — [`generate-pptx.md`](../workflows/generate-pptx.md) Step 6 (early, final, carrier receipt) or [`quick-generate.md`](../workflows/profiles/quick-generate.md) §3–4 (the same early gate on rosters of seven or more pages, one lockless final check). Run each checker unfiltered, review the complete issue set, fix every error plus selected warnings in one consolidated pass, verify once; never check between individual fixes, never `cat` a passing report, never defer errors past `finalize_svg.py` (it rewrites SVG and masks violations). Every checker invocation follows one of two events — a gate point whose covered pages all exist, or the end of one consolidated repair pass; a run with neither predecessor is a pacing violation, and validating an authoring pattern early is not a reason (the same issues surface identically at the gate and are fixed in the same consolidated pass). Every `warning` is advisory. 3. **Logic Construction Phase (conditional)**: after the gates pass, generate speaker notes for narrative continuity only when the effective Speaker Notes outcome is enabled. ### 3.0 Native Shape Selection diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-formula.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-formula.md index 1c9cbd17..f75616b6 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-formula.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-formula.md @@ -67,4 +67,4 @@ Formula handling is not a user-confirmed policy, image resource, manifest, or `s **Hard rule — repair LaTeX upstream**: unsupported source or an invalid marker blocks the page. Rewrite within the profile without changing the planned mathematics, or return it to the content owner. Never substitute a PNG, flatten structural math into ordinary text, hand-write OMML, or leave raw LaTeX visible. -**Validation**: the first-page/final SVG checker validates every marker, compiles its LaTeX, and applies the shared native-height envelope to page/module text bounds; native export repeats validation and uses that envelope for the generated text frame. Output is standard editable Office Math for PowerPoint 2010+; WPS, Keynote, and LibreOffice receive no embedded fallback and are outside the rendering/editability contract. +**Validation**: the early/final SVG checker validates every marker, compiles its LaTeX, and applies the shared native-height envelope to page/module text bounds; native export repeats validation and uses that envelope for the generated text frame. Output is standard editable Office Math for PowerPoint 2010+; WPS, Keynote, and LibreOffice receive no embedded fallback and are outside the rendering/editability contract. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md index 3c550a25..84c1309a 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md @@ -1033,7 +1033,7 @@ Validate SVG technical compliance. python3 scripts/svg_quality_checker.py projects/project/svg_output/01_cover.svg python3 scripts/svg_quality_checker.py projects/project/svg_output python3 scripts/svg_quality_checker.py projects/project -python3 scripts/svg_quality_checker.py projects/project --stage first-page +python3 scripts/svg_quality_checker.py projects/project --stage early python3 scripts/svg_quality_checker.py projects/project --stage final --json python3 scripts/svg_quality_checker.py projects/project --canonical-authoring --stage final --json python3 scripts/svg_quality_checker.py projects/project --format ppt169 @@ -1053,10 +1053,13 @@ Checks include: Warnings are advisory: they require no modification or acknowledgement and do not affect the command's zero exit status. Only errors block the quality gate. -`--stage first-page` resolves only the first authored SVG and permits an incomplete -future page roster. `--stage final` checks the complete project. With `--json`, -the final stage writes `validation/svg_quality_report.json`, while the first-page -stage writes `validation/svg_quality_first_page_report.json` so it cannot overwrite +`--stage early` checks every authored SVG so far, each under the partial-roster +rules, and permits an incomplete future page roster — this is the mid-roster +gate command. `--stage first-page` resolves only the first authored SVG with +the same permissions. `--stage final` checks the complete project. With +`--json`, the final stage writes `validation/svg_quality_report.json`, while +the early and first-page stages write `validation/svg_quality_early_report.json` +and `validation/svg_quality_first_page_report.json` so they cannot overwrite the release gate (or use `--json-output`). The report separates release failures (`blocking`), changed/new advisories (`introduced`), prototype-identical diagnostics (`inherited`), and source-conversion losses diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/checker.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/checker.py index 3340c075..3cd159d2 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/checker.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/checker.py @@ -1167,6 +1167,7 @@ class SVGQualityChecker: self._animation_issues: List[Tuple[str, str]] = [] self._illustration_issues: List[Tuple[str, str, str]] = [] self._communication_trace_issues: List[Tuple[str, str]] = [] + self._communication_traced_projects: set[Path] = set() self._pptx_structure_issues: List[Tuple[str, str]] = [] self._has_incomplete_page_roster = False self._active_slide_count: int | None = None @@ -6897,10 +6898,12 @@ class SVGQualityChecker: and validate_communication_trace is not None ): project_path = self._resolve_project_path(dir_path) - self._communication_trace_issues.extend( - ('error', message) - for message in validate_communication_trace(project_path) - ) + if project_path not in self._communication_traced_projects: + self._communication_traced_projects.add(project_path) + self._communication_trace_issues.extend( + ('error', message) + for message in validate_communication_trace(project_path) + ) return self.results def _check_pptx_structure_contract( diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/cli.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/cli.py index 427689f2..e07d792c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/cli.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality/cli.py @@ -32,6 +32,15 @@ def _first_page_target(target: str) -> str: return str(svg_files[0]) if svg_files else target +def _early_targets(target: str) -> list[Path]: + """Resolve a project/directory target to every authored SVG page so far.""" + path = Path(target) + if path.is_file(): + return [path] + svg_root = path / "svg_output" if (path / "svg_output").is_dir() else path + return discover_slide_svgs(svg_root) if svg_root.is_dir() else [] + + def _page_target(target: str, page: str) -> str: """Resolve one requested page while keeping it inside ``svg_output/``.""" target_path = Path(target).resolve() @@ -86,6 +95,7 @@ def _default_json_report_path( report_name = { "final": "svg_quality_report.json", "first-page": "svg_quality_first_page_report.json", + "early": "svg_quality_early_report.json", "page": "svg_quality_page_report.json", }[stage] if ( @@ -114,9 +124,11 @@ def print_usage() -> None: print(" python3 scripts/svg_quality_checker.py templates/decks/中国电信/templates --template-mode") print("\nOptions:") print(" --format Expected canvas format") - print(" --stage ") - print(" first-page checks only the first authored SVG;") - print(" page checks only --page with the same partial") + print(" --stage ") + print(" early checks every authored SVG so far, each") + print(" under the partial structure rules (the mid-roster") + print(" gate); first-page checks only the first authored") + print(" SVG; page checks only --page with the same partial") print(" structure rules; final (default) requires the") print(" complete declared page roster.") print(" --page Required with --stage page; must resolve under") @@ -193,10 +205,10 @@ def main() -> None: if "--stage" in sys.argv: idx = sys.argv.index("--stage") if idx + 1 >= len(sys.argv) or sys.argv[idx + 1].startswith("--"): - print("[ERROR] --stage requires first-page, page, or final") + print("[ERROR] --stage requires early, first-page, page, or final") sys.exit(1) stage = sys.argv[idx + 1] - if stage not in {"first-page", "page", "final"}: + if stage not in {"early", "first-page", "page", "final"}: print(f"[ERROR] Unsupported quality-check stage: {stage}") sys.exit(1) if "--page" in sys.argv: @@ -241,24 +253,31 @@ def main() -> None: else: if roundtrip: checker.check_roundtrip_workspace(target) - elif stage == "first-page": - check_target = _first_page_target(target) - elif stage == "page": - try: - check_target = _page_target(target, page or "") - except ValueError as exc: - print(f"[ERROR] {exc}") + elif stage == "early": + early_files = _early_targets(target) + if not early_files: + print("[ERROR] --stage early found no authored SVG pages") sys.exit(1) + for svg_file in early_files: + checker.check_directory(str(svg_file), expected_format) else: - check_target = target - if not roundtrip: + if stage == "first-page": + check_target = _first_page_target(target) + elif stage == "page": + try: + check_target = _page_target(target, page or "") + except ValueError as exc: + print(f"[ERROR] {exc}") + sys.exit(1) + else: + check_target = target checker.check_directory(check_target, expected_format) if not roundtrip and stage == "final" and Path(target).is_dir(): if checker._has_incomplete_page_roster: print( "[TIP] This final-stage run found an incomplete page roster. " - "During serial authoring, use --stage first-page for the first-page " + "During serial authoring, use --stage early for the mid-roster " "gate; keep --stage final for the complete deck." ) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/converter.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/converter.py index a9ac0144..56699843 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/converter.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/converter.py @@ -19,6 +19,8 @@ from hyperlink_contract import ( svg_hyperlink_href, ) from pptx_shapes import ( + DRAWINGML_NS, + UnknownPresetShapeError, has_relationship_attributes, resolve_preset_preview_hash, svg_preset_preview_fingerprint, @@ -63,6 +65,7 @@ from .utils import ( _extract_inheritable_styles, _get_attr, _is_unit_axis_reflection, + _xml_escape, is_picture_effect_carrier, parse_svg_length, parse_transform_operations, @@ -89,6 +92,7 @@ from .styles import ( get_element_opacity, get_fill_opacity, get_stroke_opacity, ) from .elements import ( + complete_preset_adjustments, convert_rect, convert_circle, convert_ellipse, convert_line, convert_path, convert_polygon, convert_polyline, @@ -887,12 +891,74 @@ def _restore_placeholder_sp_pr( raise SvgNativeConversionError( 'placeholder spPr metadata can only attach to p:sp' ) + decoded = _complete_placeholder_preset_adjustments(decoded, sp_pr) return ShapeResult( xml=pattern.sub(lambda _match: decoded, shape.xml, count=1), bounds_emu=shape.bounds_emu, ) +def _complete_placeholder_preset_adjustments( + decoded: str, + sp_pr: ET.Element, +) -> str: + """Rewrite only a partially authored preset avLst in validated spPr XML.""" + prst_geom = sp_pr.find(f'{{{DRAWINGML_NS}}}prstGeom') + if prst_geom is None: + return decoded + av_lst = prst_geom.find(f'{{{DRAWINGML_NS}}}avLst') + prst = prst_geom.get('prst') + if av_lst is None or not prst: + return decoded + + authored: list[tuple[str, str]] = [] + for guide in av_lst: + name = guide.get('name') + formula = guide.get('fmla') + if ( + guide.tag != f'{{{DRAWINGML_NS}}}gd' + or name is None + or formula is None + ): + return decoded + authored.append((name, formula)) + + try: + completed = complete_preset_adjustments(prst, authored) + except UnknownPresetShapeError: + return decoded + authored_names = [name for name, _formula in authored] + defined_names = {name for name, _formula in completed} + if ( + not 0 < len(authored) < len(completed) + or len(set(authored_names)) != len(authored_names) + or not set(authored_names).issubset(defined_names) + ): + return decoded + + av_lst_pattern = re.compile( + r'(?P<(?P(?:[A-Za-z_][\w.-]*:)?avLst)\s*>)' + r'.*?' + r'(?P)', + re.DOTALL, + ) + matches = list(av_lst_pattern.finditer(decoded)) + if len(matches) != 1: + return decoded + match = matches[0] + prefix = match.group('qname')[:-len('avLst')] + guide_xml = ''.join( + f'<{prefix}gd name="{_xml_escape(name)}" ' + f'fmla="{_xml_escape(formula)}"/>' + for name, formula in completed + ) + return ( + decoded[:match.end('open')] + + guide_xml + + decoded[match.start('close'):] + ) + + def preserved_native_text_body( group: ET.Element, *, diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/elements.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/elements.py index 915505a1..75cb23dc 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/elements.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/elements.py @@ -998,6 +998,21 @@ def validate_preset_geometry_metadata(elem: ET.Element) -> list[str]: return errors +def complete_preset_adjustments( + prst: str, + guides: list[tuple[str, str]], +) -> list[tuple[str, str]]: + """Fill missing preset adjustments in the definition's native order.""" + # PowerPoint repairs a preset whose avLst lists only some of the + # adjustments the preset defines, so emit the full set in the preset's own + # order with authored values overriding the normative defaults. + authored = dict(guides) + return [ + (guide.name, authored.get(guide.name, guide.formula)) + for guide in get_preset_registry().get(prst).adjustments + ] + + def _build_preset_geom_from_meta(elem: ET.Element) -> str | None: """Build validated native DrawingML preset geometry from SVG metadata.""" prst, guides, _frame = _parse_preset_geometry_metadata(elem) @@ -1005,9 +1020,10 @@ def _build_preset_geom_from_meta(elem: ET.Element) -> str | None: return None if not guides: return f'' + completed = complete_preset_adjustments(prst, guides) guide_xml = ''.join( f'' - for name, fmla in guides + for name, fmla in completed ) return f'{guide_xml}' diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md index b082a862..de8c2bc8 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md @@ -13,7 +13,7 @@ description: Default Generate PPTX authority for source intake, planning, SVG au **Generate-specific execution discipline**: - The current main agent hand-writes every SVG page; never delegate page generation or run a generator over `svg_output/`. `preset_shape_svg.py` and `shape_boolean_svg.py` provide only their stdout fragments after the agent chooses role, operands, paint, and z-order. -- SVG cadence: P01 → first-page gate → remaining pages → final gate. No batches, no other mid-run checker calls. +- SVG cadence: P01–P05 → early gate (a planned roster of six or fewer pages skips it) → remaining pages → final gate. No batches, no other mid-run checker calls; every checker invocation follows a gate point whose covered pages all exist or the end of one consolidated repair pass. - Gate checklists are internal: on success continue with at most one compact status line; on failure report only the blocking items and required recovery. **SVG page-design boundary**: `svg_output/` is the complete page-design source — every visible element of the exported slide is in the page SVG or referenced by it; templates, `design_spec.md`, and `spec_lock.md` never supply content at export ([`shared-standards-core.md`](../references/shared-standards-core.md) §4.0). Export compiles only the selected route's explicit structure contract (`flat` Slide-local; `structured` Master/Layout/Slide parts) and never infers structure. `svg_final/` is an optional preview release export never reads. Notes, animations, narration, and Edit Native PPTX stay outside this closure. @@ -241,20 +241,20 @@ python3 ${SKILL_DIR}/scripts/svg_editor/server.py --live --daemon Default first free port from `6060` (`--port N` binds strictly); read the URL from output or `/live_preview/lock.json` and report it — or the launch failure — before the first SVG. It is a side process: never wait for it or for user confirmation, and keep it running until the user clicks **Exit preview** or asks in chat. Do not read or apply submitted annotations during generation; that window opens after Step 7 ([`live-preview.md`](stages/live-preview.md), which also describes staged direct edits). -> ⚠️ **Main-agent only**: SVG generation stays in the current main agent — page design depends on full upstream context. Cadence: P01 → first-page gate → remaining pages → final gate, in one context, no batches or other mid-run checker calls; reload under Context validity above after context invalidation. +> ⚠️ **Main-agent only**: SVG generation stays in the current main agent — page design depends on full upstream context. Cadence: P01–P05 → early gate (a planned roster of six or fewer pages skips it) → remaining pages → final gate, in one context, no batches or other mid-run checker calls; reload under Context validity above after context invalidation. **Visual Construction Phase**: generate pages sequentially into `/svg_output/`. Each SVG carries the slide's complete visible design (a JSON-first Chart/Table is the sole exception: inline JSON authoritative, visible subtree an approximate preview). Native shapes follow [`native-shape-authoring.md`](../references/native-shape-authoring.md), loaded at the first contour beyond basic primitives while the preset vocabulary is read before page one: independent atoms first, Merge Shapes only when contour semantics require it, freeform last. `mirror|layout` pages start from the complete `page_layouts` SVG and preserve inherited visuals, root identity, atoms, and slots (strict keeps the contract; `layout` may reflow carrier text inside unchanged slot bounds; adaptive uses a Strategist-declared Layout; a required atom or slot change returns upstream, and Executor never edits `spec_lock.md`); `style`, free-design, and brand-only pages are flat per `executor-base.md` and [`semantic-svg.md`](../references/semantic-svg.md). **Motion-ready image composition**: only when an explicit user motion instruction, an enabled Custom Animations outcome in §I, or an existing `animations.json` activates custom motion, evaluate §IX `Motion suggestion` rows and author any in-slide image states or cross-slide continuity now under [`executor-image.md`](../references/executor-image.md), each revealable or continuing Slide-local unit in a descriptive direct-root ``. Effects, pairing, order, and timing stay in the custom stage after the final gate; a suggestion alone activates nothing; deterministic Morph needs the continuing object as a direct-root group on both pages. -**First-page gate (Mandatory)** — after the first SVG, before page 2: +**Early gate (Mandatory)** — after the fifth SVG, before page 6; a planned roster of six or fewer pages skips this gate and goes straight to the final gate: ```bash python3 ${SKILL_DIR}/scripts/svg_quality_checker.py \ - --canonical-authoring --stage first-page --json + --canonical-authoring --stage early --json ``` -Run unfiltered, review the complete P01 issue set, fix every blocking error plus selected warnings in one consolidated pass, verify once; a still-failing verification is the next batch. If terminal output is truncated, read only the issue arrays from `validation/svg_quality_first_page_report.json`. The gate validates the method, not just the page — emit one line before editing: +The stage checks every authored page so far under the partial-roster rules. Run unfiltered, review the complete issue set, fix every blocking error plus selected warnings in one consolidated pass, verify once; a still-failing verification is the next batch. If terminal output is truncated, read only the issue arrays from `validation/svg_quality_early_report.json`. The gate validates the method, not just the pages — emit one line before editing: ``` gate-signal: method= | page-local= | not-exercised= @@ -262,11 +262,11 @@ gate-signal: method= | page-local= | not-exercise | Signal | Reading | |---|---| -| Two or more issues share a category and direction | Method-level bias — resolve to the authoritative rule before P02 (for text extents: correct the per-role calibration table — rerun `python3 ${SKILL_DIR}/scripts/text_measure.py calibrate --outline` or add the missing `--role` — then every later page estimates by that arithmetic and measures nothing); a correction fitted to the observed offset patches only this sample | -| One isolated issue tied to this page's structure | Page-local — fix and continue | -| A recurring element appears for the first time (furniture, caption format, section numbering, accent discipline) | It will be copied to every later page — confirm its semantics now | +| Two or more issues share a category and direction — on one page or across pages | Method-level bias — resolve to the authoritative rule before P06 (for text extents: correct the per-role calibration table — rerun `python3 ${SKILL_DIR}/scripts/text_measure.py calibrate --outline` or add the missing `--role` — then every later page estimates by that arithmetic and measures nothing); a correction fitted to the observed offset patches only this sample | +| One isolated issue tied to a single page's structure | Page-local — fix and continue | +| A recurring element (furniture, caption format, section numbering, accent discipline) drifts between its occurrences or is still unsettled | It will be copied to every later page — settle its semantics now | -`not-exercised` names what P01 could not test (a cover typically omits multi-line text, columns, charts, captions, data objects); carry each resolved rule forward as arithmetic. Every later page runs without checker calls; a listed item first exercised later is held to the carried-forward rule and caught by the final gate. +`not-exercised` names what P01–P05 could not test (five pages usually exercise multi-line text, columns, and captions; charts, tables, or other data objects may still be pending); carry each resolved rule forward as arithmetic. Every later page runs without checker calls; a listed item first exercised later is held to the carried-forward rule and caught by the final gate. **Quality Check Gate (Mandatory)** — only after every planned SVG exists, before annotations and speaker notes: @@ -332,6 +332,7 @@ Append `--native-charts-and-tables` only for an explicit editable Chart/Table de ## ✅ Generate PPTX Complete - [x] Image readiness gate passed +- [x] Every checker invocation followed a gate point (early after P05 on a roster of seven or more pages, final after the complete roster) or one consolidated repair pass — never a page in progress or an individual fix - [x] Carrier receipt compared with the retained page decisions; contradictions repaired without treating counts as quotas - [x] Notes split when enabled; disabled exports used `--no-notes` - [x] `svg_final/` preview built diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/beautify-pptx.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/beautify-pptx.md index 5306a8a9..1ac4a000 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/beautify-pptx.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/beautify-pptx.md @@ -136,7 +136,7 @@ Run Step 4's confirmation orchestration unchanged. In the UI branch read `confir ## 6. Author + Export -**Quick**: follow [`quick-generate.md`](./quick-generate.md) §3–4 with the inventory as the exact roster and frozen-content contract; keep source order, hand-author every page, run the lockless final checker, export with `--quick-generate`; no Confirm UI, Design Spec, lock, first-page gate, or `finalize_svg.py`. **Long-deck review cadence (may adapt)**: after about five pages or at a section boundary, reread only the inventory summary/current-page views and cross-page anchors — no checker, no gate — and send one `authored/total` status per batch. +**Quick**: follow [`quick-generate.md`](./quick-generate.md) §3–4 with the inventory as the exact roster and frozen-content contract; keep source order, hand-author every page, run Quick's checker gates (early on rosters of seven or more pages, lockless final), export with `--quick-generate`; no Confirm UI, Design Spec, lock, or `finalize_svg.py`. **Long-deck review cadence (may adapt)**: after about five pages or at a section boundary, reread only the inventory summary/current-page views and cross-page anchors — a reread, not an extra checker call — and send one `authored/total` status per batch. **Default**: run [`generate-pptx`](../generate-pptx.md) Steps 6–7. The Executor re-lays-out each page from the lock's semantic anchors plus page/source/template context (page-local colors, gradients, effects, and export-safe faces need no lock rows), regenerates charts/tables as native SVG from the extracted data, and re-lays-out the source pictures. Step 7 owns the serial post-processing commands, gates, and artifacts. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/image-to-pptx.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/image-to-pptx.md index f19da0b9..32661630 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/image-to-pptx.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/image-to-pptx.md @@ -10,7 +10,7 @@ description: Quick-only Generate profile for reconstructing one or more source i **Support boundary — Codex required**: documented and validated for Codex only, because it depends on Codex's native reference-image generation/editing and direct inspection of every derived layer. Other hosts may happen to work; the repository makes no compatibility claim and defines no alternate host or generic image-backend fallback. -**Hard rule — Quick only**: always load [`quick-generate.md`](./quick-generate.md), never `generate-pptx.md`, without the user saying "Quick"; skip Strategist, Confirm UI, template selection, Design Spec, lock, and the Default first-page gate. The main agent decides the reconstruction, prepares all resources, hand-authors SVG, runs the lockless final checker, and exports. +**Hard rule — Quick only**: always load [`quick-generate.md`](./quick-generate.md), never `generate-pptx.md`, without the user saying "Quick"; skip Strategist, Confirm UI, template selection, Design Spec, lock, and the Default gate cadence. The main agent decides the reconstruction, prepares all resources, hand-authors SVG, runs Quick's checker gates, and exports. **Hard rule — source surface, not template application**: stay in Quick free design; never install or apply a Brand/Style/Layout/Deck workspace — it would compete with the canonical page geometry. A reusable-system request routes to Create Template. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md index 11bc363d..3819234d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md @@ -24,7 +24,7 @@ description: One-pass Generate profile for agent-decided preparation, direct SVG | Resources | Prepare every project-local image, icon, and provenance/manifest artifact before its SVG; author formula markers and hyperlink anchors directly in the SVG; sound waits for §4 | | Planning artifacts | No root `design_spec.md`, `spec_lock.md`, confirmation payload, or substitute plan; installed `templates/design_spec...md` files stay template input | | Traceability | Resource manifests, checker reports, postflight, and the bounded command audit may remain; none records design reasoning or forms a resumable history | -| Delivery | Hand-author the roster, run one lockless final checker, skip `finalize_svg.py`, export with `--quick-generate` | +| Delivery | Hand-author the roster, run the §3 early gate on rosters of seven or more pages plus one lockless final checker, skip `finalize_svg.py`, export with `--quick-generate` | Artifact roles follow [`artifact-ownership.md`](../../references/artifact-ownership.md); Quick changes the planning handoff, not those roles. @@ -161,7 +161,7 @@ This menu never satisfies the per-page Structure decision in §3. Read the execution core together, never file by file: [`shared-standards-core.md`](../../references/shared-standards-core.md), [`executor-base.md`](../../references/executor-base.md), [`semantic-svg.md`](../../references/semantic-svg.md), and [`preset-shape-vocabulary.md`](../../references/preset-shape-vocabulary.md) (complete, before P01); then evaluate `executor-base.md`'s routing triggers once over the frozen roster before P01 and read every triggered module in the same batch — [`executor-structure.md`](../../references/executor-structure.md) + [`topology-assembly.md`](../../references/topology-assembly.md) for any `Structure = yes` page, [`native-shape-authoring.md`](../../references/native-shape-authoring.md) for any contour beyond basic primitives, [`svg-effects.md`](../../references/svg-effects.md) for any visual job beyond the everyday block — each recorded in the module line of the pages that use it; a page that reaches a capability the sweep did not foresee reads its module at that moment, before its first SVG line; installed Layout/Deck structure adds [`pptx-structure-interface.md`](../../references/pptx-structure-interface.md). Keep the selected mode/style files: a custom applies one basis under its behavior, synthesizes several by their contributions, or follows the behavior alone. When any image exists, read the complete `Any image` row of `executor-base.md`'s routing table — [`executor-image.md`](../../references/executor-image.md), [`image-layout-spec.md`](../../references/image-layout-spec.md), [`image-layout-patterns.md`](../../references/image-layout-patterns.md), and [`svg-image-embedding.md`](../../references/svg-image-embedding.md) — once before the first affected page (plus [`executor-web-image.md`](../../references/executor-web-image.md) for a `Sourced` image); reread anything only after a known file change or context invalidation. -`executor-base.md` binds Quick exactly as it binds Default except its `Default only` items — the persisted-plan handoff in §2 / §2.1 and the export hand-off in §6 — which Quick's transient §2 anchors, single final checker, and export below own; the Default gate cadence lives in `generate-pptx.md` Step 6 and does not apply. Conditional authorities load on its routing table (Chart/Table branches, native data, formula, hyperlink); Chart/Table reference and final information model are independent signals, and selection never makes an object native-ready. Explicit user/template requirements and the resolved style override compatible aesthetic defaults, never technical boundaries, carrier eligibility, or native capability discovery. +`executor-base.md` binds Quick exactly as it binds Default except its `Default only` items — the persisted-plan handoff in §2 / §2.1 and the export hand-off in §6 — which Quick's transient §2 anchors, own checker gates, and export below own; the Default gate cadence lives in `generate-pptx.md` Step 6 and does not apply. Conditional authorities load on its routing table (Chart/Table branches, native data, formula, hyperlink); Chart/Table reference and final information model are independent signals, and selection never makes an object native-ready. Explicit user/template requirements and the resolved style override compatible aesthetic defaults, never technical boundaries, carrier eligibility, or native capability discovery. **Mandatory — per-image-page composition**: for every page with images, after content and communication move but before geometry, apply `executor-image.md`'s image-integration decision once, keeping role, direction source, parent contour, slot/rhythm system, image/shape action, and continuity in context only; a deliberate plain or equal-grid result is valid when it communicates better. Image to PPTX replaces this and the page-geometry decision for its canonical frame: preserve source geometry, restore text natively, keep source-graphic identity through the prepared asset, and use the registered layer/plate stack; run the ordinary decisions only for additional non-source content. @@ -177,7 +177,7 @@ Read the execution core together, never file by file: [`shared-standards-core.md **Typography**: name a concrete target-installed/approved family under `shared-standards-core.md` §4.1, never a lock or the host's fonts. Before P01 run `python3 ${SKILL_DIR}/scripts/text_measure.py calibrate --role ::` for every recurring role (one command, repeatable `--role`) and keep its table — CJK and Latin ≈ chars per 100 px per role, the checker's own estimator with wrapping headroom — in context; every later page sizes zones from that per-font arithmetic — write the sentence first, fit the zone to it, and never trim wording to satisfy an estimate; calibrate again only for a role or size never calibrated, and `wrap` only a genuinely long paragraph. -**Generation pacing**: hand-write the roster in order — P01 calibrates visual identity and cover expression, the first ordinary content page calibrates content geometry and carrier integration, neither becomes a reusable template — with no first-page checker or confirmation stop. A resolved motif follows its reuse mode (exact repetition for deliberate chrome, adaptive variation of scale, crop, density, position, or interaction otherwise). After every page exists, run the one final checker below; use other stages only when their capability is needed. +**Generation pacing**: hand-write the roster in order — P01 calibrates visual identity and cover expression, the first ordinary content page calibrates content geometry and carrier integration, neither becomes a reusable template — with no confirmation stop. A resolved motif follows its reuse mode (exact repetition for deliberate chrome, adaptive variation of scale, crop, density, position, or interaction otherwise). When the planned roster has seven or more pages, run the §4 final-check command with `--stage early` after P05 and before P06, review its complete issue set, fix every error plus selected warnings in one consolidated pass, and verify once; six or fewer pages skip the early gate. After every page exists, run the one final checker below; every checker invocation follows a gate point (early or final, all covered pages written) or one consolidated repair pass — never a page in progress or an individual fix, and validating an authoring pattern early is not a reason. Use other stages only when their capability is needed. **Hard rule — direct page authoring stays with the main agent**: write every page SVG in the active context; never delegate page generation or run a generator that writes slide files (fragment-only helpers remain allowed after the agent chooses role, operands, paint, and z-order). Resource, inspection, checker, verification, and export tools are unrestricted. This is not a resume protocol: if the context is lost before delivery, start a clean Quick run. @@ -219,6 +219,7 @@ python3 ${SKILL_DIR}/scripts/svg_to_pptx.py --quick-generate --no - [x] Image need was decided independently of credentials; every image decided its own source, every `slice_names` output exists after an exit-0 strict-alpha run, and every exhausted AI job was replanned under the no-AI rule with its disclosure retained - [x] Every selected formula and hyperlink uses its checker-valid native form - [x] The frozen Template Application paragraph was applied, every installed Layout/Deck SVG was read, and structure matches the installed capability (flat vs explicit all-page structured) +- [x] The early gate ran once after P05 on a roster of seven or more pages (or a shorter roster skipped it), and every checker invocation followed a gate point or one consolidated repair pass - [x] The carrier receipt was compared with the retained page jobs and contradictions repaired; the lockless final report passes and matches the current SVGs - [x] Enabled notes were validated/generated and split; enabled custom motion ran through its owning stage - [x] One native PPTX exists under `exports/` or the explicit output path; no Strategist, confirmation, root Design Spec, or lock artifact was created diff --git a/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json index 40aa1b15..bcf9740b 100644 --- a/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "shadcn", "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", - "commit": "b4a618b97e35f5dadf3a00d51f410c84a2567d4d", + "commit": "63c1308d112b6b1205d86244a156cca1abef5087", "adapter": "claude-skill", "sourcePath": "skills/shadcn", - "syncedAt": "2026-08-30T16:00:00Z" + "syncedAt": "2026-08-31T16:00:00Z" } diff --git a/plugins/codex/plugins/shadcn/skills/shadcn/rules/chat.md b/plugins/codex/plugins/shadcn/skills/shadcn/rules/chat.md index 8ce62fe4..9e1a6bf8 100644 --- a/plugins/codex/plugins/shadcn/skills/shadcn/rules/chat.md +++ b/plugins/codex/plugins/shadcn/skills/shadcn/rules/chat.md @@ -208,6 +208,32 @@ write a `useStickToBottom` hook, a `ResizeObserver`, or manual `scrollTop` math. and scrolls back on click. `direction="end"` (default) or `direction="start"`. It is a self-managing control, so don't gate it behind your own scroll-position state. +- **Open a saved transcript without a flash.** `defaultScrollPosition` applies + after mount. When it is `"end"` or `"last-anchor"`, the viewport has + `data-pending-scroll` until that position is applied. The styled viewport + hides. For `"end"` on first paint when messages are in the server HTML, copy + this script into the page, not into the primitive. Skip it for `"last-anchor"` + and for client-fetched messages. Keep `suppressHydrationWarning` on the + viewport. Pass a `nonce` if you use a Content Security Policy. + +```tsx +const scrollToEndScript = `(function () { + var viewport = document.getElementById("messages") + if (!viewport) { + return + } + viewport.scrollTop = viewport.scrollHeight + viewport.removeAttribute("data-pending-scroll") +})()` + + + + {/* transcript */} + +