Skip to content

plugin: add Tips HelpViewer workflow#135

Merged
gaelic-ghost merged 1 commit into
mainfrom
plugin/tips-helpviewer-workflow
Jul 13, 2026
Merged

plugin: add Tips HelpViewer workflow#135
gaelic-ghost merged 1 commit into
mainfrom
plugin/tips-helpviewer-workflow

Conversation

@gaelic-ghost

@gaelic-ghost gaelic-ghost commented Jul 13, 2026

Copy link
Copy Markdown
Owner

Summary

  • add a Mac-only tips-helpviewer-workflow for verified local Apple app guide discovery
  • record the HelpViewer catalog fixture and owner-aware fallback contract
  • register the skill across Apple Dev Skills inventory, metadata, roadmap, and customization accounting

Verification

  • skill-creator quick validation
  • Apple Dev Skills docs validation
  • Apple Dev Skills pytest (249 passed)
  • Socket metadata validation
  • Socket pytest (81 passed, 1 skipped)
  • live HelpViewer search for installed Compressor 5.3

Summary by CodeRabbit

  • New Features

    • Added the Tips and HelpViewer workflow for finding local Apple app user guides.
    • Added guidance for validating local matches and handing off to authoritative documentation when needed.
    • Added an agent entry for discovering installed Apple app guides.
    • Added customization support and related reference documentation.
  • Documentation

    • Added the workflow to the active skills catalog and roadmap.
    • Updated plugin metadata and inventory documentation.
  • Tests

    • Added workflow coverage and updated active-skill count validations.

@gaelic-ghost gaelic-ghost added the enhancement New feature or request label Jul 13, 2026
@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds the Tips/HelpViewer local guide discovery skill, its agent configuration, fallback and customization contracts, a configuration CLI, and repository metadata and test updates for 50 active skills.

Changes

Tips HelpViewer workflow

Layer / File(s) Summary
Workflow contract and agent integration
plugins/apple-dev-skills/skills/tips-helpviewer-workflow/SKILL.md, agents/openai.yaml, references/...
Defines local HelpViewer discovery, match evidence, fallback ordering, agent invocation, customization guidance, and Apple project standards.
Customization configuration CLI
plugins/apple-dev-skills/skills/tips-helpviewer-workflow/scripts/customization_config.py, references/customization*
Adds validated YAML loading, merging, deterministic output, durable storage, and path, effective, apply, and reset commands.
Repository registration and inventory alignment
ROADMAP.md, plugins/apple-dev-skills/.codex-plugin/*, README.md, .github/scripts/*, docs/maintainers/*, tests/*
Registers the skill, updates active-skill and customization counts from 49 to 50, and aligns repository tests.
Estimated code review effort: 3 (Moderate) ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Requester
  participant TipsHelpViewerWorkflow
  participant HelpViewerCatalog
  participant FallbackDocumentation
  Requester->>TipsHelpViewerWorkflow: request local guide
  TipsHelpViewerWorkflow->>HelpViewerCatalog: search installed app catalog
  HelpViewerCatalog-->>TipsHelpViewerWorkflow: matching or incomplete guide result
  TipsHelpViewerWorkflow->>FallbackDocumentation: use ordered fallback when needed
  FallbackDocumentation-->>Requester: guide result with source provenance
Loading

Possibly related PRs

Suggested labels: documentation

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: adding the Tips HelpViewer workflow plugin.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch plugin/tips-helpviewer-workflow

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gaelic-ghost gaelic-ghost merged commit 6a9d7a3 into main Jul 13, 2026
1 of 2 checks passed
@gaelic-ghost gaelic-ghost deleted the plugin/tips-helpviewer-workflow branch July 13, 2026 21:09

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 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 `@plugins/apple-dev-skills/README.md`:
- Line 176: Reconcile the Active Skills inventory in README.md with the
canonical count of 50 enforced by validate_repo_docs.sh. Review the entries
across the Active Skills section, remove stale or non-active entries as needed,
and ensure the final list contains exactly 50 skills while retaining valid
active skills.

In
`@plugins/apple-dev-skills/skills/tips-helpviewer-workflow/scripts/customization_config.py`:
- Around line 113-121: Update dump_yaml to serialize an empty config["settings"]
mapping explicitly as an empty YAML map while preserving the existing key
serialization for non-empty settings. Also update parse_yaml to normalize a
missing or null settings value to an empty mapping before validate_config,
ensuring durable round-trips with empty or fully reset settings succeed.

In `@plugins/apple-dev-skills/tests/test_milestone24_system_ui_workflows.py`:
- Around line 57-69: Update
test_tips_helpviewer_workflow_requires_a_local_match_and_owner_aware_fallback to
read the skill’s customization_config.py and assert it contains the expected
SKILL_NAME = "tips-helpviewer-workflow" declaration, matching the verification
pattern used by test_app_intents_workflow and test_liquid_glass_workflow.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4bbaeace-466b-4190-8956-8d05d2e869fa

📥 Commits

Reviewing files that changed from the base of the PR and between ad66958 and 4a70439.

📒 Files selected for processing (24)
  • ROADMAP.md
  • plugins/apple-dev-skills/.codex-plugin/plugin.json
  • plugins/apple-dev-skills/.github/scripts/validate_repo_docs.sh
  • plugins/apple-dev-skills/README.md
  • plugins/apple-dev-skills/docs/maintainers/customization-consolidation-review.md
  • plugins/apple-dev-skills/skills/tips-helpviewer-workflow/SKILL.md
  • plugins/apple-dev-skills/skills/tips-helpviewer-workflow/agents/openai.yaml
  • plugins/apple-dev-skills/skills/tips-helpviewer-workflow/references/catalog-and-fallback-contract.md
  • plugins/apple-dev-skills/skills/tips-helpviewer-workflow/references/customization-flow.md
  • plugins/apple-dev-skills/skills/tips-helpviewer-workflow/references/customization.template.yaml
  • plugins/apple-dev-skills/skills/tips-helpviewer-workflow/references/snippets/apple-xcode-project-core.md
  • plugins/apple-dev-skills/skills/tips-helpviewer-workflow/scripts/customization_config.py
  • plugins/apple-dev-skills/tests/test_apple_developer_provisioning_workflow.py
  • plugins/apple-dev-skills/tests/test_arkit_spatial_face_body_workflows.py
  • plugins/apple-dev-skills/tests/test_camera_capture_depth_workflow.py
  • plugins/apple-dev-skills/tests/test_customization_consolidation_review.py
  • plugins/apple-dev-skills/tests/test_devicecheck_app_attest_workflow.py
  • plugins/apple-dev-skills/tests/test_imaging_foundation_workflows.py
  • plugins/apple-dev-skills/tests/test_milestone24_system_ui_workflows.py
  • plugins/apple-dev-skills/tests/test_photos_library_editing_workflow.py
  • plugins/apple-dev-skills/tests/test_tipkit_workflow.py
  • plugins/apple-dev-skills/tests/test_video_codec_processing_workflow.py
  • plugins/apple-dev-skills/tests/test_vision_recognition_workflows.py
  • plugins/apple-dev-skills/tests/test_xcode_localization_workflow.py

- `structure-swift-sources`
- `swiftdata-workflow`
- `tipkit-workflow`
- `tips-helpviewer-workflow`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Reconcile the README inventory with the canonical active-skill count.

The Active Skills section currently contains 57 entries across Lines 142-198, while validate_repo_docs.sh and related documentation declare 50 active skills. Adding this entry without reconciling the stale entries leaves the public inventory inconsistent.

🤖 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 `@plugins/apple-dev-skills/README.md` at line 176, Reconcile the Active Skills
inventory in README.md with the canonical count of 50 enforced by
validate_repo_docs.sh. Review the entries across the Active Skills section,
remove stale or non-active entries as needed, and ensure the final list contains
exactly 50 skills while retaining valid active skills.

Comment on lines +113 to +121
def dump_yaml(config: dict) -> str:
lines = [
f"schemaVersion: {int(config['schemaVersion'])}",
f"isCustomized: {'true' if config['isCustomized'] else 'false'}",
"settings:",
]
for key in sorted(config["settings"].keys()):
lines.append(f" {key}: {encode_scalar(config['settings'][key])}")
return "\n".join(lines) + "\n"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

dump_yaml produces unparseable YAML when settings is empty.

When config["settings"] is {}, dump_yaml emits settings: with no value, which YAML parses as null — not an empty mapping. A subsequent load_durable()parse_yaml()validate_config() then fails with "settings must be a mapping" because None is not a dict. This corrupts the durable config round-trip: apply with empty (or fully-reset) settings writes a file that effective cannot read back.

🐛 Proposed fix for dump_yaml and parse_yaml
 def dump_yaml(config: dict) -> str:
     lines = [
         f"schemaVersion: {int(config['schemaVersion'])}",
         f"isCustomized: {'true' if config['isCustomized'] else 'false'}",
-        "settings:",
     ]
-    for key in sorted(config["settings"].keys()):
-        lines.append(f"  {key}: {encode_scalar(config['settings'][key])}")
+    if config["settings"]:
+        lines.append("settings:")
+        for key in sorted(config["settings"].keys()):
+            lines.append(f"  {key}: {encode_scalar(config['settings'][key])}")
+    else:
+        lines.append("settings: {}")
     return "\n".join(lines) + "\n"

Also harden parse_yaml to defensively normalize None settings:

     if isinstance(loaded.get("settings"), dict):
         loaded["settings"] = {
             key: ("" if value is None else value) for key, value in loaded["settings"].items()
         }
+    elif loaded.get("settings") is None:
+        loaded["settings"] = {}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def dump_yaml(config: dict) -> str:
lines = [
f"schemaVersion: {int(config['schemaVersion'])}",
f"isCustomized: {'true' if config['isCustomized'] else 'false'}",
"settings:",
]
for key in sorted(config["settings"].keys()):
lines.append(f" {key}: {encode_scalar(config['settings'][key])}")
return "\n".join(lines) + "\n"
def dump_yaml(config: dict) -> str:
lines = [
f"schemaVersion: {int(config['schemaVersion'])}",
f"isCustomized: {'true' if config['isCustomized'] else 'false'}",
]
if config["settings"]:
lines.append("settings:")
for key in sorted(config["settings"].keys()):
lines.append(f" {key}: {encode_scalar(config['settings'][key])}")
else:
lines.append("settings: {}")
return "\n".join(lines) + "\n"
🤖 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
`@plugins/apple-dev-skills/skills/tips-helpviewer-workflow/scripts/customization_config.py`
around lines 113 - 121, Update dump_yaml to serialize an empty
config["settings"] mapping explicitly as an empty YAML map while preserving the
existing key serialization for non-empty settings. Also update parse_yaml to
normalize a missing or null settings value to an empty mapping before
validate_config, ensuring durable round-trips with empty or fully reset settings
succeed.

Comment on lines +57 to +69
def test_tips_helpviewer_workflow_requires_a_local_match_and_owner_aware_fallback(self) -> None:
skill = self.read("skills/tips-helpviewer-workflow/SKILL.md")
reference = self.read("skills/tips-helpviewer-workflow/references/catalog-and-fallback-contract.md")
prompt = self.read("skills/tips-helpviewer-workflow/agents/openai.yaml")

self.assertIn("com.apple.helpviewer", skill)
self.assertIn("com.apple.tips", skill)
self.assertIn("installed-version capture", skill)
self.assertIn("local-helpviewer", skill)
self.assertIn("Do not modify app settings", skill)
self.assertIn("Compressor export movie", reference)
self.assertIn("explore-apple-swift-docs", reference)
self.assertIn("$tips-helpviewer-workflow", prompt)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add customization script verification to match sibling test pattern.

The test_app_intents_workflow and test_liquid_glass_workflow tests in this file both read the skill's customization_config.py and assert SKILL_NAME = "...". This test omits that check, breaking the established pattern.

💚 Proposed fix
     def test_tips_helpviewer_workflow_requires_a_local_match_and_owner_aware_fallback(self) -> None:
         skill = self.read("skills/tips-helpviewer-workflow/SKILL.md")
         reference = self.read("skills/tips-helpviewer-workflow/references/catalog-and-fallback-contract.md")
         prompt = self.read("skills/tips-helpviewer-workflow/agents/openai.yaml")
+        customization = self.read("skills/tips-helpviewer-workflow/scripts/customization_config.py")

         self.assertIn("com.apple.helpviewer", skill)
         self.assertIn("com.apple.tips", skill)
         self.assertIn("installed-version capture", skill)
         self.assertIn("local-helpviewer", skill)
         self.assertIn("Do not modify app settings", skill)
         self.assertIn("Compressor export movie", reference)
         self.assertIn("explore-apple-swift-docs", reference)
         self.assertIn("$tips-helpviewer-workflow", prompt)
+        self.assertIn('SKILL_NAME = "tips-helpviewer-workflow"', customization)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def test_tips_helpviewer_workflow_requires_a_local_match_and_owner_aware_fallback(self) -> None:
skill = self.read("skills/tips-helpviewer-workflow/SKILL.md")
reference = self.read("skills/tips-helpviewer-workflow/references/catalog-and-fallback-contract.md")
prompt = self.read("skills/tips-helpviewer-workflow/agents/openai.yaml")
self.assertIn("com.apple.helpviewer", skill)
self.assertIn("com.apple.tips", skill)
self.assertIn("installed-version capture", skill)
self.assertIn("local-helpviewer", skill)
self.assertIn("Do not modify app settings", skill)
self.assertIn("Compressor export movie", reference)
self.assertIn("explore-apple-swift-docs", reference)
self.assertIn("$tips-helpviewer-workflow", prompt)
def test_tips_helpviewer_workflow_requires_a_local_match_and_owner_aware_fallback(self) -> None:
skill = self.read("skills/tips-helpviewer-workflow/SKILL.md")
reference = self.read("skills/tips-helpviewer-workflow/references/catalog-and-fallback-contract.md")
prompt = self.read("skills/tips-helpviewer-workflow/agents/openai.yaml")
customization = self.read("skills/tips-helpviewer-workflow/scripts/customization_config.py")
self.assertIn("com.apple.helpviewer", skill)
self.assertIn("com.apple.tips", skill)
self.assertIn("installed-version capture", skill)
self.assertIn("local-helpviewer", skill)
self.assertIn("Do not modify app settings", skill)
self.assertIn("Compressor export movie", reference)
self.assertIn("explore-apple-swift-docs", reference)
self.assertIn("$tips-helpviewer-workflow", prompt)
self.assertIn('SKILL_NAME = "tips-helpviewer-workflow"', customization)
🤖 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 `@plugins/apple-dev-skills/tests/test_milestone24_system_ui_workflows.py`
around lines 57 - 69, Update
test_tips_helpviewer_workflow_requires_a_local_match_and_owner_aware_fallback to
read the skill’s customization_config.py and assert it contains the expected
SKILL_NAME = "tips-helpviewer-workflow" declaration, matching the verification
pattern used by test_app_intents_workflow and test_liquid_glass_workflow.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4a70439333

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

"name": "apple-dev-skills",
"version": "9.5.0",
"description": "Apple development workflows for Codex, including App Intents, Liquid Glass, PhotosUI/PhotoKit, VideoToolbox codecs, ARKit spatial/face/body sensing, camera/depth capture, Core Image, Image I/O, Vision/Core ML recognition, media/audio repair, provisioning, CloudKit, TipKit, SwiftData, SwiftUI, XcodeGen, Core Animation, AppKit, Safari, security, OpenAPI, and DocC.",
"description": "Apple development workflows for Codex, including App Intents, Liquid Glass, PhotosUI/PhotoKit, VideoToolbox codecs, ARKit spatial/face/body sensing, camera/depth capture, Core Image, Image I/O, Vision/Core ML recognition, media/audio repair, local Tips/HelpViewer guide discovery, provisioning, CloudKit, TipKit, SwiftData, SwiftUI, XcodeGen, Core Animation, AppKit, Safari, security, OpenAPI, and DocC.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add HelpViewer to interface metadata

This registers the new Tips/HelpViewer skill in the package description and keywords, but the interface.longDescription and interface.defaultPrompt below still omit any local guide discovery prompt. In marketplace/composer surfaces that render the interface metadata, users will not see or be steered toward the new workflow even though the README and active-skill validator now advertise it.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant