feat(skills): replace legacy skills with vendored officecli skill bundle - #707
Conversation
Add the maintenance script that vendor-syncs officecli SKILL.md files into repo-root skills/ on demand. The script downloads the upstream tag tarball, validates a content-deterministic SHA256 against the manifest, injects a fixed PawWork override blockquote after each file's frontmatter, and prunes stale officecli-*/morph-ppt* dirs. Modes: bun run sync-skills validate SHA, inject, prune bun run sync-skills -- --compute-sha download, compute SHA, write manifest, exit bun run sync-skills -- --dry-run do everything except writes Spec: docs/superpowers/specs/2026-05-17-officecli-skill-bundle-design.md
…c into bump workflow Bootstrap officecli.skillsTarballSha256 in bundled-tools.json with the content SHA of v1.0.63's vendored skill files. Update officecli-bump.yml so the auto-bump PR additionally runs sync-skills, stages skills/ and the refreshed SHA, and adjusts the PR body to make the skills/ diff a documented review focus. This closes the drift window where version bump and skills could land in different PRs. Spec: docs/superpowers/specs/2026-05-17-officecli-skill-bundle-design.md
Run sync-officecli-skills to vendor the 9 upstream officecli SKILL.md files (officecli-docx/xlsx/pptx, officecli-pitch-deck, officecli-academic-paper, officecli-financial-model, officecli-data-dashboard, morph-ppt, morph-ppt-3d). Each file has a PawWork override blockquote injected after its frontmatter; the rest of the content is byte-identical to upstream v1.0.63. Also tighten the electron-builder extraResources filter for skills/ from "**/*" to "**/SKILL.md" so future sync temporary files or .DS_Store cannot leak into the packaged Resources/skills/. The legacy data-analysis/document-processing/writing-assistant directories are still present in this commit; they are removed in the next commit together with their test assertions. Spec: docs/superpowers/specs/2026-05-17-officecli-skill-bundle-design.md
…g-assistant Drop the three legacy skills that were authored for the long-removed "pills" onboarding UI. Their descriptions (~15 words) lose the model's description-quality competition against Anthropic's anthropic-agent-skills xlsx/docx/pptx (~150 words), routing Office tasks away from PawWork's bundled officecli binary. The officecli skill bundle vendored in the previous commit replaces them with matching description hardness. Update test assertions: skill.test.ts "discovers bundled skills" now asserts officecli-docx/xlsx/pptx; the legacy-specific structure-assertion test "bundled productivity skills enforce clarify-first workflow" is removed because officecli skills do not share that internal layout. session-skill.test.ts switches to officecli-docx as the persistence fixture name. Spec: docs/superpowers/specs/2026-05-17-officecli-skill-bundle-design.md
…NOTICES Document that PawWork vendors OfficeCLI's SKILL.md files alongside the binary, all under Apache-2.0. State the local modification (a fixed PawWork override blockquote injected after each file's frontmatter) and the sync entrypoint, satisfying Apache-2.0 4(b)/4(c) requirements. Spec: docs/superpowers/specs/2026-05-17-officecli-skill-bundle-design.md
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughAdds a sync script and tests to vendor OfficeCLI skills from releases, integrates it into the OfficeCLI bump workflow, updates manifest/config/tests, removes legacy skills, and adds extensive OfficeCLI skill/reference documentation under skills/. ChangesOfficeCLI Skills Sync and Library Update
Sequence Diagram(s)sequenceDiagram
participant Developer
participant GH Actions
participant Sync CLI (bun)
participant Upstream Tarball
participant Repo
Developer->>GH Actions: Trigger officecli bump
GH Actions->>Sync CLI (bun): sync --compute-sha
Sync CLI (bun)->>Upstream Tarball: download/extract skills/*
Sync CLI (bun)->>Repo: update bundled-tools.json (skillsTarballSha256)
GH Actions->>Sync CLI (bun): sync (verify SHA, write skills)
Sync CLI (bun)->>Repo: inject overrides, write skills/, prune
GH Actions->>Repo: git add skills/ + bundled-tools.json, open PR
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related issues
Possibly related PRs
Suggested labels
Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 11
🧹 Nitpick comments (3)
packages/opencode/test/skill/skill.test.ts (1)
459-466: ⚡ Quick winExpand bundled-skill assertions to cover the full vendored set.
This test currently validates only 3 positive skill names, so it can miss regressions where some of the other newly vendored skills disappear from the bundle. Consider asserting all expected officecli/morph skill names introduced by this migration.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/opencode/test/skill/skill.test.ts` around lines 459 - 466, The test only asserts three positive bundled skills but should assert the complete set of vendored officecli/morph skill names to catch regressions; update the assertions in the test that references the skills array (variable skills in skill.test.ts) to include expect(...).toBeDefined() checks for every expected vendored skill name (e.g., all officecli-* and morph-* names introduced by the migration) and keep the existing negative assertions for legacy names (data-analysis, document-processing, writing-assistant); ensure each expected name is referenced exactly as a string in the skills.find checks so missing items fail the test.skills/morph-ppt-3d/SKILL.md (1)
58-61: ⚡ Quick winAdd missing fenced-code languages (MD040).
These code blocks should specify a language (
text,bash, etc.) to satisfy markdownlint and keep doc quality consistent.Also applies to: 103-121, 407-415
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/morph-ppt-3d/SKILL.md` around lines 58 - 61, The fenced code blocks in SKILL.md (e.g., the block containing "Search: '[topic keyword] 3d model glb free download' / Example: 'fox 3d model glb free download' and the other blocks at lines 103-121 and 407-415) are missing a language tag and trigger markdownlint MD040; update each triple-backtick fence to include an appropriate language identifier (for example use "text" for plain search/example snippets or "bash" if they are shell examples) so the blocks read ```text or ```bash accordingly, preserving the existing content and formatting.skills/morph-ppt/SKILL.md (1)
26-31: ⚡ Quick winAdd fence languages to satisfy markdownlint MD040.
These fenced blocks are missing language identifiers. Add
text(or a concrete language) to avoid lint warnings and keep docs consistent.Also applies to: 312-318, 365-368
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/morph-ppt/SKILL.md` around lines 26 - 31, The fenced code blocks in SKILL.md (the triple-backtick blocks containing the slide examples such as the block starting with "Slide 1: shape name=\"!!circle\" x=5cm width=8cm" and the other blocks around the slide examples) are missing language identifiers and trigger markdownlint MD040; update each triple-backtick fence to include a language tag (use "text" or another appropriate language) so they become ```text instead of ``` to satisfy the linter and keep the docs consistent.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/desktop-electron/scripts/sync-officecli-skills.ts`:
- Line 120: The tar extraction call using execFileAsync("tar", ["-xzf",
tarballPath, "-C", extractDir"]) is vulnerable to unsafe entries; update the
extraction in sync-officecli-skills.ts to harden it by either (A) adding safe
tar flags to the execFileAsync invocation such as "--no-absolute-filenames" and
"--warning=no-unknown-keyword" and consider "--strip-components=1" as
appropriate to prevent path traversal and absolute paths, or (B) replace this
direct tar call with a Node.js tar parser (e.g., the tar module) that iterates
entries, validates each entry’s path (reject entries with "..", absolute paths,
or unsafe symlinks), and only writes validated files into extractDir; target the
execFileAsync invocation and the surrounding extraction/cleanup logic so the
extraction rejects or sanitizes unsafe entries before writing.
In `@skills/morph-ppt-3d/SKILL.md`:
- Around line 10-12: The SKILL.md extension for "morph-ppt" references external
style and reference assets that may not be available in packaged skills; update
SKILL.md (the "3D-specific additions" and "enriched design system" sections that
extend morph-ppt) to either bundle the required assets or make the guidance
self-contained by inlining concrete palettes, font pairings, layout tokens, and
any 3D reference images/URLs as embedded data or local examples; specifically
ensure every external dependency referenced by "morph-ppt" and the 3D extension
is replaced with an included asset or substituted with explicit, copy-pastable
values (color hex codes, font stack names, example component specs, and sample
ghosting/verification rules) so the skill can run correctly when only SKILL.md
is distributed.
In `@skills/morph-ppt/SKILL.md`:
- Line 39: The SKILL.md references external helper/docs
(reference/decision-rules.md, reference/pptx-design.md,
reference/officecli-pptx-min.md, reference/styles/INDEX.md,
reference/morph-helpers.py) which will be excluded by the **/SKILL.md resource
filter; either bundle those files into the skill package (add them to the SKILL
resource set and update packaging manifest) or remove/inline the hard links and
any usage text in SKILL.md that points to those files (search for the explicit
reference strings in SKILL.md and replace with embedded guidance or internal
links), ensuring the morph helper functions called from SKILL.md are included or
replaced so runtime doesn’t break.
- Around line 529-532: The examples using name-based selectors (e.g.,
"shape[`@name`=!! ShapeName]") conflict with the documented limitation that
name-based selectors break after transition=morph and also use incorrect syntax;
update those examples to use the supported selector form "/slide[N]/!!ShapeName"
(no spaces inside the name token and no "shape[`@name`=...]" wrapper) for the Edit
shape text, Change color/style and Remove an element examples, and ensure the
Find & replace example continues to use "/" for document-wide operations;
replace each instance of "shape[`@name`=!! ShapeName]" with
"/slide[N]/!!ShapeName" and remove embedded spaces so the examples match the
working examples elsewhere in SKILL.md.
In `@skills/officecli-academic-paper/SKILL.md`:
- Line 75: The table row in SKILL.md currently has a single cell ("Optional:
watermark, charts, custom bordered blocks, cross-references") which breaks the
2-column layout; update that row so it has two cells labeled to match the table
headers (e.g., "Component" and "Description") by splitting into "Optional" in
the first cell and "watermark, charts, custom bordered blocks, cross-references"
in the second cell so the table renders correctly.
In `@skills/officecli-docx/SKILL.md`:
- Around line 45-46: The SKILL.md currently links to external companion docs
editing.md and creating.md which are not included in the packaged skill bundle;
either vendor (add) those two files into the package alongside SKILL.md or
inline the essential guidance from editing.md and creating.md directly into
SKILL.md so the packaged skill is self-contained — update SKILL.md to include
the necessary instructions (or add editing.md and creating.md into the bundle)
and ensure the links/TOC reference the newly included files or sections.
- Around line 15-31: Replace the conflicting upstream install commands for
officecli (the curl | bash and irm | iex install.sh/install.ps1 snippets) with
PawWork-only remediation: keep the initial presence check for "officecli" but,
instead of running remote install scripts, instruct agents to use the
PawWork-approved installer or package mirror (or request the approved package
from PawWork ops), provide the exact PawWork installation command or link to the
internal package (e.g., PawWork package manager or local artifact name), and
include a fallback note to open a PawWork ticket if the package is unavailable;
ensure references to "officecli", "install.sh", and "install.ps1" are removed
from runnable examples.
In `@skills/officecli-financial-model/SKILL.md`:
- Line 199: Update the broken markdown link in SKILL.md: replace the incorrect
reference "[xlsx SKILL.md](../xlsx/SKILL.md)" with the vendored path "[xlsx
SKILL.md](../officecli-xlsx/SKILL.md)" so the link points to the correct
officecli-xlsx SKILL document.
In `@skills/officecli-pitch-deck/SKILL.md`:
- Line 284: Replace the hardcoded color in the example command that violates the
palette-only rule: change the `--prop fill=FF0000` fragment in the `officecli
set deck.pptx '/slide[N]/shape[M]' --prop fill=FF0000` example to use a palette
variable (e.g., `--prop fill=$PRIMARY`) or another neutral placeholder so the
example follows the palette-only / no ad-hoc color policy.
In `@skills/officecli-xlsx/SKILL.md`:
- Around line 11-33: The "BEFORE YOU START (CRITICAL)" section currently gives
upstream installer commands (curl -fsSL ... | bash and irm ... | iex) which
conflict with the PawWork override; remove those curl/irm install snippets and
replace the block with PawWork-only troubleshooting: keep the verify step
(officecli --version), instruct users/agents to open a new terminal if not
found, provide a PawWork-safe update/reinstall flow or internal install
instructions (or to contact ops/sysadmin), and explicitly note that upstream
installer scripts must not be run; reference the section header "BEFORE YOU
START (CRITICAL)" and the specific entries "officecli --version", "curl -fsSL
... | bash" and "irm ... | iex" when making the edits.
- Around line 42-43: The MD file SKILL.md currently references sibling docs
editing.md and creating.md which will break when only SKILL.md is bundled;
replace those relative links by either inlining the essential guidance from
editing.md and creating.md directly into SKILL.md, or change the links to
guaranteed/bundled locations (e.g., canonical repo URLs or a docs site) so they
resolve at runtime; update the two table entries ("Edit existing workbook" and
"Create from scratch") to point to the inlined sections or the new stable links
and remove dependency on the local sibling files.
---
Nitpick comments:
In `@packages/opencode/test/skill/skill.test.ts`:
- Around line 459-466: The test only asserts three positive bundled skills but
should assert the complete set of vendored officecli/morph skill names to catch
regressions; update the assertions in the test that references the skills array
(variable skills in skill.test.ts) to include expect(...).toBeDefined() checks
for every expected vendored skill name (e.g., all officecli-* and morph-* names
introduced by the migration) and keep the existing negative assertions for
legacy names (data-analysis, document-processing, writing-assistant); ensure
each expected name is referenced exactly as a string in the skills.find checks
so missing items fail the test.
In `@skills/morph-ppt-3d/SKILL.md`:
- Around line 58-61: The fenced code blocks in SKILL.md (e.g., the block
containing "Search: '[topic keyword] 3d model glb free download' / Example: 'fox
3d model glb free download' and the other blocks at lines 103-121 and 407-415)
are missing a language tag and trigger markdownlint MD040; update each
triple-backtick fence to include an appropriate language identifier (for example
use "text" for plain search/example snippets or "bash" if they are shell
examples) so the blocks read ```text or ```bash accordingly, preserving the
existing content and formatting.
In `@skills/morph-ppt/SKILL.md`:
- Around line 26-31: The fenced code blocks in SKILL.md (the triple-backtick
blocks containing the slide examples such as the block starting with "Slide 1:
shape name=\"!!circle\" x=5cm width=8cm" and the other blocks around the slide
examples) are missing language identifiers and trigger markdownlint MD040;
update each triple-backtick fence to include a language tag (use "text" or
another appropriate language) so they become ```text instead of ``` to satisfy
the linter and keep the docs consistent.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: f175678d-0100-48a6-8090-c730ff85f049
⛔ Files ignored due to path filters (1)
packages/desktop-electron/scripts/__fixtures__/sync-skills/mini-skills.tar.gzis excluded by!**/*.gz
📒 Files selected for processing (22)
.github/workflows/officecli-bump.ymlTHIRD_PARTY_NOTICES.mdpackages/desktop-electron/bundled-tools.jsonpackages/desktop-electron/electron-builder.config.tspackages/desktop-electron/package.jsonpackages/desktop-electron/scripts/sync-officecli-skills.test.tspackages/desktop-electron/scripts/sync-officecli-skills.tspackages/desktop-electron/tsconfig.release.jsonpackages/opencode/test/session/session-skill.test.tspackages/opencode/test/skill/skill.test.tsskills/data-analysis/SKILL.mdskills/document-processing/SKILL.mdskills/morph-ppt-3d/SKILL.mdskills/morph-ppt/SKILL.mdskills/officecli-academic-paper/SKILL.mdskills/officecli-data-dashboard/SKILL.mdskills/officecli-docx/SKILL.mdskills/officecli-financial-model/SKILL.mdskills/officecli-pitch-deck/SKILL.mdskills/officecli-pptx/SKILL.mdskills/officecli-xlsx/SKILL.mdskills/writing-assistant/SKILL.md
💤 Files with no reviewable changes (3)
- skills/writing-assistant/SKILL.md
- skills/document-processing/SKILL.md
- skills/data-analysis/SKILL.md
There was a problem hiding this comment.
Code Review
This pull request introduces a synchronization script, sync-officecli-skills.ts, to vendor and inject custom overrides into OfficeCLI SKILL.md files, replacing several legacy internal skills. The changes include updates to the build configuration, manifest files, and existing test suites to accommodate the new skill naming convention. Review feedback suggests adding a timeout to the fetch operation in the sync script to improve robustness and refactoring the manifest parsing logic into a helper function to eliminate redundant I/O and prevent potential data loss during inline casting.
- Add 30s AbortSignal.timeout to tarball fetch so a hung GitHub mirror cannot stall the officecli bump workflow indefinitely (gemini-code-assist). - Drop the redundant readFile/JSON.parse in the --compute-sha branch and mutate the already-parsed manifest in place. JSON.stringify still serializes the full top-level object, so no key is lost (gemini-code-assist). - Expand the bundled-skill discovery test to assert every vendored officecli/morph skill, not just docx/xlsx/pptx, so a partial sync that drops one skill fails CI (coderabbit nitpick).
Review round 1 — applied + push-back summaryThanks for the thorough pass, @coderabbitai / @gemini-code-assist. Posting a single summary so the rationale is in one place; inline thread replies are individually resolved. Applied in bd70673
Not applied — upstream-vendored by design All inline findings on Not applied — sync-script defense-in-depth (L120 tar extraction) Tarball source is pinned to a versioned upstream GitHub release tag, the SHA256 over the canonical file set is verified before any write into |
|
Thanks for the summary, @Astro-Han. The approach of using a deterministic SHA256 check on the vendored skill set is a robust way to ensure the integrity of the vendored OfficeCLI content while allowing for the necessary PawWork-specific overrides. I have reviewed the changes, and the implementation of the Your handling of the feedback—specifically the addition of the This looks ready for merge. |
|
Tip For best results, initiate chat on the files or code changes.
Applied changes (bd70673) — all three look good:
Not applied — upstream-vendored content — the rationale is well-founded. The content-SHA verification loop means any out-of-band edit to the vendored Not applied — tar extraction (L120) — the layered defense (pinned release tag + post-extract SHA256 over the canonical file set + isolated (´。• ᵕ •。`) ♡ ✏️ Learnings added
|
Reverses last round's "SKILL-only" packaging scope. The skill tool (packages/opencode/src/tool/skill.ts:39-48) lists every sibling file under each skill dir into `<skill_files>` and instructs the model to follow relative paths like `editing.md` / `reference/*` from SKILL.md. With the previous `**/SKILL.md` filter, those references resolved to nothing in the packaged build, so the model would attempt to read missing companion docs and degrade to guessing commands. Vendor scope is now `**/*` under each upstream skill dir: - extractTarball recursively walks `<skill-name>/**`, collecting SKILL.md plus companion docs (editing.md, creating.md) and the full reference/ subtree (decision-rules.md, morph-helpers.py/.sh, styles/*/, etc.). - syncSkills wipes each upstream skill dir before rewriting so a stale companion file from a prior sync (e.g. an upstream rename) cannot linger. - Override blockquote is still only injected into SKILL.md; companion files are written byte-for-byte from the tarball. - Content SHA is recomputed over the full canonical file set (4797152b...e0d485) so the next sync hard-fails if upstream retargets the tag. - electron-builder skills filter restored to ["**/*"]. - New SyncOptions.skillsDirOverride lets unit tests drive writes into a temp dir; three new tests cover companion preservation, byte identity, and stale companion cleanup. Bundle impact: skills/ grows from 9 SKILL.md (~600KB) to 131 files (~2MB). morph-ppt/reference/styles/*/*.pptx accounts for most of the delta (upstream pptx style templates). Negligible against the existing Electron app footprint. Byte-identical vendor invariant is preserved — only the override blockquote inside each SKILL.md is PawWork content. The "we don't modify upstream text" rule still holds; what changes is the scope of files we choose to ship. Verified: desktop-electron 394 pass, opencode 2753 pass / 9 skip / 1 todo / 0 fail, app 1165 pass, typecheck + typecheck:release clean, sync-skills re-run produces zero diff.
Round 2 — reversed scope decision in 09a86ccFollow-up to the earlier review summary. A second review pass surfaced a P2 finding I missed: My earlier push-back on the four companion-doc threads was based on a wrong premise: I treated 09a86cc widens vendor scope:
What stays the same: PawWork modifies zero bytes of upstream content — only the override blockquote inside each SKILL.md is PawWork-introduced. The "we don't edit upstream text" rule still holds; what changed is the set of upstream files we ship. Bundle impact: Verified: desktop-electron 394 pass, opencode 2753 pass / 9 skip / 1 todo / 0 fail, app 1165 pass, typecheck + typecheck:release clean, The four companion-doc threads (morph-ppt-3d:12, morph-ppt:39, docx:46, xlsx:43) are intentionally left unresolved so the next review pass can confirm the fix. The other push-backs ( |
Round 3 — handlingThree findings reached me out-of-band (not posted as inline comments). Verified each against the current branch; here is how each is resolved. P3 — PR body stale (fixed). Body updated in this PR. Review Focus now references the correct content SHA ( P2 — P2 — Filing upstream issues is unnecessary because both fixes already exist in tags after Sketch of next-bump plan (informational, not part of this PR): a separate PR retargets |
Section L7 said "SKILL.md files" but commit 09a86cc widened vendor scope to entire skill directories (SKILL.md + companion docs like editing.md / creating.md + reference/** assets). The notice now describes the full set so the Apache-2.0 4(b)/4(c) attribution matches actual distributed content.
|
P3 notice scope mismatch — fixed in
|
There was a problem hiding this comment.
Actionable comments posted: 16
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@skills/morph-ppt/reference/decision-rules.md`:
- Around line 103-105: Update the stale hard-coded counts in the "Consider 6
categories" list item inside decision-rules.md (the line showing "dark (16),
light (10), warm (11), bw (5), vivid (6), mixed (7)") so they reflect the
current totals in reference/styles/INDEX.md; either replace the numbers with the
up-to-date counts copied from INDEX.md or remove the inline counts entirely and
add a short note pointing readers to reference/styles/INDEX.md for
authoritative, maintained totals to avoid divergence.
In `@skills/morph-ppt/reference/morph-helpers.py`:
- Around line 243-257: The try/except around
json.loads(curr_json_str).get("data", {}) and the subsequent _check_unghosted
call is swallowing parser/JSON or runtime errors and printing "No unghosted
content detected" which falsely passes verification; change the except to catch
Exception as e, log or print the actual error (include e and the offending
curr_json_str or context), and mark the verification as failed (set has_error =
True) or re-raise so failures don't silently pass; apply the same change to the
similar block handling the other slide check (the second try/except in this
file) so all parser/runtime exceptions surface instead of being treated as
successful verification.
- Around line 100-107: The helper morph_clone_slide currently calls sys.exit(1)
when the morph transition check fails (in the block that calls _run and uses
_has_morph_transition), which can terminate importing callers; change this to
raise a clear exception (e.g. RuntimeError or a custom MorphError) including the
slide number and output details, or alternatively return a falsy status so
callers can handle the failure; update morph_clone_slide to remove sys.exit(1)
and propagate the error via exception (and adjust any callers to catch/handle
it).
In `@skills/morph-ppt/reference/morph-helpers.sh`:
- Around line 141-176: The inline Python snippets (e.g., the block that
populates unghosted_check and the similar block later) currently swallow
exceptions by calling sys.exit(0) in the except clause and redirecting stderr to
/dev/null, which masks parse/quoting failures; change the except handlers to
write the exception message to stderr and call sys.exit(2) (or another non-zero
code) instead of sys.exit(0), stop redirecting stderr (remove 2>/dev/null) when
invoking these Python blocks, and update the Bash logic that consumes those
exits (the code that checks unghosted_check / return codes) to treat exit code 2
as an error (set has_error=1) rather than success so parsing/JSON errors fail
the verification.
- Around line 40-45: The function in morph-helpers.sh is currently calling exit
1 when the transition check fails (the block that sets local trans using
officecli and checks [ -z "$trans" ]), which will terminate the caller's shell
when this script is sourced; change that exit 1 to return 1 so the function
returns an error status instead of killing the calling shell, keeping the
surrounding echo error messages intact and ensuring the caller can handle the
failure.
In `@skills/morph-ppt/reference/pptx-design.md`:
- Around line 312-332: Close the open fenced code block that starts with the
"Format: EFFECT[-DIRECTION]..." line by adding a closing triple-backtick
immediately before the '---' divider so the subsequent "## Design Freedom"
header renders as normal text; also remove any duplicate/trailing backticks at
the end of the section so there's only one closing fence placed right after the
code example.
In `@skills/morph-ppt/reference/styles/bw--swiss-system/style.md`:
- Line 37: The style documentation for bw--swiss-system incorrectly references a
non-existent file build.py; either add a proper build.sh script to the
bw--swiss-system style directory following the same contents/permissions pattern
used by the other 27 styles, or update the style.md text to reference build.sh
(and remove build.py). Locate the offending line in style.md that states
"Complete build script available in `build.py` and replace it with the correct
build script name or add the actual build.sh implementation (ensure executable
bit and matching commands used by other styles).
In `@skills/morph-ppt/reference/styles/dark--premium-navy/build.sh`:
- Line 265: The officecli command invocation that sets slide text currently uses
text="$128M" which Bash will expand as a positional parameter; update the
argument passed to officecli (the command line that references
'/slide[4]/shape[11]') to escape the literal dollar sign so the metric renders
correctly by changing the text value to use an escaped dollar (e.g., "\$128M")
in the --prop text= argument.
In `@skills/morph-ppt/reference/styles/INDEX.md`:
- Line 23: INDEX.md references non-existent style directories
(dark--tech-cosmos, warm--minimal-brand, warm--creative-marketing) which breaks
style selection; open the INDEX.md used by the morph-ppt styles list and remove
the table rows that reference the three keys (dark--tech-cosmos,
warm--minimal-brand, warm--creative-marketing) so only styles that have
corresponding directories in reference/styles/ remain; update the table so
formatting stays valid and commit the file.
In `@skills/morph-ppt/reference/styles/light--glassmorphism-vc/style.md`:
- Line 21: The README in
skills/morph-ppt/reference/styles/light--glassmorphism-vc/style.md points to a
non-existent build.py; update style.md to either remove or correct the dead
relative link, or add the missing build.py into the vendored style directory so
the cross-doc link resolves; ensure the fix aligns with how
packages/opencode/src/tool/skill.ts enumerates sibling files (i.e., include the
referenced file in the packaged payload or change the reference to an existing
sibling file).
In `@skills/morph-ppt/reference/styles/light--spring-launch/style.md`:
- Line 57: The style markdown references a sibling script "build.sh" but that
file is not included in the vendored package, causing a broken relative link;
add the missing build.sh into the style package (next to
styles/light--spring-launch/style.md) or else update
styles/light--spring-launch/style.md to point to an existing script/file or
remove the reference; ensure the referenced filename exactly matches (build.sh)
and is packaged alongside the style so the relative cross-doc link resolves at
runtime.
In `@skills/morph-ppt/reference/styles/mixed--bauhaus-blocks/style.md`:
- Line 96: The reference in style.md to "Complete build script available in
`build.py`" is stale because vendored files for the skill only include style.md;
update the reference so it resolves within the packaged sibling files: either
add the actual build.py into the skill package and keep the reference, or change
the line in style.md to point to the correct relative sibling file that exists
(e.g., a README or build instructions file) — locate the string in style.md
referencing build.py and replace it with the correct relative path or include
the missing build.py file in the package.
In `@skills/morph-ppt/reference/styles/mixed--chromatic-aberration/style.md`:
- Line 82: The reference in styles/mixed--chromatic-aberration/style.md that
points to `build.py` is stale because the vendored files for this style only
include `style.md`; update the reference so cross-doc links resolve against
packaged sibling files by either (A) adding the missing `build.py` into the
style's vendored files, or (B) changing the `build.py` mention in `style.md` to
the correct existing artifact (or removing the dead link) so the relative link
resolves within the skill directory; locate and edit `style.md` to implement the
chosen fix.
In `@skills/morph-ppt/reference/styles/mixed--duotone-split/style.md`:
- Around line 52-56: The table rows S1 through S5 each have only three
pipe-separated cells while the header defines four columns (Slide | Type |
Elements | Description); update each row (S1, S2, S3, S4, S5) to include a
fourth cell for Description (either a short description or an explicit empty
cell like a trailing pipe) so the number of columns matches the header and the
Markdown table renders correctly.
In `@skills/morph-ppt/reference/styles/vivid--candy-stripe/style.md`:
- Around line 57-61: The table rows S1–S5 in style.md are missing the 4th
"Description" column causing column-count lint errors; update each row (S1, S2,
S3, S4, S5) to include a fourth pipe-delimited Description cell that briefly
summarizes intended usage (e.g., "Cover layout with centered title", "Statement
with top color bar", "Three-column card backgrounds", "Data slide with expanded
blue stripe", "Closing footer with inverted gradient") so each row matches the
4-column schema and resolves lint warnings.
In `@skills/morph-ppt/reference/styles/warm--playful-organic/build.sh`:
- Around line 345-353: The loop and subsequent reveals are off-by-one: the
for-loop currently hides slide[5]/shape[24] (the comparison left title) and the
reveal commands expose slide[5]/shape[28] (the CTA title). Fix by changing the
hiding range from {7..24} to {7..23} so shape[24] remains visible, and update
the reveal calls to set slide[5]/shape[24], slide[5]/shape[25],
slide[5]/shape[26], slide[5]/shape[27] (instead of 25..28) with the same x
positions as intended.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: a3fa7eb6-495e-4224-98bd-ae36cd41a597
⛔ Files ignored due to path filters (27)
skills/morph-ppt/reference/styles/bw--brutalist-raw/bw__brutalist_raw.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/bw--mono-line/bw__mono_line.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/bw--swiss-bauhaus/bw__swiss_bauhaus.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--architectural-plan/dark__architectural_plan.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--blueprint-grid/dark__blueprint_grid.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--circle-digital/dark__circle_digital.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--cosmic-neon/dark__cosmic_neon.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--cyber-future/dark__cyber_future.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--diagonal-cut/dark__diagonal_cut.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--editorial-story/dark__editorial_story.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--investor-pitch/template.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--liquid-flow/dark__liquid_flow.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--luxury-minimal/dark__luxury_minimal.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--neon-productivity/dark__neon_productivity.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--premium-navy/dark__premium_navy.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--space-odyssey/dark__space_odyssey.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/dark--spotlight-stage/dark__spotlight_stage.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/light--bold-type/light__bold_type.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/light--isometric-clean/light__isometric_clean.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/light--minimal-product/light__minimal_product.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/light--watercolor-wash/light__watercolor_wash.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/mixed--duotone-split/mixed__duotone_split.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/vivid--candy-stripe/vivid__candy_stripe.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/vivid--playful-marketing/vivid__playful_marketing.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/warm--brand-refresh/warm__brand_refresh.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/warm--earth-organic/warm__earth_organic.pptxis excluded by!**/*.pptxskills/morph-ppt/reference/styles/warm--playful-organic/Cat-Secret-Life.pptxis excluded by!**/*.pptx
📒 Files selected for processing (100)
THIRD_PARTY_NOTICES.mdpackages/desktop-electron/bundled-tools.jsonpackages/desktop-electron/scripts/sync-officecli-skills.test.tspackages/desktop-electron/scripts/sync-officecli-skills.tspackages/opencode/test/skill/skill.test.tsskills/morph-ppt/reference/decision-rules.mdskills/morph-ppt/reference/morph-helpers.pyskills/morph-ppt/reference/morph-helpers.shskills/morph-ppt/reference/officecli-pptx-min.mdskills/morph-ppt/reference/pptx-design.mdskills/morph-ppt/reference/quality-gates.mdskills/morph-ppt/reference/styles/INDEX.mdskills/morph-ppt/reference/styles/bw--brutalist-raw/build.shskills/morph-ppt/reference/styles/bw--brutalist-raw/style.mdskills/morph-ppt/reference/styles/bw--mono-line/build.shskills/morph-ppt/reference/styles/bw--mono-line/style.mdskills/morph-ppt/reference/styles/bw--swiss-bauhaus/build.shskills/morph-ppt/reference/styles/bw--swiss-bauhaus/style.mdskills/morph-ppt/reference/styles/bw--swiss-system/style.mdskills/morph-ppt/reference/styles/dark--architectural-plan/build.shskills/morph-ppt/reference/styles/dark--architectural-plan/style.mdskills/morph-ppt/reference/styles/dark--aurora-softedge/style.mdskills/morph-ppt/reference/styles/dark--blueprint-grid/build.shskills/morph-ppt/reference/styles/dark--blueprint-grid/style.mdskills/morph-ppt/reference/styles/dark--circle-digital/build.shskills/morph-ppt/reference/styles/dark--circle-digital/style.mdskills/morph-ppt/reference/styles/dark--cosmic-neon/build.shskills/morph-ppt/reference/styles/dark--cosmic-neon/style.mdskills/morph-ppt/reference/styles/dark--cyber-future/build.shskills/morph-ppt/reference/styles/dark--cyber-future/style.mdskills/morph-ppt/reference/styles/dark--diagonal-cut/build.shskills/morph-ppt/reference/styles/dark--diagonal-cut/style.mdskills/morph-ppt/reference/styles/dark--editorial-story/build.shskills/morph-ppt/reference/styles/dark--editorial-story/style.mdskills/morph-ppt/reference/styles/dark--investor-pitch/build.shskills/morph-ppt/reference/styles/dark--investor-pitch/style.mdskills/morph-ppt/reference/styles/dark--liquid-flow/build.shskills/morph-ppt/reference/styles/dark--liquid-flow/style.mdskills/morph-ppt/reference/styles/dark--luxury-minimal/build.shskills/morph-ppt/reference/styles/dark--luxury-minimal/style.mdskills/morph-ppt/reference/styles/dark--midnight-blueprint/style.mdskills/morph-ppt/reference/styles/dark--neon-productivity/build.shskills/morph-ppt/reference/styles/dark--neon-productivity/style.mdskills/morph-ppt/reference/styles/dark--obsidian-amber/style.mdskills/morph-ppt/reference/styles/dark--premium-navy/build.shskills/morph-ppt/reference/styles/dark--premium-navy/style.mdskills/morph-ppt/reference/styles/dark--sage-grain/style.mdskills/morph-ppt/reference/styles/dark--space-odyssey/build.shskills/morph-ppt/reference/styles/dark--space-odyssey/style.mdskills/morph-ppt/reference/styles/dark--spotlight-stage/build.shskills/morph-ppt/reference/styles/dark--spotlight-stage/style.mdskills/morph-ppt/reference/styles/dark--velvet-rose/style.mdskills/morph-ppt/reference/styles/light--bold-type/build.shskills/morph-ppt/reference/styles/light--bold-type/style.mdskills/morph-ppt/reference/styles/light--firmwise-saas/style.mdskills/morph-ppt/reference/styles/light--fluid-gradient/style.mdskills/morph-ppt/reference/styles/light--glassmorphism-vc/style.mdskills/morph-ppt/reference/styles/light--isometric-clean/build.shskills/morph-ppt/reference/styles/light--isometric-clean/style.mdskills/morph-ppt/reference/styles/light--minimal-corporate/style.mdskills/morph-ppt/reference/styles/light--minimal-product/build.shskills/morph-ppt/reference/styles/light--minimal-product/style.mdskills/morph-ppt/reference/styles/light--project-proposal/style.mdskills/morph-ppt/reference/styles/light--spring-launch/style.mdskills/morph-ppt/reference/styles/light--training-interactive/style.mdskills/morph-ppt/reference/styles/light--watercolor-wash/build.shskills/morph-ppt/reference/styles/light--watercolor-wash/style.mdskills/morph-ppt/reference/styles/mixed--bauhaus-blocks/style.mdskills/morph-ppt/reference/styles/mixed--chromatic-aberration/style.mdskills/morph-ppt/reference/styles/mixed--duotone-split/build.shskills/morph-ppt/reference/styles/mixed--duotone-split/style.mdskills/morph-ppt/reference/styles/mixed--spectral-grid/style.mdskills/morph-ppt/reference/styles/vivid--bauhaus-electric/style.mdskills/morph-ppt/reference/styles/vivid--candy-stripe/build.shskills/morph-ppt/reference/styles/vivid--candy-stripe/style.mdskills/morph-ppt/reference/styles/vivid--energy-neon/style.mdskills/morph-ppt/reference/styles/vivid--pink-editorial/style.mdskills/morph-ppt/reference/styles/vivid--playful-marketing/build.shskills/morph-ppt/reference/styles/vivid--playful-marketing/style.mdskills/morph-ppt/reference/styles/warm--bloom-academy/style.mdskills/morph-ppt/reference/styles/warm--brand-refresh/build.shskills/morph-ppt/reference/styles/warm--brand-refresh/style.mdskills/morph-ppt/reference/styles/warm--coral-culture/style.mdskills/morph-ppt/reference/styles/warm--earth-organic/build.shskills/morph-ppt/reference/styles/warm--earth-organic/style.mdskills/morph-ppt/reference/styles/warm--monument-editorial/style.mdskills/morph-ppt/reference/styles/warm--playful-organic/build.shskills/morph-ppt/reference/styles/warm--playful-organic/style.mdskills/morph-ppt/reference/styles/warm--sunset-mosaic/style.mdskills/morph-ppt/reference/styles/warm--vital-bloom/style.mdskills/officecli-academic-paper/creating.mdskills/officecli-data-dashboard/creating.mdskills/officecli-docx/creating.mdskills/officecli-docx/editing.mdskills/officecli-financial-model/creating.mdskills/officecli-pitch-deck/creating.mdskills/officecli-pptx/creating.mdskills/officecli-pptx/editing.mdskills/officecli-xlsx/creating.mdskills/officecli-xlsx/editing.md
✅ Files skipped from review due to trivial changes (34)
- skills/morph-ppt/reference/styles/bw--swiss-bauhaus/style.md
- skills/morph-ppt/reference/styles/warm--playful-organic/style.md
- skills/morph-ppt/reference/styles/warm--vital-bloom/style.md
- skills/morph-ppt/reference/styles/dark--midnight-blueprint/style.md
- skills/morph-ppt/reference/styles/warm--sunset-mosaic/style.md
- skills/morph-ppt/reference/styles/dark--cosmic-neon/style.md
- skills/morph-ppt/reference/styles/warm--monument-editorial/style.md
- skills/morph-ppt/reference/styles/dark--aurora-softedge/style.md
- skills/morph-ppt/reference/styles/dark--blueprint-grid/style.md
- skills/morph-ppt/reference/styles/dark--velvet-rose/style.md
- skills/morph-ppt/reference/styles/dark--sage-grain/style.md
- skills/morph-ppt/reference/styles/dark--luxury-minimal/style.md
- skills/morph-ppt/reference/styles/light--project-proposal/style.md
- skills/morph-ppt/reference/styles/dark--investor-pitch/style.md
- skills/morph-ppt/reference/styles/dark--circle-digital/style.md
- skills/morph-ppt/reference/styles/dark--neon-productivity/style.md
- skills/morph-ppt/reference/styles/dark--editorial-story/style.md
- skills/morph-ppt/reference/styles/light--minimal-product/style.md
- skills/morph-ppt/reference/styles/light--isometric-clean/style.md
- packages/desktop-electron/bundled-tools.json
- skills/morph-ppt/reference/styles/dark--architectural-plan/style.md
- skills/morph-ppt/reference/styles/warm--coral-culture/style.md
- skills/morph-ppt/reference/styles/dark--spotlight-stage/style.md
- skills/morph-ppt/reference/styles/light--training-interactive/style.md
- skills/morph-ppt/reference/styles/dark--space-odyssey/style.md
- skills/morph-ppt/reference/styles/mixed--spectral-grid/style.md
- skills/morph-ppt/reference/styles/vivid--playful-marketing/style.md
- skills/morph-ppt/reference/styles/light--minimal-corporate/style.md
- skills/morph-ppt/reference/styles/dark--cyber-future/style.md
- skills/morph-ppt/reference/styles/dark--obsidian-amber/style.md
- THIRD_PARTY_NOTICES.md
- skills/morph-ppt/reference/styles/light--firmwise-saas/style.md
- skills/morph-ppt/reference/styles/dark--cyber-future/build.sh
- skills/morph-ppt/reference/styles/light--fluid-gradient/style.md
🚧 Files skipped from review as they are similar to previous changes (2)
- packages/opencode/test/skill/skill.test.ts
- packages/desktop-electron/scripts/sync-officecli-skills.ts
Round 4 — batch response on 16
|
The vendoredNames list only asserted that each expected skill is present, so an upstream sync that introduces a new officecli-* or morph-ppt* skill would pass without the test being updated. Add a prefix-filtered length assertion so any future scope drift surfaces in CI rather than slipping through the bump PR. Refs CodeRabbit crosscheck round 1 (Codex P2 / Claude P2).
Summary
Drop the three legacy built-in skills (
data-analysis,document-processing,writing-assistant) and vendor officecli's 9 SKILL.md files (officecli-docx/xlsx/pptx,officecli-pitch-deck,officecli-academic-paper,officecli-financial-model,officecli-data-dashboard,morph-ppt,morph-ppt-3d) intoskills/. Each vendored SKILL.md gets a fixed PawWork override blockquote injected after its frontmatter; companion files (editing.md, creating.md, reference/**) are vendored byte-for-byte alongside SKILL.md so the cross-doc links that upstream SKILL.md text relies on resolve in packaged builds. A newsync-officecli-skills.tsmaintenance script handles vendor + override + content-deterministic SHA256 validation, and the existingofficecli-bump.ymlworkflow now runs sync as part of each bump PR.Why
The three legacy skills were authored for the long-removed "pills" onboarding UI. Their descriptions (~15 words each) lose the description-quality competition against Anthropic's
anthropic-agent-skills(xlsx/docx/pptx, ~150 words each) when both are installed, routing Office tasks away from PawWork's bundledofficeclibinary. Upstream officecli ships SKILL.md files with matching description hardness, so vendoring them restores PawWork's Office differentiation.Related Issue
Closes #697.
Human Review Status
Pending. A human should make the final merge decision after reviewing the final diff and verification evidence.
Review Focus
skills/diff shows upstream byte-equivalent content for every file under each skill dir (SKILL.md + companion docs +reference/**), plus the fixed PawWork override blockquote injected only into each SKILL.md.officecli.skillsTarballSha256inbundled-tools.jsonmatches the computed content SHA shown bysync-skills(=4797152b826fa8c1ee31dcb1291cd2dcbcb7931ccabe75751bdebff78ce0d485)..github/workflows/officecli-bump.ymlstill passes the meta-test guard (packages/opencode/test/github/officecli-bump-workflow.test.ts) — all locked substrings preserved.electron-builder.config.tsskills/filter is**/*so companion docs thatpackages/opencode/src/tool/skill.ts:39-48exposes as sibling files (<skill_files>) are present in packaged Resources. SKILL.md cross-doc references such as[editing.md](editing.md)must resolve in the packaged app.Risk Notes
## Setupsection instructscurl ... install.sh/irm ... install.ps1, which contradicts PawWork's bundled-binary stance. Override is positioned before any setup body content so the model sees the bundling note first. Documented inTHIRD_PARTY_NOTICES.mdper Apache-2.0 4(b)/4(c).officecli-word-form). Sync script handles either count — no skill-count assumption in code.**/*underskills/, so the packagedResources/skills/mirrors the reposkills/tree exactly (SKILL.md + companion docs + reference assets). Bundle grows from ~600 KB (SKILL.md only) to ~2 MB; the increase is dominated bymorph-ppt/reference/styles/*/*.pptxupstream templates. Negligible against existing Electron app footprint. No path or signing changes.How To Verify
Not verified in this session and to be confirmed by reviewer manually with
bun run dev:desktop:.xlsxroutes toofficecli-xlsx(description competition vs~/.agents/skills/xlsx/if installed).officecli --versionworks from PTY terminal panel and the chat input!shell mode..appboot does not logskill not found. CI desktop-smoke workflow is expected to cover the packaged path.Screenshots or Recordings
Not applicable — no visible UI change in this PR.
Checklist
bug,enhancement,task, ordocumentation), at least one primary routing label (app,ui,platform,harness, orci), and exactly one priority label (P0toP3), or I requested maintainer labelingdev, and my PR title and commit messages use Conventional Commits in EnglishSummary by CodeRabbit
New Features
Documentation
Chores