persona-kit: add local skill source provider - #82

Merged
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source
May 11, 2026
Merged

persona-kit: add local skill source provider#82
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

Summary

  • Adds a local skill source provider that accepts repo-relative or absolute paths to a .md SKILL file (e.g. .agentworkforce/workforce/skills/essay-authoring.md), alongside the existing prpm and skill.sh sources.
  • Threads a repoRoot option through materializeSkills, buildInstallArtifacts, useSelection, and the CLI so relative local sources can be absoluteified before the install command runs — keeps cd <installRoot> && cp <source> … working in session mode.
  • Registers the local provider first in the resolver chain. Its narrow .md-suffix test claims path-shaped sources before prpm's bare <scope>/<name> regex sees them; a coreyhaines31/marketingskills-style ref still routes to prpm, a ./skills/foo.md ref routes to local.

Motivation

Personas hosted in the same repo as their authoring patterns currently have no way to reference a sibling skill.md without first publishing it to GitHub or prpm. agentworkforce agent <persona> fails with Unsupported skill source: .agentworkforce/workforce/skills/<name>.md. Adds the missing source form so workforce-local skills don't require an extra remote-publish step.

Test plan

  • pnpm --filter @agentworkforce/persona-kit run test — 127/127 pass (8 new local-source tests).
  • pnpm --filter @agentworkforce/workload-router run test — 15/15 pass.
  • pnpm --filter @agentworkforce/cli run test — 147/147 pass.
  • pnpm -r typecheck on persona-kit + workload-router + cli — clean.
  • Manual: run agentworkforce agent <persona> against a persona declaring a local/<name> skill with a .agentworkforce/...md source and confirm the SKILL.md is installed at <installRoot>/.claude/skills/<name>/SKILL.md.

🤖 Generated with Claude Code

Accepts repo-relative or absolute paths to a `.md` SKILL file (e.g.
`.agentworkforce/workforce/skills/essay-authoring.md`) alongside the
existing prpm and skill.sh sources. The provider emits a mkdir+cp install
command targeting the harness's conventional skills dir.
A new `repoRoot` option threads through `materializeSkills`,
`buildInstallArtifacts`, `useSelection`, and the CLI so local sources can
be absoluteified before the install command runs. This is what lets
session-mode `cd <installRoot> && cp <source> …` find the file under the
user's real cwd instead of the empty stage dir.
The local provider is registered first in the resolver chain so its
narrow `.md`-suffix test claims path-shaped sources before prpm's bare
`<scope>/<name>` regex sees them. A `coreyhaines31/marketingskills`-style
ref still routes to prpm; a `./skills/foo.md` ref routes to local.
@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8d5c6308-fb2c-46fb-80df-c9969a0f5fe6

📥 Commits

Reviewing files that changed from the base of the PR and between a5e8df9 and 10d6780.

📒 Files selected for processing (6)
  • packages/cli/src/cli.ts
  • packages/persona-kit/src/constants.ts
  • packages/persona-kit/src/index.test.ts
  • packages/persona-kit/src/skills.ts
  • packages/persona-kit/src/types.ts
  • packages/workload-router/src/index.ts

📝 Walkthrough

Walkthrough

This PR extends the skill materialization system to support repository-local .md file sources by threading a new repoRoot parameter through the persona-kit, workload-router, and CLI layers, enabling local relative paths to be resolved into absolute filesystem paths within install commands.

Changes

Local Skill Source Support

Layer / File(s)Summary
Type Contracts
packages/persona-kit/src/types.ts
SkillMaterializationOptions and SkillMaterializationPlan each gain an optional repoRoot?: string field to carry the repo filesystem root for resolving local skill sources.
Source Kind Registration
packages/persona-kit/src/constants.ts
SKILL_SOURCE_KINDS now includes 'local' as a recognized skill source type.
Provider Interface
packages/persona-kit/src/skills.ts
SkillProvider.buildInstallCommand now accepts an optional BuildInstallContext parameter, allowing providers to access repoRoot and other resolution context.
Local Provider Implementation
packages/persona-kit/src/skills.ts
New local provider parses .md file paths, derives installed skill names (with special handling for SKILL.md), resolves relative paths against repoRoot, generates sh -c 'mkdir && cp' shell commands, and is prepended to the provider list to take precedence.
Skill Materialization Core
packages/persona-kit/src/skills.ts
materializeSkills extracts repoRoot from options, builds a provider context, passes it into each provider's command builder, and includes repoRoot in the returned SkillMaterializationPlan; buildInstallArtifacts session mode also forwards repoRoot during artifact generation.
Router Integration
packages/workload-router/src/index.ts
usePersona and useSelection option types gain optional repoRoot?: string fields; usePersona forwards repoRoot to useSelection, which conditionally includes it in SkillMaterializationOptions.
CLI Integration
packages/cli/src/cli.ts
buildInstallContext, dry-run flow, and interactive run flow now explicitly supply repoRoot: process.cwd() to anchor local skill source resolution to the real repository.
Tests and Validation
packages/persona-kit/src/index.test.ts
Comprehensive test suite covering local skill installation, path normalization (relative/absolute), SKILL.md directory naming, repoRoot-based path absolutization, session mode behavior, regression test for prpm non-shadowing, and .md suffix validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • AgentWorkforce/relay#824: Aligns with extending materializeSkills and its CLI/router callers to support local skill source parsing and install-plan building.

Possibly related PRs

  • AgentWorkforce/workforce#78: Modifies CLI's use of materializeSkills and buildInstallContext plumbing, directly related to the repoRoot threading in this PR.
  • AgentWorkforce/workforce#74: Modifies persona-kit skill materialization surface and plan-builder/execute code paths that call materializeSkills.
  • AgentWorkforce/workforce#73: Changes persona-kit skill materialization (constants, types, skills) and router/CLI wiring, extended by this PR's local source and repoRoot work.

Poem

🐰 A local skill in every .md,
Paths resolved with perfect care,
Through repo root we safely thread,
Install commands prepared with flair!
The rabbit's feast of fixtures bright,
Makes skill materialization just right. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 40.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 nameStatusExplanation
Title check✅ PassedThe title 'persona-kit: add local skill source provider' directly and clearly summarizes the main change: adding support for local skill sources in the persona-kit package.
Description check✅ PassedThe description is well-structured and directly related to the changeset, covering the new local skill source provider feature, implementation details, motivation, and test results.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/local-skill-source

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

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@willwashburnwillwashburn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice, good call!

@khaliqgant
khaliqgant merged commit ae8be37 into mainMay 11, 2026
3 checks passed
@khaliqgant
khaliqgant deleted the feature/local-skill-source branch May 11, 2026 18:23
Sign up for freeto 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.

2 participants

@khaliqgant@willwashburn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

