Skip to content

Comments

feat: add project-level skill support in skill_domains#4

Closed
cuioss-oliver wants to merge 4 commits intomainfrom
feature/project-skills-in-skill-domains
Closed

feat: add project-level skill support in skill_domains#4
cuioss-oliver wants to merge 4 commits intomainfrom
feature/project-skills-in-skill-domains

Conversation

@cuioss-oliver
Copy link
Collaborator

Summary

  • Add project:{skill} notation for referencing project-level skills (from .claude/skills/) in skill_domains within marshal.json
  • Add discover-project and attach-project verbs to the skill-domains noun for discovering and attaching project skills to any configured domain
  • Extend skill-domains configure to preserve project_skills across domain reconfiguration
  • Extend skill resolution (get, resolve-domain-skills, get-skills-by-profile) to include project_skills in output
  • Add Step 11f to marshall-steward wizard for interactive project skill discovery and domain attachment
  • Rename executor's internal local: prefix to default-bundle: to avoid confusion with user-facing project: notation

Test plan

  • All 744 existing tests pass (./pw verify plan-marshall)
  • New tests for discover-project verb discovering skills from .claude/skills/
  • New tests for attach-project verb (valid domain, system domain, invalid notation, unknown domain, deduplication)
  • New tests for configure preserving project_skills and dropping for removed domains
  • New tests for get including project_skills in domain output

🤖 Generated with Claude Code

Allow project-level skills from .claude/skills/ to be discovered and
attached to any configured domain in marshal.json using project:{skill}
notation. This bridges the gap where only marketplace bundle skills were
represented in skill_domains.

Changes:
- Add discover-project and attach-project verbs to skill-domains
- Extend configure to preserve project_skills across reconfiguration
- Extend get/resolve to include project_skills in output
- Add project: notation support in get_skill_description()
- Add Step 11f to marshall-steward wizard for project skill discovery
- Rename executor internal local: prefix to default-bundle:
- Add comprehensive tests (322 new lines)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@gemini-code-assist
Copy link

Summary of Changes

Hello @cuioss-oliver, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the skill management system by introducing native support for project-level skills. It provides a streamlined way for users to define, discover, and integrate custom skills directly within their projects, making the system more flexible and extensible. The changes include new command-line interface capabilities, improved configuration persistence, and clearer internal naming conventions, all aimed at improving the developer experience when working with skills.

Highlights

  • Project-level Skill Support: Introduced project:{skill} notation, allowing users to define and reference skills directly from their project's .claude/skills/ directory.
  • New Skill Domain Verbs: Added discover-project and attach-project verbs to the skill-domains noun, enabling discovery and attachment of project skills to configured domains.
  • Persistent Project Skills Configuration: Enhanced skill-domains configure to preserve project_skills across domain reconfigurations, ensuring continuity.
  • Updated Skill Resolution: Modified skill resolution mechanisms (get, resolve-domain-skills, get-skills-by-profile) to include project_skills in their output.
  • Wizard Integration: Integrated an interactive step (Step 11f) into the marshall-steward wizard for guided project skill discovery and domain attachment.
  • Internal Prefix Renaming: Renamed the executor's internal local: prefix to default-bundle: to prevent confusion with the new user-facing project: notation.
