Title: Artificial Intelligence Workflow Tools
Version: 0.0.1
Description: Manage skills for large language model coding agents. Supports installing skills from 'GitHub' or local directories, tracking versions in a lock file, and keeping installations current. Installations can be scoped to a single project or shared globally across projects.
URL: https://christophertkenny.com/wf/, https://github.com/christopherkenny/wf
BugReports: https://github.com/christopherkenny/wf/issues
Depends: R (≥ 4.1.0)
License: MIT + file LICENSE
Encoding: UTF-8
RoxygenNote: 7.3.3
Imports: cli (≥ 3.6.0), fs, gh, jsonlite, rlang (≥ 1.1.0), yaml
Suggests: testthat (≥ 3.0.0), withr
Config/testthat/edition: 3
NeedsCompilation: no
Packaged: 2026-03-15 22:39:56 UTC; chris
Author: Christopher T. Kenny ORCID iD [aut, cre]
Maintainer: Christopher T. Kenny <ctkenny@proton.me>
Repository: CRAN
Date/Publication: 2026-03-19 14:40:02 UTC

wf: Artificial Intelligence Workflow Tools

Description

logo

Manage skills for large language model coding agents. Supports installing skills from 'GitHub' or local directories, tracking versions in a lock file, and keeping installations current. Installations can be scoped to a single project or shared globally across projects.

Author(s)

Maintainer: Christopher T. Kenny ctkenny@proton.me (ORCID)

See Also

Useful links:


Install a skill

Description

Installs a skill from a GitHub repository or a local directory into a skills directory.

Usage

add_skill(source, skill = NULL, path = NULL, overwrite = FALSE)

Arguments

source

One of:

  • A GitHub URL pointing to a repo, e.g. "https://github.com/owner/repo".

  • A GitHub URL pointing to a subdirectory, e.g. "https://github.com/owner/repo/tree/main/path/to/skill".

  • A GitHub shorthand, e.g. "owner/repo".

  • A local directory path containing a SKILL.md file.

skill

For multi-skill repositories that store skills under a ⁠skills/⁠ subdirectory, the name of the skill to install, e.g. skill = "proofread". When supplied, the skill is read from ⁠skills/<skill>⁠ within the repository. Ignored when source already points to a specific subdirectory via ⁠/tree/...⁠.

path

The skills directory to install into. Can be one of:

  • A known agent name such as "claude_code", "cursor", or "github_copilot" (see skill_path() for the full list) to use that agent's conventional project-scope path.

  • A character string giving the directory path directly.

  • NULL (the default), in which case the path is resolved from the WF_AGENT environment variable, or by prompting in interactive sessions. Set WF_AGENT in your .Renviron (e.g. with usethis::edit_r_environ()) to avoid the prompt.

overwrite

If FALSE (the default), an error is raised if the skill is already installed. Set to TRUE to replace it.

Value

The path to the installed skill directory, invisibly.

Examples

src <- tempfile()
dir.create(src)
writeLines(
  c('---', 'name: example', 'description: An example skill.', '---'),
  file.path(src, 'SKILL.md')
)
add_skill(src, path = tempfile())

Check installed skills for available updates

Description

Compares each installed skill's recorded commit SHA against the latest commit on GitHub. Local skills are reported as not updatable.

Usage

check_skills(path = NULL)

Arguments

path

The skills directory to check. Can be one of:

  • A known agent name such as "claude_code", "cursor", or "github_copilot" (see skill_path() for the full list) to use that agent's conventional project-scope path.

  • A character string giving the directory path directly.

  • NULL (the default), in which case the path is resolved from the WF_AGENT environment variable, or by prompting in interactive sessions. Set WF_AGENT in your .Renviron (e.g. with usethis::edit_r_environ()) to avoid the prompt.

Value

A data frame with columns:

Examples

check_skills(tempfile())

Search for skills on GitHub

Description

Searches GitHub for repositories tagged with a skill topic and matching a keyword query. Searches across all supported agent topic conventions (e.g. claude-skill, cursor-skill).

Usage

find_skill(query)

Arguments

query

Keyword to search for.

Value

A data frame with columns:

Examples



  find_skill('rstats')



Create a new skill template

Description

Creates a new skill directory at ⁠path/name/⁠ containing a template SKILL.md file ready to be filled in.

Usage

init_skill(name, path = NULL)

Arguments

name

Skill name. Must be 1-64 characters, lowercase alphanumeric with single hyphens (no consecutive ⁠--⁠), and cannot start or end with a hyphen. Consider using a gerund form (e.g. "parsing-logs").

path

Directory in which to create the skill. The skill directory itself will be path/name. Can be one of:

  • A known agent name such as "claude_code" or "github_copilot" to use that agent's conventional project-scope path (see skill_path() for the full list).

  • A character string giving the directory path directly.

  • NULL (the default), in which case the path is resolved from the WF_AGENT environment variable, or by prompting in interactive sessions. Set WF_AGENT in your .Renviron (e.g. with usethis::edit_r_environ()) to avoid the prompt.

Value

The path to the new skill directory, invisibly.

Examples

init_skill('my-skill', tempfile())

List installed skills

Description

Returns a data frame describing all skills installed in a skills directory.

Usage

list_skills(path = NULL)

Arguments

path

The skills directory to inspect. Can be one of:

  • A known agent name such as "claude_code", "cursor", or "github_copilot" (see skill_path() for the full list) to use that agent's conventional project-scope path.

  • A character string giving the directory path directly.

  • NULL (the default), in which case the path is resolved from the WF_AGENT environment variable, or by prompting in interactive sessions. Set WF_AGENT in your .Renviron (e.g. with usethis::edit_r_environ()) to avoid the prompt.

Value

A data frame with columns:

Examples

list_skills(tempfile())

Remove an installed skill

Description

Deletes a skill directory from a skills directory and removes it from the lock file.

Usage

remove_skill(name, path = NULL, force = FALSE)

Arguments

name

The name of the skill to remove.

path

The skills directory where the skill is installed. Can be one of:

  • A known agent name such as "claude_code", "cursor", or "github_copilot" (see skill_path() for the full list) to use that agent's conventional project-scope path.

  • A character string giving the directory path directly.

  • NULL (the default), in which case the path is resolved from the WF_AGENT environment variable, or by prompting in interactive sessions. Set WF_AGENT in your .Renviron (e.g. with usethis::edit_r_environ()) to avoid the prompt.

force

If FALSE (the default), prompts for confirmation in interactive sessions. Set to TRUE to skip the prompt.

Value

The name of the removed skill, invisibly.

Examples

src <- tempfile()
dir.create(src)
writeLines(
  c('---', 'name: example', 'description: An example skill.', '---'),
  file.path(src, 'SKILL.md')
)
tmp <- tempfile()
add_skill(src, path = tmp)
remove_skill('example', tmp, force = TRUE)

Get the conventional skill path for an agent

Description

Returns the conventional directory path where skills for a given agent are stored. The path is not expanded (i.e., ~ is not resolved to the home directory). Use fs::path_expand() if you need an absolute path.

Usage

skill_path(agent = NULL, scope = c("project", "global"))

Arguments

agent

One of "claude_code" (or its alias "claude"), "openclaw", "codex", "cursor", "gemini_cli", "github_copilot" (or its alias "copilot"), or "posit_ai" (or its alias "posit"). If NULL (the default), the agent is resolved in order: (1) the WF_AGENT environment variable, (2) a scan of the current working directory for a recognised agent config folder (.claude, .cursor, etc.), and (3) a final fallback to "claude_code". Set WF_AGENT in your .Renviron (e.g. with usethis::edit_r_environ()) to avoid passing agent every time.

scope

One of "project" (a path relative to the current working directory, suitable for committing to version control) or "global" (a path in the user's home directory, available across all projects).

Value

A length-1 character vector giving the conventional skill path.

Examples

skill_path('claude_code', 'project')
skill_path('claude', 'project') # alias for claude_code
skill_path('github_copilot', 'project')
skill_path('copilot', 'project') # alias for github_copilot
skill_path('posit_ai', 'project')
skill_path('posit', 'project') # alias for posit_ai
skill_path('cursor', 'global')
skill_path() # auto-detects from WF_AGENT, dir scan, or falls back to claude_code

Update installed skills

Description

Checks each installed skill for available updates and re-installs any that have a newer version on GitHub.

Usage

update_skills(path = NULL)

Arguments

path

The skills directory to update. Can be one of:

  • A known agent name such as "claude_code", "cursor", or "github_copilot" (see skill_path() for the full list) to use that agent's conventional project-scope path.

  • A character string giving the directory path directly.

  • NULL (the default), in which case the path is resolved from the WF_AGENT environment variable, or by prompting in interactive sessions. Set WF_AGENT in your .Renviron (e.g. with usethis::edit_r_environ()) to avoid the prompt.

Value

A character vector of updated skill names, invisibly.

Examples

update_skills(tempfile())