Files
getcargohq__cargo-skills/.codex-plugin/plugin.json
T

17 lines
786 B
JSON
Raw Normal View History

Fan the plugin out to Codex and Cursor; bundle session-lifecycle hooks (#50) * Fan the plugin out to Codex and Cursor; bundle session-lifecycle hooks - One plugin source, three targets: .agents/plugins/marketplace.json (Codex) + .cursor-plugin/marketplace.json, with .codex-plugin/ and .cursor-plugin/ plugin manifests version-locked to the router (linter-enforced across all three, negative-tested). The approval hook is wired per target - PreToolUse (Claude Code), PermissionRequest via hooks/codex-hooks.json (Codex), beforeShellExecution via hooks/cursor-hooks.json (Cursor) - reusing approve-cli.sh's existing per-agent verdict dispatch. - Plugin-bundled lifecycle hooks (Claude Code): session-start (pinned CLI refresh from the plugin's own cli-version + placeholder session row; deliberately no skills add - the plugin owns the skills), session-checkpoint (Stop; jq-derived title, 45s throttle), and session-end (sync finalize + detached claude -p refinement). Each defers when the installer's counterpart exists at ~/.claude/hooks/, so installer + plugin never double-register a session. - .gitignore: un-ignore .agents/plugins/ (vendored skills stay ignored). - README: per-target install steps; router 1.11.0, plugins 1.11.0. Verified: lint 0/0; scripts behavior-tested with stubbed npm/cargo-ai (pin read from plugin root, defer guards, checkpoint derivation + throttle, --finished finalize); live plugin install on Claude Code 2.1.205 shows all four hook events and both extra manifests in the 1.11.0 cache. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Make the plugin the single source of truth; agent-portable docs - session-start.sh now also refreshes the plugin itself (marketplace update + plugin update, detached, effective next session) - the plugin channel's replacement for the installer's skills-add refresh, with zero duplication by construction. - Docs made agent-portable: the pinned-install command in cargo/SKILL.md and prerequisites.md reads cli-version from the skill directory the agent loaded instead of hardcoding ~/.claude/skills/ (which silently degraded Codex/Cursor to @latest); manual-path session titles are agent-neutral; job 1 says to skip skills add when skills came from a plugin; the permission-prompts note covers all three agents' events. - README Claude Code section describes the refactored installer flow (installs the plugin; skills add only as fallback; legacy scaffolding migrated away). cargo 1.12.0, plugins 1.12.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Single-source the lifecycle scripts: dual-mode plugin/standalone The three hooks/session-*.sh scripts are now the only copies of the session lifecycle - the installer's fallback channel downloads them instead of embedding heredocs. Mode auto-detects from location (~/.claude/hooks/ = standalone; anywhere else = plugin) with an explicit plugin|standalone arg override: - standalone: skills add refresh, pin from ~/.claude/skills/cargo/, no plugin self-update, never defers. - plugin: pin from plugin root, detached plugin self-update, no skills add, defers when a standalone copy exists (exactly one lifecycle runs). Log lines carry the mode. Behavior-tested both modes of all three scripts with stubbed npm/npx/cargo-ai/claude (mode detection, defer, no-self-defer, per-mode pin paths, per-mode refresh, mode-aware logs). cargo 1.13.0, plugins 1.13.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(lifecycle): registration-aware defer, wider PATH, checkpoint hygiene Review feedback on the lifecycle scripts: - Defer guard now requires the standalone copy to be REGISTERED in ~/.claude/settings.json, not merely present - an unregistered leftover file no longer suppresses the plugin copy (which would silently skip CLI pinning and session logging). Falls back to file existence when jq is unavailable. - session-start's PATH widening for the detached plugin self-update now matches session-end's full list (Volta, asdf shims, nvm version dirs, /opt/node*) so `claude` resolves under version managers and the update isn't silently skipped. - Checkpoint prompt snippets strip control characters. The reported command-substitution injection does not exist - shell assignments and quoted expansions never evaluate a value's content, and the upsert passes --title/--summary as single argv words (verified empirically: $(touch ...) and backticks pass through as literal data) - but control chars could mangle logs/rows, so they are removed and the inertness is documented in a comment for future reviewers. Verified: unregistered leftover -> plugin runs; registered standalone -> plugin defers; clean env -> runs; injection payload inert with ESC sequences stripped from the stored title. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(lifecycle): run when standalone registration is unverifiable Review follow-up: the defer guard's no-jq / no-settings.json fallback returned "owned" (defer), which silently skipped CLI pinning and session logging whenever registration couldn't be checked - exactly the failure the registration-awareness was meant to prevent. Flipped: when jq or settings.json is unavailable, default to NOT owned so the plugin copy runs. Safe direction - the session upsert is idempotent, so a duplicate with an active standalone is harmless, whereas a wrong defer is a silent skip. Unit-tested all five branches (registered->defer; not-registered, no-settings, no-jq, no-file->run). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 18:33:21 -07:00
{
"name": "cargo",
"description": "Build with Cargo in Codex — 19 skills over the cargo-ai CLI, plus the hosted MCP server (target lists, contact enrichment and verification from licensed data providers, lead scoring, CRM sync, signal monitoring, orchestration, storage, segments, CDK, diagnostics) plus prompt-free approval for safe cargo-ai calls.",
Rename cargo-cdk to cargo-project, following the CLI's `project` group (#128) * Rename cargo-cdk to cargo-project, following the CLI's `project` group @cargo-ai/cli renamed `cargo-ai cdk` to `cargo-ai project` and kept `cdk` as an alias. The skill directory, its name, every cross-link, and every command example now say project. The @cargo-ai/cdk package, its imports, `npx @cargo-ai/cdk`, cargo.state.json and the define* builders are unchanged. - hooks/approve-cli.sh gates `project deploy` and `project destroy` next to the cdk pairs; without them the renamed deploy auto-approved. - skills-lint knows `project` as a CLI domain. - The "deploy from CI" trigger becomes "deploy the workspace from CI". The CI routing case was a tie on main, won only because cargo-cdk sorted before cargo-hosting; cargo-project sorts after it. - No redirect stub at the old name. - cargo-project 2.0.0; patch bumps for the eight skills that link to it, and the plugin manifests follow the router to 1.25.1. Needs the CLI release that ships the project group, with cargo/cli-version bumped to it, before merge. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KRC3ERvnznXTw3WFLWrPaS * Keep cargo-cdk as a redirect to cargo-project `npx skills add` never deletes an installed skill that vanished upstream, and `skills update` skips the deletion non-interactively. A plain rename left every existing install with a frozen cargo-cdk routing next to cargo-project. cargo-cdk/SKILL.md is now a pointer (2.0.0), so the next refresh overwrites the stale copy, and a CLI that still hands off to cargo-cdk lands on it. Checked by installing main and then this branch into a throwaway HOME. It is marked `metadata.redirect: cargo-project`. skill-redirects.mjs lets lint (count, router check), the routing eval, llms.txt and the Codex package skip it; lint still lints the file and requires the target to be a skill. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KRC3ERvnznXTw3WFLWrPaS --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-13 23:25:31 -07:00
"version": "1.25.1",
Fan the plugin out to Codex and Cursor; bundle session-lifecycle hooks (#50) * Fan the plugin out to Codex and Cursor; bundle session-lifecycle hooks - One plugin source, three targets: .agents/plugins/marketplace.json (Codex) + .cursor-plugin/marketplace.json, with .codex-plugin/ and .cursor-plugin/ plugin manifests version-locked to the router (linter-enforced across all three, negative-tested). The approval hook is wired per target - PreToolUse (Claude Code), PermissionRequest via hooks/codex-hooks.json (Codex), beforeShellExecution via hooks/cursor-hooks.json (Cursor) - reusing approve-cli.sh's existing per-agent verdict dispatch. - Plugin-bundled lifecycle hooks (Claude Code): session-start (pinned CLI refresh from the plugin's own cli-version + placeholder session row; deliberately no skills add - the plugin owns the skills), session-checkpoint (Stop; jq-derived title, 45s throttle), and session-end (sync finalize + detached claude -p refinement). Each defers when the installer's counterpart exists at ~/.claude/hooks/, so installer + plugin never double-register a session. - .gitignore: un-ignore .agents/plugins/ (vendored skills stay ignored). - README: per-target install steps; router 1.11.0, plugins 1.11.0. Verified: lint 0/0; scripts behavior-tested with stubbed npm/cargo-ai (pin read from plugin root, defer guards, checkpoint derivation + throttle, --finished finalize); live plugin install on Claude Code 2.1.205 shows all four hook events and both extra manifests in the 1.11.0 cache. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Make the plugin the single source of truth; agent-portable docs - session-start.sh now also refreshes the plugin itself (marketplace update + plugin update, detached, effective next session) - the plugin channel's replacement for the installer's skills-add refresh, with zero duplication by construction. - Docs made agent-portable: the pinned-install command in cargo/SKILL.md and prerequisites.md reads cli-version from the skill directory the agent loaded instead of hardcoding ~/.claude/skills/ (which silently degraded Codex/Cursor to @latest); manual-path session titles are agent-neutral; job 1 says to skip skills add when skills came from a plugin; the permission-prompts note covers all three agents' events. - README Claude Code section describes the refactored installer flow (installs the plugin; skills add only as fallback; legacy scaffolding migrated away). cargo 1.12.0, plugins 1.12.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Single-source the lifecycle scripts: dual-mode plugin/standalone The three hooks/session-*.sh scripts are now the only copies of the session lifecycle - the installer's fallback channel downloads them instead of embedding heredocs. Mode auto-detects from location (~/.claude/hooks/ = standalone; anywhere else = plugin) with an explicit plugin|standalone arg override: - standalone: skills add refresh, pin from ~/.claude/skills/cargo/, no plugin self-update, never defers. - plugin: pin from plugin root, detached plugin self-update, no skills add, defers when a standalone copy exists (exactly one lifecycle runs). Log lines carry the mode. Behavior-tested both modes of all three scripts with stubbed npm/npx/cargo-ai/claude (mode detection, defer, no-self-defer, per-mode pin paths, per-mode refresh, mode-aware logs). cargo 1.13.0, plugins 1.13.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(lifecycle): registration-aware defer, wider PATH, checkpoint hygiene Review feedback on the lifecycle scripts: - Defer guard now requires the standalone copy to be REGISTERED in ~/.claude/settings.json, not merely present - an unregistered leftover file no longer suppresses the plugin copy (which would silently skip CLI pinning and session logging). Falls back to file existence when jq is unavailable. - session-start's PATH widening for the detached plugin self-update now matches session-end's full list (Volta, asdf shims, nvm version dirs, /opt/node*) so `claude` resolves under version managers and the update isn't silently skipped. - Checkpoint prompt snippets strip control characters. The reported command-substitution injection does not exist - shell assignments and quoted expansions never evaluate a value's content, and the upsert passes --title/--summary as single argv words (verified empirically: $(touch ...) and backticks pass through as literal data) - but control chars could mangle logs/rows, so they are removed and the inertness is documented in a comment for future reviewers. Verified: unregistered leftover -> plugin runs; registered standalone -> plugin defers; clean env -> runs; injection payload inert with ESC sequences stripped from the stored title. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(lifecycle): run when standalone registration is unverifiable Review follow-up: the defer guard's no-jq / no-settings.json fallback returned "owned" (defer), which silently skipped CLI pinning and session logging whenever registration couldn't be checked - exactly the failure the registration-awareness was meant to prevent. Flipped: when jq or settings.json is unavailable, default to NOT owned so the plugin copy runs. Safe direction - the session upsert is idempotent, so a duplicate with an active standalone is harmless, whereas a wrong defer is a silent skip. Unit-tested all five branches (registered->defer; not-registered, no-settings, no-jq, no-file->run). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 18:33:21 -07:00
"author": { "name": "getcargo" },
"homepage": "https://github.com/getcargohq/cargo-skills",
CI: run the HOL AI plugin scanner (#102) * CI: run the HOL AI plugin scanner hashgraph-online/awesome-ai-plugins requires every listed plugin's source repo to invoke `ai-plugin-scanner-action` on push/pull_request before the listing PR can merge (getcargohq/cargo-skills#83 → their PR #72). Pinned to a full commit SHA instead of the floating `v1` tag, with a read-only token and no secrets in scope, so a third-party action in our workflow surface can't reach anything it shouldn't. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * CI: publish the scanner report when the scan fails The action's built-in summary step is `if: success()`, so a failing scan prints counts and no findings. Render markdown to a file and cat it into the step summary unconditionally. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * CI: tee the scanner report to the job log as well Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * CI: clear the plugin scanner's 80-point / no-high gate The scanner job this PR added failed on its first run: 71/100 against a `min_score` of 80, one critical finding and one high. The awesome-ai-plugins contribution gate re-scans this repo with the same two thresholds, so the findings had to be fixed rather than configured around. Now 92/100 (A), zero critical, zero high. - Pin every `uses:` in .github/workflows/ to a full commit SHA, and add .github/dependabot.yml so the pins move weekly instead of never. - Add SECURITY.md: private reporting via the Security tab, and an explicit boundary between this bundle and the cargo-ai CLI / Cargo platform. - Stop inlining `curl … install.sh` in cargo/SKILL.md. The command now lives only in README.md, where a human runs it; the router keeps the guidance (never run it on the user's behalf) and points there. - Use execFileSync, not execSync, for `npm root -g` in the QA script library — no shell to interpret a command string. Windows gets the npm.cmd shim. - Fill in repository/license/keywords in .codex-plugin/plugin.json, a category on the .agents marketplace entry, and add .codexignore. - Set write_step_summary: false on the scanner action and publish the report ourselves, so it lands once whether the gate passes or fails. Two medium findings are left standing and documented in CHANGELOG.md: the `anthropic` provider slug in cargo-gtm's description (correct, and CI-synced with the CLI) and `fetch(` in the run-output downloader (the point of the function). Neither is a gate failure. Co-Authored-By: Auree Aubert <16732193+aureeaubert@users.noreply.github.com> Co-Authored-By: replicas-connector[bot] <replicas-connector[bot]@users.noreply.github.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: replicas-connector[bot] <replicas-connector[bot]@users.noreply.github.com> Co-authored-by: Auree Aubert <16732193+aureeaubert@users.noreply.github.com>
2026-08-14 19:00:18 -07:00
"repository": "https://github.com/getcargohq/cargo-skills",
"license": "MIT",
"keywords": ["cargo", "gtm", "revenue", "enrichment", "orchestration", "cli"],
Fan the plugin out to Codex and Cursor; bundle session-lifecycle hooks (#50) * Fan the plugin out to Codex and Cursor; bundle session-lifecycle hooks - One plugin source, three targets: .agents/plugins/marketplace.json (Codex) + .cursor-plugin/marketplace.json, with .codex-plugin/ and .cursor-plugin/ plugin manifests version-locked to the router (linter-enforced across all three, negative-tested). The approval hook is wired per target - PreToolUse (Claude Code), PermissionRequest via hooks/codex-hooks.json (Codex), beforeShellExecution via hooks/cursor-hooks.json (Cursor) - reusing approve-cli.sh's existing per-agent verdict dispatch. - Plugin-bundled lifecycle hooks (Claude Code): session-start (pinned CLI refresh from the plugin's own cli-version + placeholder session row; deliberately no skills add - the plugin owns the skills), session-checkpoint (Stop; jq-derived title, 45s throttle), and session-end (sync finalize + detached claude -p refinement). Each defers when the installer's counterpart exists at ~/.claude/hooks/, so installer + plugin never double-register a session. - .gitignore: un-ignore .agents/plugins/ (vendored skills stay ignored). - README: per-target install steps; router 1.11.0, plugins 1.11.0. Verified: lint 0/0; scripts behavior-tested with stubbed npm/cargo-ai (pin read from plugin root, defer guards, checkpoint derivation + throttle, --finished finalize); live plugin install on Claude Code 2.1.205 shows all four hook events and both extra manifests in the 1.11.0 cache. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Make the plugin the single source of truth; agent-portable docs - session-start.sh now also refreshes the plugin itself (marketplace update + plugin update, detached, effective next session) - the plugin channel's replacement for the installer's skills-add refresh, with zero duplication by construction. - Docs made agent-portable: the pinned-install command in cargo/SKILL.md and prerequisites.md reads cli-version from the skill directory the agent loaded instead of hardcoding ~/.claude/skills/ (which silently degraded Codex/Cursor to @latest); manual-path session titles are agent-neutral; job 1 says to skip skills add when skills came from a plugin; the permission-prompts note covers all three agents' events. - README Claude Code section describes the refactored installer flow (installs the plugin; skills add only as fallback; legacy scaffolding migrated away). cargo 1.12.0, plugins 1.12.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Single-source the lifecycle scripts: dual-mode plugin/standalone The three hooks/session-*.sh scripts are now the only copies of the session lifecycle - the installer's fallback channel downloads them instead of embedding heredocs. Mode auto-detects from location (~/.claude/hooks/ = standalone; anywhere else = plugin) with an explicit plugin|standalone arg override: - standalone: skills add refresh, pin from ~/.claude/skills/cargo/, no plugin self-update, never defers. - plugin: pin from plugin root, detached plugin self-update, no skills add, defers when a standalone copy exists (exactly one lifecycle runs). Log lines carry the mode. Behavior-tested both modes of all three scripts with stubbed npm/npx/cargo-ai/claude (mode detection, defer, no-self-defer, per-mode pin paths, per-mode refresh, mode-aware logs). cargo 1.13.0, plugins 1.13.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(lifecycle): registration-aware defer, wider PATH, checkpoint hygiene Review feedback on the lifecycle scripts: - Defer guard now requires the standalone copy to be REGISTERED in ~/.claude/settings.json, not merely present - an unregistered leftover file no longer suppresses the plugin copy (which would silently skip CLI pinning and session logging). Falls back to file existence when jq is unavailable. - session-start's PATH widening for the detached plugin self-update now matches session-end's full list (Volta, asdf shims, nvm version dirs, /opt/node*) so `claude` resolves under version managers and the update isn't silently skipped. - Checkpoint prompt snippets strip control characters. The reported command-substitution injection does not exist - shell assignments and quoted expansions never evaluate a value's content, and the upsert passes --title/--summary as single argv words (verified empirically: $(touch ...) and backticks pass through as literal data) - but control chars could mangle logs/rows, so they are removed and the inertness is documented in a comment for future reviewers. Verified: unregistered leftover -> plugin runs; registered standalone -> plugin defers; clean env -> runs; injection payload inert with ESC sequences stripped from the stored title. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(lifecycle): run when standalone registration is unverifiable Review follow-up: the defer guard's no-jq / no-settings.json fallback returned "owned" (defer), which silently skipped CLI pinning and session logging whenever registration couldn't be checked - exactly the failure the registration-awareness was meant to prevent. Flipped: when jq or settings.json is unavailable, default to NOT owned so the plugin copy runs. Safe direction - the session upsert is idempotent, so a duplicate with an active standalone is harmless, whereas a wrong defer is a silent skip. Unit-tested all five branches (registered->defer; not-registered, no-settings, no-jq, no-file->run). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 18:33:21 -07:00
"skills": "./",
"hooks": "./hooks/codex-hooks.json",
"interface": {
"displayName": "Cargo",
"capabilities": ["Read", "Write"]
}
}