persona-kit: add local skill source provider - #82

Merged
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source
May 11, 2026
Merged

persona-kit: add local skill source provider#82
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

Summary

  • Adds a local skill source provider that accepts repo-relative or absolute paths to a .md SKILL file (e.g. .agentworkforce/workforce/skills/essay-authoring.md), alongside the existing prpm and skill.sh sources.
  • Threads a repoRoot option through materializeSkills, buildInstallArtifacts, useSelection, and the CLI so relative local sources can be absoluteified before the install command runs — keeps cd <installRoot> && cp <source> … working in session mode.
  • Registers the local provider first in the resolver chain. Its narrow .md-suffix test claims path-shaped sources before prpm's bare <scope>/<name> regex sees them; a coreyhaines31/marketingskills-style ref still routes to prpm, a ./skills/foo.md ref routes to local.

Motivation

Personas hosted in the same repo as their authoring patterns currently have no way to reference a sibling skill.md without first publishing it to GitHub or prpm. agentworkforce agent <persona> fails with Unsupported skill source: .agentworkforce/workforce/skills/<name>.md. Adds the missing source form so workforce-local skills don't require an extra remote-publish step.

Test plan

  • pnpm --filter @agentworkforce/persona-kit run test — 127/127 pass (8 new local-source tests).
  • pnpm --filter @agentworkforce/workload-router run test — 15/15 pass.
  • pnpm --filter @agentworkforce/cli run test — 147/147 pass.
  • pnpm -r typecheck on persona-kit + workload-router + cli — clean.
  • Manual: run agentworkforce agent <persona> against a persona declaring a local/<name> skill with a .agentworkforce/...md source and confirm the SKILL.md is installed at <installRoot>/.claude/skills/<name>/SKILL.md.

🤖 Generated with Claude Code

Accepts repo-relative or absolute paths to a `.md` SKILL file (e.g.
`.agentworkforce/workforce/skills/essay-authoring.md`) alongside the
existing prpm and skill.sh sources. The provider emits a mkdir+cp install
command targeting the harness's conventional skills dir.
A new `repoRoot` option threads through `materializeSkills`,
`buildInstallArtifacts`, `useSelection`, and the CLI so local sources can
be absoluteified before the install command runs. This is what lets
session-mode `cd <installRoot> && cp <source> …` find the file under the
user's real cwd instead of the empty stage dir.
The local provider is registered first in the resolver chain so its
narrow `.md`-suffix test claims path-shaped sources before prpm's bare
`<scope>/<name>` regex sees them. A `coreyhaines31/marketingskills`-style
ref still routes to prpm; a `./skills/foo.md` ref routes to local.
@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8d5c6308-fb2c-46fb-80df-c9969a0f5fe6

📥 Commits

Reviewing files that changed from the base of the PR and between a5e8df9 and 10d6780.

📒 Files selected for processing (6)
  • packages/cli/src/cli.ts
  • packages/persona-kit/src/constants.ts
  • packages/persona-kit/src/index.test.ts
  • packages/persona-kit/src/skills.ts
  • packages/persona-kit/src/types.ts
  • packages/workload-router/src/index.ts

📝 Walkthrough

Walkthrough

This PR extends the skill materialization system to support repository-local .md file sources by threading a new repoRoot parameter through the persona-kit, workload-router, and CLI layers, enabling local relative paths to be resolved into absolute filesystem paths within install commands.

Changes

Local Skill Source Support

Layer / File(s)Summary
Type Contracts
packages/persona-kit/src/types.ts
SkillMaterializationOptions and SkillMaterializationPlan each gain an optional repoRoot?: string field to carry the repo filesystem root for resolving local skill sources.
Source Kind Registration
packages/persona-kit/src/constants.ts
SKILL_SOURCE_KINDS now includes 'local' as a recognized skill source type.
Provider Interface
packages/persona-kit/src/skills.ts
SkillProvider.buildInstallCommand now accepts an optional BuildInstallContext parameter, allowing providers to access repoRoot and other resolution context.
Local Provider Implementation
packages/persona-kit/src/skills.ts
New local provider parses .md file paths, derives installed skill names (with special handling for SKILL.md), resolves relative paths against repoRoot, generates sh -c 'mkdir && cp' shell commands, and is prepended to the provider list to take precedence.
Skill Materialization Core
packages/persona-kit/src/skills.ts
materializeSkills extracts repoRoot from options, builds a provider context, passes it into each provider's command builder, and includes repoRoot in the returned SkillMaterializationPlan; buildInstallArtifacts session mode also forwards repoRoot during artifact generation.
Router Integration
packages/workload-router/src/index.ts
usePersona and useSelection option types gain optional repoRoot?: string fields; usePersona forwards repoRoot to useSelection, which conditionally includes it in SkillMaterializationOptions.
CLI Integration
packages/cli/src/cli.ts
buildInstallContext, dry-run flow, and interactive run flow now explicitly supply repoRoot: process.cwd() to anchor local skill source resolution to the real repository.
Tests and Validation
packages/persona-kit/src/index.test.ts
Comprehensive test suite covering local skill installation, path normalization (relative/absolute), SKILL.md directory naming, repoRoot-based path absolutization, session mode behavior, regression test for prpm non-shadowing, and .md suffix validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • AgentWorkforce/relay#824: Aligns with extending materializeSkills and its CLI/router callers to support local skill source parsing and install-plan building.

Possibly related PRs

  • AgentWorkforce/workforce#78: Modifies CLI's use of materializeSkills and buildInstallContext plumbing, directly related to the repoRoot threading in this PR.
  • AgentWorkforce/workforce#74: Modifies persona-kit skill materialization surface and plan-builder/execute code paths that call materializeSkills.
  • AgentWorkforce/workforce#73: Changes persona-kit skill materialization (constants, types, skills) and router/CLI wiring, extended by this PR's local source and repoRoot work.

Poem

🐰 A local skill in every .md,
Paths resolved with perfect care,
Through repo root we safely thread,
Install commands prepared with flair!
The rabbit's feast of fixtures bright,
Makes skill materialization just right. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 40.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 nameStatusExplanation
Title check✅ PassedThe title 'persona-kit: add local skill source provider' directly and clearly summarizes the main change: adding support for local skill sources in the persona-kit package.
Description check✅ PassedThe description is well-structured and directly related to the changeset, covering the new local skill source provider feature, implementation details, motivation, and test results.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/local-skill-source

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

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@willwashburnwillwashburn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice, good call!

@khaliqgant
khaliqgant merged commit ae8be37 into mainMay 11, 2026
3 checks passed
@khaliqgant
khaliqgant deleted the feature/local-skill-source branch May 11, 2026 18:23
Sign up for freeto 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.

2 participants

@khaliqgant@willwashburn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

persona-kit: add local skill source provider - #82

Merged
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source
May 11, 2026
Merged

persona-kit: add local skill source provider#82
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

Summary

  • Adds a local skill source provider that accepts repo-relative or absolute paths to a .md SKILL file (e.g. .agentworkforce/workforce/skills/essay-authoring.md), alongside the existing prpm and skill.sh sources.
  • Threads a repoRoot option through materializeSkills, buildInstallArtifacts, useSelection, and the CLI so relative local sources can be absoluteified before the install command runs — keeps cd <installRoot> && cp <source> … working in session mode.
  • Registers the local provider first in the resolver chain. Its narrow .md-suffix test claims path-shaped sources before prpm's bare <scope>/<name> regex sees them; a coreyhaines31/marketingskills-style ref still routes to prpm, a ./skills/foo.md ref routes to local.

Motivation

Personas hosted in the same repo as their authoring patterns currently have no way to reference a sibling skill.md without first publishing it to GitHub or prpm. agentworkforce agent <persona> fails with Unsupported skill source: .agentworkforce/workforce/skills/<name>.md. Adds the missing source form so workforce-local skills don't require an extra remote-publish step.

Test plan

  • pnpm --filter @agentworkforce/persona-kit run test — 127/127 pass (8 new local-source tests).
  • pnpm --filter @agentworkforce/workload-router run test — 15/15 pass.
  • pnpm --filter @agentworkforce/cli run test — 147/147 pass.
  • pnpm -r typecheck on persona-kit + workload-router + cli — clean.
  • Manual: run agentworkforce agent <persona> against a persona declaring a local/<name> skill with a .agentworkforce/...md source and confirm the SKILL.md is installed at <installRoot>/.claude/skills/<name>/SKILL.md.

🤖 Generated with Claude Code

Accepts repo-relative or absolute paths to a `.md` SKILL file (e.g.
`.agentworkforce/workforce/skills/essay-authoring.md`) alongside the
existing prpm and skill.sh sources. The provider emits a mkdir+cp install
command targeting the harness's conventional skills dir.
A new `repoRoot` option threads through `materializeSkills`,
`buildInstallArtifacts`, `useSelection`, and the CLI so local sources can
be absoluteified before the install command runs. This is what lets
session-mode `cd <installRoot> && cp <source> …` find the file under the
user's real cwd instead of the empty stage dir.
The local provider is registered first in the resolver chain so its
narrow `.md`-suffix test claims path-shaped sources before prpm's bare
`<scope>/<name>` regex sees them. A `coreyhaines31/marketingskills`-style
ref still routes to prpm; a `./skills/foo.md` ref routes to local.
@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8d5c6308-fb2c-46fb-80df-c9969a0f5fe6

📥 Commits

Reviewing files that changed from the base of the PR and between a5e8df9 and 10d6780.

📒 Files selected for processing (6)
  • packages/cli/src/cli.ts
  • packages/persona-kit/src/constants.ts
  • packages/persona-kit/src/index.test.ts
  • packages/persona-kit/src/skills.ts
  • packages/persona-kit/src/types.ts
  • packages/workload-router/src/index.ts

📝 Walkthrough

Walkthrough

This PR extends the skill materialization system to support repository-local .md file sources by threading a new repoRoot parameter through the persona-kit, workload-router, and CLI layers, enabling local relative paths to be resolved into absolute filesystem paths within install commands.

Changes

Local Skill Source Support

Layer / File(s)Summary
Type Contracts
packages/persona-kit/src/types.ts
SkillMaterializationOptions and SkillMaterializationPlan each gain an optional repoRoot?: string field to carry the repo filesystem root for resolving local skill sources.
Source Kind Registration
packages/persona-kit/src/constants.ts
SKILL_SOURCE_KINDS now includes 'local' as a recognized skill source type.
Provider Interface
packages/persona-kit/src/skills.ts
SkillProvider.buildInstallCommand now accepts an optional BuildInstallContext parameter, allowing providers to access repoRoot and other resolution context.
Local Provider Implementation
packages/persona-kit/src/skills.ts
New local provider parses .md file paths, derives installed skill names (with special handling for SKILL.md), resolves relative paths against repoRoot, generates sh -c 'mkdir && cp' shell commands, and is prepended to the provider list to take precedence.
Skill Materialization Core
packages/persona-kit/src/skills.ts
materializeSkills extracts repoRoot from options, builds a provider context, passes it into each provider's command builder, and includes repoRoot in the returned SkillMaterializationPlan; buildInstallArtifacts session mode also forwards repoRoot during artifact generation.
Router Integration
packages/workload-router/src/index.ts
usePersona and useSelection option types gain optional repoRoot?: string fields; usePersona forwards repoRoot to useSelection, which conditionally includes it in SkillMaterializationOptions.
CLI Integration
packages/cli/src/cli.ts
buildInstallContext, dry-run flow, and interactive run flow now explicitly supply repoRoot: process.cwd() to anchor local skill source resolution to the real repository.
Tests and Validation
packages/persona-kit/src/index.test.ts
Comprehensive test suite covering local skill installation, path normalization (relative/absolute), SKILL.md directory naming, repoRoot-based path absolutization, session mode behavior, regression test for prpm non-shadowing, and .md suffix validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • AgentWorkforce/relay#824: Aligns with extending materializeSkills and its CLI/router callers to support local skill source parsing and install-plan building.

Possibly related PRs

  • AgentWorkforce/workforce#78: Modifies CLI's use of materializeSkills and buildInstallContext plumbing, directly related to the repoRoot threading in this PR.
  • AgentWorkforce/workforce#74: Modifies persona-kit skill materialization surface and plan-builder/execute code paths that call materializeSkills.
  • AgentWorkforce/workforce#73: Changes persona-kit skill materialization (constants, types, skills) and router/CLI wiring, extended by this PR's local source and repoRoot work.

Poem

🐰 A local skill in every .md,
Paths resolved with perfect care,
Through repo root we safely thread,
Install commands prepared with flair!
The rabbit's feast of fixtures bright,
Makes skill materialization just right. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 40.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 nameStatusExplanation
Title check✅ PassedThe title 'persona-kit: add local skill source provider' directly and clearly summarizes the main change: adding support for local skill sources in the persona-kit package.
Description check✅ PassedThe description is well-structured and directly related to the changeset, covering the new local skill source provider feature, implementation details, motivation, and test results.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/local-skill-source

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

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@willwashburnwillwashburn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice, good call!

@khaliqgant
khaliqgant merged commit ae8be37 into mainMay 11, 2026
3 checks passed
@khaliqgant
khaliqgant deleted the feature/local-skill-source branch May 11, 2026 18:23
Sign up for freeto 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.

2 participants

@khaliqgant@willwashburn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

persona-kit: add local skill source provider - #82

Merged
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source
May 11, 2026
Merged

persona-kit: add local skill source provider#82
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

Summary

  • Adds a local skill source provider that accepts repo-relative or absolute paths to a .md SKILL file (e.g. .agentworkforce/workforce/skills/essay-authoring.md), alongside the existing prpm and skill.sh sources.
  • Threads a repoRoot option through materializeSkills, buildInstallArtifacts, useSelection, and the CLI so relative local sources can be absoluteified before the install command runs — keeps cd <installRoot> && cp <source> … working in session mode.
  • Registers the local provider first in the resolver chain. Its narrow .md-suffix test claims path-shaped sources before prpm's bare <scope>/<name> regex sees them; a coreyhaines31/marketingskills-style ref still routes to prpm, a ./skills/foo.md ref routes to local.

Motivation

Personas hosted in the same repo as their authoring patterns currently have no way to reference a sibling skill.md without first publishing it to GitHub or prpm. agentworkforce agent <persona> fails with Unsupported skill source: .agentworkforce/workforce/skills/<name>.md. Adds the missing source form so workforce-local skills don't require an extra remote-publish step.

Test plan

  • pnpm --filter @agentworkforce/persona-kit run test — 127/127 pass (8 new local-source tests).
  • pnpm --filter @agentworkforce/workload-router run test — 15/15 pass.
  • pnpm --filter @agentworkforce/cli run test — 147/147 pass.
  • pnpm -r typecheck on persona-kit + workload-router + cli — clean.
  • Manual: run agentworkforce agent <persona> against a persona declaring a local/<name> skill with a .agentworkforce/...md source and confirm the SKILL.md is installed at <installRoot>/.claude/skills/<name>/SKILL.md.

🤖 Generated with Claude Code

Accepts repo-relative or absolute paths to a `.md` SKILL file (e.g.
`.agentworkforce/workforce/skills/essay-authoring.md`) alongside the
existing prpm and skill.sh sources. The provider emits a mkdir+cp install
command targeting the harness's conventional skills dir.
A new `repoRoot` option threads through `materializeSkills`,
`buildInstallArtifacts`, `useSelection`, and the CLI so local sources can
be absoluteified before the install command runs. This is what lets
session-mode `cd <installRoot> && cp <source> …` find the file under the
user's real cwd instead of the empty stage dir.
The local provider is registered first in the resolver chain so its
narrow `.md`-suffix test claims path-shaped sources before prpm's bare
`<scope>/<name>` regex sees them. A `coreyhaines31/marketingskills`-style
ref still routes to prpm; a `./skills/foo.md` ref routes to local.
@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8d5c6308-fb2c-46fb-80df-c9969a0f5fe6

📥 Commits

Reviewing files that changed from the base of the PR and between a5e8df9 and 10d6780.

📒 Files selected for processing (6)
  • packages/cli/src/cli.ts
  • packages/persona-kit/src/constants.ts
  • packages/persona-kit/src/index.test.ts
  • packages/persona-kit/src/skills.ts
  • packages/persona-kit/src/types.ts
  • packages/workload-router/src/index.ts

📝 Walkthrough

Walkthrough

This PR extends the skill materialization system to support repository-local .md file sources by threading a new repoRoot parameter through the persona-kit, workload-router, and CLI layers, enabling local relative paths to be resolved into absolute filesystem paths within install commands.

Changes

Local Skill Source Support

Layer / File(s)Summary
Type Contracts
packages/persona-kit/src/types.ts
SkillMaterializationOptions and SkillMaterializationPlan each gain an optional repoRoot?: string field to carry the repo filesystem root for resolving local skill sources.
Source Kind Registration
packages/persona-kit/src/constants.ts
SKILL_SOURCE_KINDS now includes 'local' as a recognized skill source type.
Provider Interface
packages/persona-kit/src/skills.ts
SkillProvider.buildInstallCommand now accepts an optional BuildInstallContext parameter, allowing providers to access repoRoot and other resolution context.
Local Provider Implementation
packages/persona-kit/src/skills.ts
New local provider parses .md file paths, derives installed skill names (with special handling for SKILL.md), resolves relative paths against repoRoot, generates sh -c 'mkdir && cp' shell commands, and is prepended to the provider list to take precedence.
Skill Materialization Core
packages/persona-kit/src/skills.ts
materializeSkills extracts repoRoot from options, builds a provider context, passes it into each provider's command builder, and includes repoRoot in the returned SkillMaterializationPlan; buildInstallArtifacts session mode also forwards repoRoot during artifact generation.
Router Integration
packages/workload-router/src/index.ts
usePersona and useSelection option types gain optional repoRoot?: string fields; usePersona forwards repoRoot to useSelection, which conditionally includes it in SkillMaterializationOptions.
CLI Integration
packages/cli/src/cli.ts
buildInstallContext, dry-run flow, and interactive run flow now explicitly supply repoRoot: process.cwd() to anchor local skill source resolution to the real repository.
Tests and Validation
packages/persona-kit/src/index.test.ts
Comprehensive test suite covering local skill installation, path normalization (relative/absolute), SKILL.md directory naming, repoRoot-based path absolutization, session mode behavior, regression test for prpm non-shadowing, and .md suffix validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • AgentWorkforce/relay#824: Aligns with extending materializeSkills and its CLI/router callers to support local skill source parsing and install-plan building.

Possibly related PRs

  • AgentWorkforce/workforce#78: Modifies CLI's use of materializeSkills and buildInstallContext plumbing, directly related to the repoRoot threading in this PR.
  • AgentWorkforce/workforce#74: Modifies persona-kit skill materialization surface and plan-builder/execute code paths that call materializeSkills.
  • AgentWorkforce/workforce#73: Changes persona-kit skill materialization (constants, types, skills) and router/CLI wiring, extended by this PR's local source and repoRoot work.

Poem

🐰 A local skill in every .md,
Paths resolved with perfect care,
Through repo root we safely thread,
Install commands prepared with flair!
The rabbit's feast of fixtures bright,
Makes skill materialization just right. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 40.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 nameStatusExplanation
Title check✅ PassedThe title 'persona-kit: add local skill source provider' directly and clearly summarizes the main change: adding support for local skill sources in the persona-kit package.
Description check✅ PassedThe description is well-structured and directly related to the changeset, covering the new local skill source provider feature, implementation details, motivation, and test results.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/local-skill-source

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

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@willwashburnwillwashburn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice, good call!

@khaliqgant
khaliqgant merged commit ae8be37 into mainMay 11, 2026
3 checks passed
@khaliqgant
khaliqgant deleted the feature/local-skill-source branch May 11, 2026 18:23
Sign up for freeto 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.

2 participants

@khaliqgant@willwashburn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

persona-kit: add local skill source provider - #82

Merged
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source
May 11, 2026
Merged

persona-kit: add local skill source provider#82
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

Summary

  • Adds a local skill source provider that accepts repo-relative or absolute paths to a .md SKILL file (e.g. .agentworkforce/workforce/skills/essay-authoring.md), alongside the existing prpm and skill.sh sources.
  • Threads a repoRoot option through materializeSkills, buildInstallArtifacts, useSelection, and the CLI so relative local sources can be absoluteified before the install command runs — keeps cd <installRoot> && cp <source> … working in session mode.
  • Registers the local provider first in the resolver chain. Its narrow .md-suffix test claims path-shaped sources before prpm's bare <scope>/<name> regex sees them; a coreyhaines31/marketingskills-style ref still routes to prpm, a ./skills/foo.md ref routes to local.

Motivation

Personas hosted in the same repo as their authoring patterns currently have no way to reference a sibling skill.md without first publishing it to GitHub or prpm. agentworkforce agent <persona> fails with Unsupported skill source: .agentworkforce/workforce/skills/<name>.md. Adds the missing source form so workforce-local skills don't require an extra remote-publish step.

Test plan

  • pnpm --filter @agentworkforce/persona-kit run test — 127/127 pass (8 new local-source tests).
  • pnpm --filter @agentworkforce/workload-router run test — 15/15 pass.
  • pnpm --filter @agentworkforce/cli run test — 147/147 pass.
  • pnpm -r typecheck on persona-kit + workload-router + cli — clean.
  • Manual: run agentworkforce agent <persona> against a persona declaring a local/<name> skill with a .agentworkforce/...md source and confirm the SKILL.md is installed at <installRoot>/.claude/skills/<name>/SKILL.md.

🤖 Generated with Claude Code

Accepts repo-relative or absolute paths to a `.md` SKILL file (e.g.
`.agentworkforce/workforce/skills/essay-authoring.md`) alongside the
existing prpm and skill.sh sources. The provider emits a mkdir+cp install
command targeting the harness's conventional skills dir.
A new `repoRoot` option threads through `materializeSkills`,
`buildInstallArtifacts`, `useSelection`, and the CLI so local sources can
be absoluteified before the install command runs. This is what lets
session-mode `cd <installRoot> && cp <source> …` find the file under the
user's real cwd instead of the empty stage dir.
The local provider is registered first in the resolver chain so its
narrow `.md`-suffix test claims path-shaped sources before prpm's bare
`<scope>/<name>` regex sees them. A `coreyhaines31/marketingskills`-style
ref still routes to prpm; a `./skills/foo.md` ref routes to local.
@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8d5c6308-fb2c-46fb-80df-c9969a0f5fe6

📥 Commits

Reviewing files that changed from the base of the PR and between a5e8df9 and 10d6780.

📒 Files selected for processing (6)
  • packages/cli/src/cli.ts
  • packages/persona-kit/src/constants.ts
  • packages/persona-kit/src/index.test.ts
  • packages/persona-kit/src/skills.ts
  • packages/persona-kit/src/types.ts
  • packages/workload-router/src/index.ts

📝 Walkthrough

Walkthrough

This PR extends the skill materialization system to support repository-local .md file sources by threading a new repoRoot parameter through the persona-kit, workload-router, and CLI layers, enabling local relative paths to be resolved into absolute filesystem paths within install commands.

Changes

Local Skill Source Support

Layer / File(s)Summary
Type Contracts
packages/persona-kit/src/types.ts
SkillMaterializationOptions and SkillMaterializationPlan each gain an optional repoRoot?: string field to carry the repo filesystem root for resolving local skill sources.
Source Kind Registration
packages/persona-kit/src/constants.ts
SKILL_SOURCE_KINDS now includes 'local' as a recognized skill source type.
Provider Interface
packages/persona-kit/src/skills.ts
SkillProvider.buildInstallCommand now accepts an optional BuildInstallContext parameter, allowing providers to access repoRoot and other resolution context.
Local Provider Implementation
packages/persona-kit/src/skills.ts
New local provider parses .md file paths, derives installed skill names (with special handling for SKILL.md), resolves relative paths against repoRoot, generates sh -c 'mkdir && cp' shell commands, and is prepended to the provider list to take precedence.
Skill Materialization Core
packages/persona-kit/src/skills.ts
materializeSkills extracts repoRoot from options, builds a provider context, passes it into each provider's command builder, and includes repoRoot in the returned SkillMaterializationPlan; buildInstallArtifacts session mode also forwards repoRoot during artifact generation.
Router Integration
packages/workload-router/src/index.ts
usePersona and useSelection option types gain optional repoRoot?: string fields; usePersona forwards repoRoot to useSelection, which conditionally includes it in SkillMaterializationOptions.
CLI Integration
packages/cli/src/cli.ts
buildInstallContext, dry-run flow, and interactive run flow now explicitly supply repoRoot: process.cwd() to anchor local skill source resolution to the real repository.
Tests and Validation
packages/persona-kit/src/index.test.ts
Comprehensive test suite covering local skill installation, path normalization (relative/absolute), SKILL.md directory naming, repoRoot-based path absolutization, session mode behavior, regression test for prpm non-shadowing, and .md suffix validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • AgentWorkforce/relay#824: Aligns with extending materializeSkills and its CLI/router callers to support local skill source parsing and install-plan building.

Possibly related PRs

  • AgentWorkforce/workforce#78: Modifies CLI's use of materializeSkills and buildInstallContext plumbing, directly related to the repoRoot threading in this PR.
  • AgentWorkforce/workforce#74: Modifies persona-kit skill materialization surface and plan-builder/execute code paths that call materializeSkills.
  • AgentWorkforce/workforce#73: Changes persona-kit skill materialization (constants, types, skills) and router/CLI wiring, extended by this PR's local source and repoRoot work.

Poem

🐰 A local skill in every .md,
Paths resolved with perfect care,
Through repo root we safely thread,
Install commands prepared with flair!
The rabbit's feast of fixtures bright,
Makes skill materialization just right. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 40.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 nameStatusExplanation
Title check✅ PassedThe title 'persona-kit: add local skill source provider' directly and clearly summarizes the main change: adding support for local skill sources in the persona-kit package.
Description check✅ PassedThe description is well-structured and directly related to the changeset, covering the new local skill source provider feature, implementation details, motivation, and test results.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/local-skill-source

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

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@willwashburnwillwashburn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice, good call!

@khaliqgant
khaliqgant merged commit ae8be37 into mainMay 11, 2026
3 checks passed
@khaliqgant
khaliqgant deleted the feature/local-skill-source branch May 11, 2026 18:23
Sign up for freeto 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.

2 participants

@khaliqgant@willwashburn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

persona-kit: add local skill source provider - #82

Merged
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source
May 11, 2026
Merged

persona-kit: add local skill source provider#82
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

Summary

  • Adds a local skill source provider that accepts repo-relative or absolute paths to a .md SKILL file (e.g. .agentworkforce/workforce/skills/essay-authoring.md), alongside the existing prpm and skill.sh sources.
  • Threads a repoRoot option through materializeSkills, buildInstallArtifacts, useSelection, and the CLI so relative local sources can be absoluteified before the install command runs — keeps cd <installRoot> && cp <source> … working in session mode.
  • Registers the local provider first in the resolver chain. Its narrow .md-suffix test claims path-shaped sources before prpm's bare <scope>/<name> regex sees them; a coreyhaines31/marketingskills-style ref still routes to prpm, a ./skills/foo.md ref routes to local.

Motivation

Personas hosted in the same repo as their authoring patterns currently have no way to reference a sibling skill.md without first publishing it to GitHub or prpm. agentworkforce agent <persona> fails with Unsupported skill source: .agentworkforce/workforce/skills/<name>.md. Adds the missing source form so workforce-local skills don't require an extra remote-publish step.

Test plan

  • pnpm --filter @agentworkforce/persona-kit run test — 127/127 pass (8 new local-source tests).
  • pnpm --filter @agentworkforce/workload-router run test — 15/15 pass.
  • pnpm --filter @agentworkforce/cli run test — 147/147 pass.
  • pnpm -r typecheck on persona-kit + workload-router + cli — clean.
  • Manual: run agentworkforce agent <persona> against a persona declaring a local/<name> skill with a .agentworkforce/...md source and confirm the SKILL.md is installed at <installRoot>/.claude/skills/<name>/SKILL.md.

🤖 Generated with Claude Code

Accepts repo-relative or absolute paths to a `.md` SKILL file (e.g.
`.agentworkforce/workforce/skills/essay-authoring.md`) alongside the
existing prpm and skill.sh sources. The provider emits a mkdir+cp install
command targeting the harness's conventional skills dir.
A new `repoRoot` option threads through `materializeSkills`,
`buildInstallArtifacts`, `useSelection`, and the CLI so local sources can
be absoluteified before the install command runs. This is what lets
session-mode `cd <installRoot> && cp <source> …` find the file under the
user's real cwd instead of the empty stage dir.
The local provider is registered first in the resolver chain so its
narrow `.md`-suffix test claims path-shaped sources before prpm's bare
`<scope>/<name>` regex sees them. A `coreyhaines31/marketingskills`-style
ref still routes to prpm; a `./skills/foo.md` ref routes to local.
@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8d5c6308-fb2c-46fb-80df-c9969a0f5fe6

📥 Commits

Reviewing files that changed from the base of the PR and between a5e8df9 and 10d6780.

📒 Files selected for processing (6)
  • packages/cli/src/cli.ts
  • packages/persona-kit/src/constants.ts
  • packages/persona-kit/src/index.test.ts
  • packages/persona-kit/src/skills.ts
  • packages/persona-kit/src/types.ts
  • packages/workload-router/src/index.ts

📝 Walkthrough

Walkthrough

This PR extends the skill materialization system to support repository-local .md file sources by threading a new repoRoot parameter through the persona-kit, workload-router, and CLI layers, enabling local relative paths to be resolved into absolute filesystem paths within install commands.

Changes

Local Skill Source Support

Layer / File(s)Summary
Type Contracts
packages/persona-kit/src/types.ts
SkillMaterializationOptions and SkillMaterializationPlan each gain an optional repoRoot?: string field to carry the repo filesystem root for resolving local skill sources.
Source Kind Registration
packages/persona-kit/src/constants.ts
SKILL_SOURCE_KINDS now includes 'local' as a recognized skill source type.
Provider Interface
packages/persona-kit/src/skills.ts
SkillProvider.buildInstallCommand now accepts an optional BuildInstallContext parameter, allowing providers to access repoRoot and other resolution context.
Local Provider Implementation
packages/persona-kit/src/skills.ts
New local provider parses .md file paths, derives installed skill names (with special handling for SKILL.md), resolves relative paths against repoRoot, generates sh -c 'mkdir && cp' shell commands, and is prepended to the provider list to take precedence.
Skill Materialization Core
packages/persona-kit/src/skills.ts
materializeSkills extracts repoRoot from options, builds a provider context, passes it into each provider's command builder, and includes repoRoot in the returned SkillMaterializationPlan; buildInstallArtifacts session mode also forwards repoRoot during artifact generation.
Router Integration
packages/workload-router/src/index.ts
usePersona and useSelection option types gain optional repoRoot?: string fields; usePersona forwards repoRoot to useSelection, which conditionally includes it in SkillMaterializationOptions.
CLI Integration
packages/cli/src/cli.ts
buildInstallContext, dry-run flow, and interactive run flow now explicitly supply repoRoot: process.cwd() to anchor local skill source resolution to the real repository.
Tests and Validation
packages/persona-kit/src/index.test.ts
Comprehensive test suite covering local skill installation, path normalization (relative/absolute), SKILL.md directory naming, repoRoot-based path absolutization, session mode behavior, regression test for prpm non-shadowing, and .md suffix validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • AgentWorkforce/relay#824: Aligns with extending materializeSkills and its CLI/router callers to support local skill source parsing and install-plan building.

Possibly related PRs

  • AgentWorkforce/workforce#78: Modifies CLI's use of materializeSkills and buildInstallContext plumbing, directly related to the repoRoot threading in this PR.
  • AgentWorkforce/workforce#74: Modifies persona-kit skill materialization surface and plan-builder/execute code paths that call materializeSkills.
  • AgentWorkforce/workforce#73: Changes persona-kit skill materialization (constants, types, skills) and router/CLI wiring, extended by this PR's local source and repoRoot work.

Poem

🐰 A local skill in every .md,
Paths resolved with perfect care,
Through repo root we safely thread,
Install commands prepared with flair!
The rabbit's feast of fixtures bright,
Makes skill materialization just right. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 40.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 nameStatusExplanation
Title check✅ PassedThe title 'persona-kit: add local skill source provider' directly and clearly summarizes the main change: adding support for local skill sources in the persona-kit package.
Description check✅ PassedThe description is well-structured and directly related to the changeset, covering the new local skill source provider feature, implementation details, motivation, and test results.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/local-skill-source

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

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@willwashburnwillwashburn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice, good call!

@khaliqgant
khaliqgant merged commit ae8be37 into mainMay 11, 2026
3 checks passed
@khaliqgant
khaliqgant deleted the feature/local-skill-source branch May 11, 2026 18:23
Sign up for freeto 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.

2 participants

@khaliqgant@willwashburn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

persona-kit: add local skill source provider - #82

Merged
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source
May 11, 2026
Merged

persona-kit: add local skill source provider#82
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

Summary

  • Adds a local skill source provider that accepts repo-relative or absolute paths to a .md SKILL file (e.g. .agentworkforce/workforce/skills/essay-authoring.md), alongside the existing prpm and skill.sh sources.
  • Threads a repoRoot option through materializeSkills, buildInstallArtifacts, useSelection, and the CLI so relative local sources can be absoluteified before the install command runs — keeps cd <installRoot> && cp <source> … working in session mode.
  • Registers the local provider first in the resolver chain. Its narrow .md-suffix test claims path-shaped sources before prpm's bare <scope>/<name> regex sees them; a coreyhaines31/marketingskills-style ref still routes to prpm, a ./skills/foo.md ref routes to local.

Motivation

Personas hosted in the same repo as their authoring patterns currently have no way to reference a sibling skill.md without first publishing it to GitHub or prpm. agentworkforce agent <persona> fails with Unsupported skill source: .agentworkforce/workforce/skills/<name>.md. Adds the missing source form so workforce-local skills don't require an extra remote-publish step.

Test plan

  • pnpm --filter @agentworkforce/persona-kit run test — 127/127 pass (8 new local-source tests).
  • pnpm --filter @agentworkforce/workload-router run test — 15/15 pass.
  • pnpm --filter @agentworkforce/cli run test — 147/147 pass.
  • pnpm -r typecheck on persona-kit + workload-router + cli — clean.
  • Manual: run agentworkforce agent <persona> against a persona declaring a local/<name> skill with a .agentworkforce/...md source and confirm the SKILL.md is installed at <installRoot>/.claude/skills/<name>/SKILL.md.

🤖 Generated with Claude Code

Accepts repo-relative or absolute paths to a `.md` SKILL file (e.g.
`.agentworkforce/workforce/skills/essay-authoring.md`) alongside the
existing prpm and skill.sh sources. The provider emits a mkdir+cp install
command targeting the harness's conventional skills dir.
A new `repoRoot` option threads through `materializeSkills`,
`buildInstallArtifacts`, `useSelection`, and the CLI so local sources can
be absoluteified before the install command runs. This is what lets
session-mode `cd <installRoot> && cp <source> …` find the file under the
user's real cwd instead of the empty stage dir.
The local provider is registered first in the resolver chain so its
narrow `.md`-suffix test claims path-shaped sources before prpm's bare
`<scope>/<name>` regex sees them. A `coreyhaines31/marketingskills`-style
ref still routes to prpm; a `./skills/foo.md` ref routes to local.
@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8d5c6308-fb2c-46fb-80df-c9969a0f5fe6

📥 Commits

Reviewing files that changed from the base of the PR and between a5e8df9 and 10d6780.

📒 Files selected for processing (6)
  • packages/cli/src/cli.ts
  • packages/persona-kit/src/constants.ts
  • packages/persona-kit/src/index.test.ts
  • packages/persona-kit/src/skills.ts
  • packages/persona-kit/src/types.ts
  • packages/workload-router/src/index.ts

📝 Walkthrough

Walkthrough

This PR extends the skill materialization system to support repository-local .md file sources by threading a new repoRoot parameter through the persona-kit, workload-router, and CLI layers, enabling local relative paths to be resolved into absolute filesystem paths within install commands.

Changes

Local Skill Source Support

Layer / File(s)Summary
Type Contracts
packages/persona-kit/src/types.ts
SkillMaterializationOptions and SkillMaterializationPlan each gain an optional repoRoot?: string field to carry the repo filesystem root for resolving local skill sources.
Source Kind Registration
packages/persona-kit/src/constants.ts
SKILL_SOURCE_KINDS now includes 'local' as a recognized skill source type.
Provider Interface
packages/persona-kit/src/skills.ts
SkillProvider.buildInstallCommand now accepts an optional BuildInstallContext parameter, allowing providers to access repoRoot and other resolution context.
Local Provider Implementation
packages/persona-kit/src/skills.ts
New local provider parses .md file paths, derives installed skill names (with special handling for SKILL.md), resolves relative paths against repoRoot, generates sh -c 'mkdir && cp' shell commands, and is prepended to the provider list to take precedence.
Skill Materialization Core
packages/persona-kit/src/skills.ts
materializeSkills extracts repoRoot from options, builds a provider context, passes it into each provider's command builder, and includes repoRoot in the returned SkillMaterializationPlan; buildInstallArtifacts session mode also forwards repoRoot during artifact generation.
Router Integration
packages/workload-router/src/index.ts
usePersona and useSelection option types gain optional repoRoot?: string fields; usePersona forwards repoRoot to useSelection, which conditionally includes it in SkillMaterializationOptions.
CLI Integration
packages/cli/src/cli.ts
buildInstallContext, dry-run flow, and interactive run flow now explicitly supply repoRoot: process.cwd() to anchor local skill source resolution to the real repository.
Tests and Validation
packages/persona-kit/src/index.test.ts
Comprehensive test suite covering local skill installation, path normalization (relative/absolute), SKILL.md directory naming, repoRoot-based path absolutization, session mode behavior, regression test for prpm non-shadowing, and .md suffix validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • AgentWorkforce/relay#824: Aligns with extending materializeSkills and its CLI/router callers to support local skill source parsing and install-plan building.

Possibly related PRs

  • AgentWorkforce/workforce#78: Modifies CLI's use of materializeSkills and buildInstallContext plumbing, directly related to the repoRoot threading in this PR.
  • AgentWorkforce/workforce#74: Modifies persona-kit skill materialization surface and plan-builder/execute code paths that call materializeSkills.
  • AgentWorkforce/workforce#73: Changes persona-kit skill materialization (constants, types, skills) and router/CLI wiring, extended by this PR's local source and repoRoot work.

Poem

🐰 A local skill in every .md,
Paths resolved with perfect care,
Through repo root we safely thread,
Install commands prepared with flair!
The rabbit's feast of fixtures bright,
Makes skill materialization just right. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 40.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 nameStatusExplanation
Title check✅ PassedThe title 'persona-kit: add local skill source provider' directly and clearly summarizes the main change: adding support for local skill sources in the persona-kit package.
Description check✅ PassedThe description is well-structured and directly related to the changeset, covering the new local skill source provider feature, implementation details, motivation, and test results.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/local-skill-source

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

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@willwashburnwillwashburn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice, good call!

@khaliqgant
khaliqgant merged commit ae8be37 into mainMay 11, 2026
3 checks passed
@khaliqgant
khaliqgant deleted the feature/local-skill-source branch May 11, 2026 18:23
Sign up for freeto 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.

2 participants

@khaliqgant@willwashburn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

persona-kit: add local skill source provider - #82

Merged
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source
May 11, 2026
Merged

persona-kit: add local skill source provider#82
khaliqgant merged 1 commit into
mainfrom
feature/local-skill-source

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

Summary

  • Adds a local skill source provider that accepts repo-relative or absolute paths to a .md SKILL file (e.g. .agentworkforce/workforce/skills/essay-authoring.md), alongside the existing prpm and skill.sh sources.
  • Threads a repoRoot option through materializeSkills, buildInstallArtifacts, useSelection, and the CLI so relative local sources can be absoluteified before the install command runs — keeps cd <installRoot> && cp <source> … working in session mode.
  • Registers the local provider first in the resolver chain. Its narrow .md-suffix test claims path-shaped sources before prpm's bare <scope>/<name> regex sees them; a coreyhaines31/marketingskills-style ref still routes to prpm, a ./skills/foo.md ref routes to local.

Motivation

Personas hosted in the same repo as their authoring patterns currently have no way to reference a sibling skill.md without first publishing it to GitHub or prpm. agentworkforce agent <persona> fails with Unsupported skill source: .agentworkforce/workforce/skills/<name>.md. Adds the missing source form so workforce-local skills don't require an extra remote-publish step.

Test plan

  • pnpm --filter @agentworkforce/persona-kit run test — 127/127 pass (8 new local-source tests).
  • pnpm --filter @agentworkforce/workload-router run test — 15/15 pass.
  • pnpm --filter @agentworkforce/cli run test — 147/147 pass.
  • pnpm -r typecheck on persona-kit + workload-router + cli — clean.
  • Manual: run agentworkforce agent <persona> against a persona declaring a local/<name> skill with a .agentworkforce/...md source and confirm the SKILL.md is installed at <installRoot>/.claude/skills/<name>/SKILL.md.

🤖 Generated with Claude Code

Accepts repo-relative or absolute paths to a `.md` SKILL file (e.g.
`.agentworkforce/workforce/skills/essay-authoring.md`) alongside the
existing prpm and skill.sh sources. The provider emits a mkdir+cp install
command targeting the harness's conventional skills dir.
A new `repoRoot` option threads through `materializeSkills`,
`buildInstallArtifacts`, `useSelection`, and the CLI so local sources can
be absoluteified before the install command runs. This is what lets
session-mode `cd <installRoot> && cp <source> …` find the file under the
user's real cwd instead of the empty stage dir.
The local provider is registered first in the resolver chain so its
narrow `.md`-suffix test claims path-shaped sources before prpm's bare
`<scope>/<name>` regex sees them. A `coreyhaines31/marketingskills`-style
ref still routes to prpm; a `./skills/foo.md` ref routes to local.
@coderabbitai

coderabbitaiBot commented May 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8d5c6308-fb2c-46fb-80df-c9969a0f5fe6

📥 Commits

Reviewing files that changed from the base of the PR and between a5e8df9 and 10d6780.

📒 Files selected for processing (6)
  • packages/cli/src/cli.ts
  • packages/persona-kit/src/constants.ts
  • packages/persona-kit/src/index.test.ts
  • packages/persona-kit/src/skills.ts
  • packages/persona-kit/src/types.ts
  • packages/workload-router/src/index.ts

📝 Walkthrough

Walkthrough

This PR extends the skill materialization system to support repository-local .md file sources by threading a new repoRoot parameter through the persona-kit, workload-router, and CLI layers, enabling local relative paths to be resolved into absolute filesystem paths within install commands.

Changes

Local Skill Source Support

Layer / File(s)Summary
Type Contracts
packages/persona-kit/src/types.ts
SkillMaterializationOptions and SkillMaterializationPlan each gain an optional repoRoot?: string field to carry the repo filesystem root for resolving local skill sources.
Source Kind Registration
packages/persona-kit/src/constants.ts
SKILL_SOURCE_KINDS now includes 'local' as a recognized skill source type.
Provider Interface
packages/persona-kit/src/skills.ts
SkillProvider.buildInstallCommand now accepts an optional BuildInstallContext parameter, allowing providers to access repoRoot and other resolution context.
Local Provider Implementation
packages/persona-kit/src/skills.ts
New local provider parses .md file paths, derives installed skill names (with special handling for SKILL.md), resolves relative paths against repoRoot, generates sh -c 'mkdir && cp' shell commands, and is prepended to the provider list to take precedence.
Skill Materialization Core
packages/persona-kit/src/skills.ts
materializeSkills extracts repoRoot from options, builds a provider context, passes it into each provider's command builder, and includes repoRoot in the returned SkillMaterializationPlan; buildInstallArtifacts session mode also forwards repoRoot during artifact generation.
Router Integration
packages/workload-router/src/index.ts
usePersona and useSelection option types gain optional repoRoot?: string fields; usePersona forwards repoRoot to useSelection, which conditionally includes it in SkillMaterializationOptions.
CLI Integration
packages/cli/src/cli.ts
buildInstallContext, dry-run flow, and interactive run flow now explicitly supply repoRoot: process.cwd() to anchor local skill source resolution to the real repository.
Tests and Validation
packages/persona-kit/src/index.test.ts
Comprehensive test suite covering local skill installation, path normalization (relative/absolute), SKILL.md directory naming, repoRoot-based path absolutization, session mode behavior, regression test for prpm non-shadowing, and .md suffix validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • AgentWorkforce/relay#824: Aligns with extending materializeSkills and its CLI/router callers to support local skill source parsing and install-plan building.

Possibly related PRs

  • AgentWorkforce/workforce#78: Modifies CLI's use of materializeSkills and buildInstallContext plumbing, directly related to the repoRoot threading in this PR.
  • AgentWorkforce/workforce#74: Modifies persona-kit skill materialization surface and plan-builder/execute code paths that call materializeSkills.
  • AgentWorkforce/workforce#73: Changes persona-kit skill materialization (constants, types, skills) and router/CLI wiring, extended by this PR's local source and repoRoot work.

Poem

🐰 A local skill in every .md,
Paths resolved with perfect care,
Through repo root we safely thread,
Install commands prepared with flair!
The rabbit's feast of fixtures bright,
Makes skill materialization just right. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 40.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 nameStatusExplanation
Title check✅ PassedThe title 'persona-kit: add local skill source provider' directly and clearly summarizes the main change: adding support for local skill sources in the persona-kit package.
Description check✅ PassedThe description is well-structured and directly related to the changeset, covering the new local skill source provider feature, implementation details, motivation, and test results.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/local-skill-source

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

@devin-ai-integrationdevin-ai-integrationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@willwashburnwillwashburn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nice, good call!

@khaliqgant
khaliqgant merged commit ae8be37 into mainMay 11, 2026
3 checks passed
@khaliqgant
khaliqgant deleted the feature/local-skill-source branch May 11, 2026 18:23
Sign up for freeto 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.

2 participants

@khaliqgant@willwashburn