Changelog
  • .claude/skills/verify-workflow/SKILL.md
    • Updated script notation from local: to default-bundle: in script examples.
  • .claude/skills/verify-workflow/workflows/test-and-verify.md
    • Updated script notation from local: to default-bundle: in workflow examples.
  • marketplace/bundles/plan-marshall/skills/manage-plan-marshall-config/scripts/_cmd_skill_domains.py
    • Added discover_project_skills function to scan for project-level skills.
    • Modified cmd_skill_domains to include project_skills in domain configuration output.
    • Implemented logic in cmd_skill_domains to preserve project_skills during domain reconfiguration.
    • Added discover-project verb to list project skills.
    • Added attach-project verb to assign project skills to domains, including validation and deduplication.
    • Updated cmd_resolve_domain_skills to include attached project_skills in the resolved skill list.
  • marketplace/bundles/plan-marshall/skills/manage-plan-marshall-config/scripts/_config_core.py
    • Added _parse_skill_md_description helper function to extract descriptions from SKILL.md frontmatter.
    • Modified get_skill_description to support both marketplace (bundle:skill) and project-level (project:skill) notations.
    • Updated is_nested_domain to consider domains with project_skills as nested.
  • marketplace/bundles/plan-marshall/skills/manage-plan-marshall-config/scripts/plan-marshall-config.py
    • Added discover-project and attach-project sub-parsers to the skill-domains command-line interface.
  • marketplace/bundles/plan-marshall/skills/marshall-steward/references/wizard-flow.md
    • Added 'Step 11f: Discover and Attach Project-Level Skills' to the wizard flow documentation, detailing interactive skill assignment.
  • marketplace/bundles/plan-marshall/skills/tools-script-executor/scripts/generate-executor.py
    • Updated internal script notation from local: to default-bundle: for clarity and collision avoidance.
    • Added comments to explain the distinction between internal and user-facing skill notations.
  • test/plan-marshall/manage-plan-marshall-config/test_cmd_skill_domains.py
    • Imported Path for file system operations in tests.
    • Added tests for discover_project_skills functionality, including cases with and without skills.
    • Added tests for attach-project verb, covering valid domain attachment, system domain attachment, invalid notation rejection, unknown domain rejection, and deduplication.
    • Added tests to verify configure preserves project_skills for existing domains.
    • Added tests to verify configure correctly drops project_skills for removed domains.
    • Added tests to confirm get command output includes project_skills for nested domains.
Activity
  • All 744 existing tests passed (./pw verify plan-marshall).
  • New tests were added for the discover-project verb, verifying its ability to find skills in .claude/skills/.
  • New tests were added for the attach-project verb, covering scenarios like valid domain attachment, system domain attachment, handling of invalid notation, rejection of unknown domains, and ensuring deduplication of skills.
  • New tests were added for the configure command, confirming it preserves project_skills for reconfigured domains and correctly drops them for removed domains.
  • New tests were added for the get command, ensuring it includes project_skills in the domain output.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces support for project-level skills, a significant feature enhancement. The changes include a new project:{skill} notation, commands to discover and attach these skills to domains, and updates to preserve this configuration during domain reconfiguration. The implementation is solid, with good separation of concerns and comprehensive new tests. I've identified a couple of areas for improvement: one to make a new test case more robust and clear, and another to improve the robustness of a custom YAML parser while adhering to the 'stdlib-only' constraint. Overall, this is a great contribution that extends the system's flexibility.

Comment on lines 131 to 136
if line.startswith('description:'):
desc = line[12:].strip()
# Remove quotes if present
if (desc.startswith('"') and desc.endswith('"')) or (desc.startswith("'") and desc.endswith("'")):
desc = desc[1:-1]
return desc

This comment was marked as resolved.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Good suggestion. Applied the more robust parsing using lstrip() and split(':', 1) instead of the fragile positional slice. Fixed in 7213c9f.

Comment on lines 941 to 952
def test_discover_project_empty_when_no_skills():
"""Test discover-project returns empty when no .claude/skills/ exists."""
with PlanContext() as ctx:
create_nested_marshal_json(ctx.fixture_dir)

# Ensure no project skills directory
# (test runs in project root which has .claude/skills/, so we test count > 0 instead)
result = run_script(SCRIPT_PATH, 'skill-domains', 'discover-project')

assert result.success, f'Should succeed: {result.stderr}'
# Should have count field
assert 'count' in result.stdout

This comment was marked as resolved.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Improved the test: renamed to test_discover_project_returns_structured_output, clarified the docstring and comments, and now asserts TOON-format fields (status: success and count:). Note: JSON parsing isn't applicable here as the output uses TOON format. Also, since the test runs from the project root which contains real .claude/skills/ entries, asserting count==0 would fail. Fixed in 7213c9f.

cuioss-oliver and others added 2 commits February 23, 2026 12:46
… clarity

- Use lstrip() + split(':', 1) for more robust YAML frontmatter parsing
- Improve test name and assertions for discover-project structured output

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…fidelity

The TOON serializer wrote string values like "012345" unquoted, causing
the parser to coerce them to int (12345), losing leading zeros. This made
tests with random hex hash_ids flaky (~0.6% chance per hash of all-digit
with leading zero). Fix quotes strings that _parse_value would misinterpret
as numbers, booleans, null, or percentages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant