diff --git a/README.md b/README.md index 662a07e..6c3e969 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,8 @@ into platform-specific packages that can be inspected before they are installed. or deleting them. - Dry-run support (no writes, no backups, no plugin changes) and timestamped, per-run backup directories. - Shared safety, notification, validation, and status-line hooks. -- User-level plugin installation for Ponytail, i-have-adhd, Superpowers, and Context7; updates only with +- User-level plugin installation for Ponytail, i-have-adhd, Superpowers, Context7, Caveman, Humanizer, Impeccable, + and Anthropic Frontend Design; updates only with `-UpdatePlugins`/`--update-plugins`. ## Architecture diff --git a/adapters/plugins.tsv b/adapters/plugins.tsv index 6003c55..1449ee5 100644 --- a/adapters/plugins.tsv +++ b/adapters/plugins.tsv @@ -1,5 +1,9 @@ -name claude_marketplace claude_plugin codex_marketplace codex_plugin -Ponytail DietrichGebert/ponytail ponytail@ponytail DietrichGebert/ponytail ponytail@ponytail -i-have-adhd ayghri/i-have-adhd i-have-adhd@i-have-adhd ayghri/i-have-adhd i-have-adhd@i-have-adhd -Superpowers - superpowers@claude-plugins-official openai-curated-remote superpowers@openai-curated-remote -Context7 upstash/context7 context7@context7-marketplace upstash/context7 context7@context7-marketplace +name claude_marketplace claude_plugin codex_marketplace codex_plugin codex_method codex_source codex_skill +Ponytail DietrichGebert/ponytail ponytail@ponytail DietrichGebert/ponytail ponytail@ponytail plugin - - +i-have-adhd ayghri/i-have-adhd i-have-adhd@i-have-adhd ayghri/i-have-adhd i-have-adhd@i-have-adhd plugin - - +Superpowers - superpowers@claude-plugins-official openai-curated-remote superpowers@openai-curated-remote plugin - - +Context7 upstash/context7 context7@context7-marketplace upstash/context7 context7@context7-marketplace plugin - - +Caveman JuliusBrussee/caveman caveman@caveman thinkhome-org/caveman-codex caveman@thinkhome-caveman plugin - - +Humanizer blader/humanizer humanizer@humanizer - - skill blader/humanizer - +Impeccable pbakaus/impeccable impeccable@impeccable - - impeccable - - +Anthropic Frontend Design anthropics/claude-plugins-official frontend-design@claude-plugins-official - - skill anthropics/skills frontend-design diff --git a/docs/plugins.md b/docs/plugins.md index 32ffeac..5d84d3d 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2,7 +2,9 @@ The user-level plugin manifest is `adapters/plugins.tsv`. It maps each logical plugin to the marketplace selector understood by Claude Code and Codex. -The current baseline includes Ponytail, i-have-adhd, Superpowers, and Context7. The install script operates at user scope and is idempotent: a normal run only installs missing plugins (a disabled but already-installed Claude plugin is re-enabled). Pass `-UpdatePlugins`/`--update-plugins` to also update plugins that are already installed, so a configuration update never silently updates third-party plugin code. +The current baseline includes Ponytail, i-have-adhd, Superpowers, Context7, Caveman, Humanizer, Impeccable, and Anthropic Frontend Design. The install script operates at user scope and is idempotent: a normal run only installs missing plugins (a disabled but already-installed Claude plugin is re-enabled). Pass `-UpdatePlugins`/`--update-plugins` to also update plugins that are already installed, so a configuration update never silently updates third-party plugin code. + +Codex receives Caveman through its native plugin adapter. Humanizer and Anthropic Frontend Design are installed through the cross-agent Skills CLI; Impeccable uses its provider-aware Codex installer. All four are therefore available to both clients, although Codex does not expose all four as marketplace plugins. Plugin installation requires the corresponding client CLI, network access, and any authentication required by the plugin. Context7 may open an OAuth flow. Codex or plugin hooks may require a trust review in `/hooks`. The scripts never install plugins during a build or doctor run and never install them when `--dry-run` or `-DryRun` is used. diff --git a/scripts/lib/plugins.ps1 b/scripts/lib/plugins.ps1 index 22a92b9..b34f2b7 100644 --- a/scripts/lib/plugins.ps1 +++ b/scripts/lib/plugins.ps1 @@ -85,6 +85,20 @@ function Install-ConfiguredPlugins { $plugin = if ($selectedClient -eq 'Claude') { $entry.claude_plugin } else { $entry.codex_plugin } if ([string]::IsNullOrWhiteSpace($plugin)) { throw ('Plugin selector missing for {0}: {1}' -f $selectedClient, $entry.name) } + if ($selectedClient -eq 'Codex' -and $entry.codex_method -ne 'plugin') { + if ($entry.codex_method -eq 'skill') { + $arguments = @('-y','skills','add',$entry.codex_source,'--global','--agent','codex') + if ($entry.codex_skill -ne '-') { $arguments = @('-y','skills','add',$entry.codex_source,'--skill',$entry.codex_skill,'--global','--agent','codex') } + } elseif ($entry.codex_method -eq 'impeccable') { + $arguments = @('-y','impeccable','install','-y','--providers=codex','--scope=global') + } else { + throw "Unknown Codex install method '$($entry.codex_method)' for $($entry.name)." + } + Invoke-PluginCommand -Command 'npx' -Arguments $arguments -DryRun:$DryRun + Write-Output "PASS Codex skill ensured: $($entry.name)" + continue + } + $installedItem = if ($selectedClient -eq 'Claude') { $installed | Where-Object { $_.id -eq $plugin } | Select-Object -First 1 } else { $installed | Where-Object { $_.pluginId -eq $plugin } | Select-Object -First 1 } if ($Update -and $selectedClient -eq 'Claude' -and $null -ne $installedItem) { Invoke-PluginCommand -Command 'claude' -Arguments @('plugin','update',$plugin) -DryRun:$DryRun diff --git a/scripts/lib/plugins.sh b/scripts/lib/plugins.sh index 10f1da0..b398d0d 100755 --- a/scripts/lib/plugins.sh +++ b/scripts/lib/plugins.sh @@ -53,8 +53,8 @@ install_configured_plugins() { *) printf 'Unknown plugin client selection: %s\n' "$client_selection" >&2; return 1;; esac - local client name claude_marketplace claude_plugin codex_marketplace codex_plugin marketplace plugin - while IFS=$'\t' read -r name claude_marketplace claude_plugin codex_marketplace codex_plugin; do + local client name claude_marketplace claude_plugin codex_marketplace codex_plugin codex_method codex_source codex_skill marketplace plugin + while IFS=$'\t' read -r name claude_marketplace claude_plugin codex_marketplace codex_plugin codex_method codex_source codex_skill; do [ "$name" = name ] && continue [ -n "$name" ] || continue [ "$claude_marketplace" = - ] && claude_marketplace= @@ -62,6 +62,23 @@ install_configured_plugins() { for client in "${clients[@]}"; do if [ "$client" = claude ]; then marketplace=$claude_marketplace; plugin=$claude_plugin; else marketplace=$codex_marketplace; plugin=$codex_plugin; fi [ -n "$plugin" ] || { printf 'Plugin selector missing for %s: %s\n' "$client" "$name" >&2; return 1; } + if [ "$client" = codex ] && [ "$codex_method" != plugin ]; then + case "$codex_method" in + skill) + if [ "$codex_skill" = - ]; then + run_plugin_command "$dry_run" npx -y skills add "$codex_source" --global --agent codex + else + run_plugin_command "$dry_run" npx -y skills add "$codex_source" --skill "$codex_skill" --global --agent codex + fi + ;; + impeccable) + run_plugin_command "$dry_run" npx -y impeccable install -y --providers=codex --scope=global + ;; + *) printf 'Unknown Codex install method for %s: %s\n' "$client" "$name" >&2; return 1;; + esac + printf 'PASS Codex skill ensured: %s\n' "$name" + continue + fi if [ "$dry_run" = false ] && plugin_installed "$client" "$plugin"; then if [ "$update" = true ] && [ "$client" = claude ]; then run_plugin_command "$dry_run" claude plugin update "$plugin"