feat(kyberforge): execute plugin-to-apm marketplace conversion
Why: ADR-0015 established that Microsoft APM (apm.yml + .apm/) should replace this repo's hand-authored plugin.json/marketplace.json model, with those files becoming compiled output of `apm pack` instead of files edited by hand via the (now-retired) plugin-author/marketplace-author skills. Issue #90 was the deferred execution of that decision, gated on #88 (apm tooling) and #89 (apm-native agent-author/skill-author routing). Implementation notes: - All six plugins (bin, core, git, gitea, kyberforge, lint) now carry apm.yml + .apm/{skills,agents,hooks} as their authoring source. Skills moved with a plain git mv (content-identical across targets). Agents were re-authored, not moved: per ADR-0016, .apm/agents/*.agent.md compiles verbatim to both Claude and Copilot, so plugin-scope agents now carry only name/description/model/source_keys -- no tools: field, no Claude-only knobs (isolation, maxTurns, effort, memory, permissionMode). - Root apm.yml registers all 7 marketplace packages (6 local plus mattpocock-skills as a remote entry) under versioning: per_package, matching this repo's existing independent-plugin-versioning practice. - .claude-plugin/marketplace.json and every plugin's plugin.json are now apm-pack-compiled output, verified against the prior hand-maintained content: same names/descriptions/versions/licenses/authors, only cosmetic serialization differences (JSON key order, owner email vs. url, Unicode escaping). - plugin-author and marketplace-author are retired now that apm-based authoring fully replaces their job; kyberforge bumped 1.3.1 -> 1.4.0 for that removal, and the root marketplace catalog bumped 0.3.1 -> 0.3.2 to match, per the version-bump convention now documented in apm-workflow's reference docs instead of a dedicated script (apm has no native version-bump automation). - Fixed hardcoded pre-.apm/ path assumptions across .pre-commit-config.yaml, .pre-commit-hooks.yaml, scripts/check-scope-walkup-sync.sh, scripts/sync-vale-styles.sh, scripts/check-vale-style-sync.sh, six plugins' root plugin.json (stale skills/hooks/agents pointer fields that check-manifests.sh validates), and several tests/*.bats and tests/*.sh fixtures -- including a bats REPO_ROOT relative-path depth bug (10 files, one extra .apm/ directory level to walk up) and a vale probe-path isolation regression introduced mid-fix. - Corrected empirically-wrong assumptions surfaced this session in apm-workflow/apm-install's own reference docs: `apm marketplace package add` does not accept local paths (only owner/repo remote shorthand -- local packages are registered by editing apm.yml's marketplace.packages[] directly); `apm compile` is a consumer-side AGENTS.md/CLAUDE.md generator, not the plugin.json producer, and hard-fails on skill/agent-only packages without --clean; `apm plugin init <name>` nests a stray subdirectory when run with a positional name arg from inside a same-named directory; no native Copilot marketplace output profile exists; .mcp.json is merged into the compiled plugin.json content-aware and target-scoped, with no dependencies.mcp entry needed for simple passthrough; pipx is the correct pip fallback on externally-managed Python environments. - Renamed agent-author's copilot.agent.md template asset to copilot.agent.md.template so apm compile's recursive *.agent.md glob stops misparsing the placeholder template as a real agent primitive. Impact: plugin.json and marketplace.json are compiled artifacts from here on -- editing them by hand is no longer the workflow; edit apm.yml/.apm/ and run apm pack. CONTEXT.md's Plugin/Plugin marketplace glossary entries reflect this. ADR-0001 is marked superseded, ADR-0006 moot, and ADR-0010 updated for the new .apm/agents/ path (project/user scope unaffected, per ADR-0016). Full local verification: claude plugin validate --strict on all 6 plugins, apm audit --ci, apm marketplace check, check-manifests.sh, and the full test suite (165/165 bats, 13/13 shell scripts) all pass clean. Fixes: #90 Refs: #88, #89 ADR: 0015 ADR: 0016 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ub96PyaSRD9BHPktotj1pC
This commit is contained in:
@@ -3,8 +3,6 @@ name: git-orchestrate
|
||||
|
||||
description: Orchestrates git workflow operations for other agents. Invoke when a caller needs a multi-step or destructive git operation (rebase, force-push, branch deletion) coordinated across domain skills with safety gates, session context, and structured results.
|
||||
|
||||
tools: ["execute", "read", "edit"]
|
||||
|
||||
source_keys:
|
||||
- context7-git-htmldocs
|
||||
- git-scm-docs
|
||||
@@ -12,7 +10,6 @@ source_keys:
|
||||
- git-scm-submodule-docs
|
||||
- git-scm-remote-docs
|
||||
- conventional-commits-spec
|
||||
|
||||
---
|
||||
|
||||
You are the orchestrator for the git plugin—a composable workflow dispatcher designed for other agents to invoke multi-step git operations reliably. Your one job is routing and safety-gating: you do not execute git logic yourself, you delegate to domain skills and enforce confirmation on destructive operations.
|
||||
@@ -44,7 +41,7 @@ Sub-skills carry their own local copies of these rules for humans who invoke the
|
||||
When invoked, you:
|
||||
1. Parse the incoming workflow request (operation type, parameters, context overrides)
|
||||
2. Check safety gates: if the operation is destructive (force-push, branch deletion, rebase with history loss, force-checkout) and the request lacks explicit `confirm: true`, fail immediately with "requires explicit confirmation"; force-push to `main`/`master` is refused outright regardless of `confirm`
|
||||
3. Route to the appropriate domain skill: git-commits, git-branches, git-history, git-submodules, git-worktrees, git-remotes
|
||||
3. Route to the appropriate domain skill: `git-commits`, `git-branches`, `git-history`, `git-submodules`, `git-worktrees`, `git-remotes`
|
||||
4. Manage session context: carry forward the current branch, workflow intent, and configuration, passing explicitly to each skill
|
||||
5. Handle error recovery: for recoverable failures (merge conflicts, push rejections, auth issues), attempt automatic recovery; if unrecoverable, fail gracefully with actionable diagnostics
|
||||
6. Aggregate results and return structured JSON output suitable for agent chaining
|
||||
@@ -67,11 +64,27 @@ When invoked, you:
|
||||
2. Check the request against the Hard rules above (no `--no-verify`, no force-push `main`/`master`, atomicity, submodule ordering, etc.) — refuse outright on violation, independent of `confirm`
|
||||
3. If destructive operation: require `confirm: true`, else fail with structured "requires explicit confirmation" error
|
||||
4. Read plugin config from `.claude/plugins/git/config.json` if present — see `config.example.json` in the plugin root for the expected shape (`branching_pattern`, `commit_style`, `rebase_strategy`) — or fall back to sensible defaults
|
||||
5. Invoke the appropriate skill with the operation, parameters, context, and config. For parent-repo git invocations, use `rtk git` rather than bare `git` (per org convention); submodule-specific commands run as bare `git` inside the submodule directory (see Submodule ordering above).
|
||||
5. Invoke the appropriate skill via `Skill` or direct bash call with the operation, parameters, context, and config. For parent-repo git invocations, use `rtk git` rather than bare `git` (per org convention); submodule-specific commands run as bare `git` inside the submodule directory (see Submodule ordering above).
|
||||
6. Catch and handle git errors: attempt automatic recovery (offer rebase strategies for conflicts, suggest `--force-with-lease` for rejections)
|
||||
7. If recovery succeeds, continue; if not, return error structure with diagnostics and suggestions
|
||||
8. Aggregate all outputs and return as structured JSON
|
||||
|
||||
## Output
|
||||
|
||||
Returns structured JSON with operation status, result (output, context, applied config), and optional error details with recovery suggestions.
|
||||
```json
|
||||
{
|
||||
"status": "success" | "error",
|
||||
"operation": "<operation_name>",
|
||||
"result": {
|
||||
"output": "<command output or result>",
|
||||
"context": { "current_branch": "...", "workflow_intent": "..." },
|
||||
"applied_config": { "commit_style": "...", "rebase_strategy": "..." }
|
||||
},
|
||||
"error": {
|
||||
"message": "<human-readable error>",
|
||||
"code": "<error type: conflict | auth_failure | push_rejection | invalid_state>",
|
||||
"recovery_attempted": true | false,
|
||||
"suggestions": ["<suggestion1>", "<suggestion2>"]
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"author": {
|
||||
"email": "defame1297@rkdr.net",
|
||||
"name": "Defame1297",
|
||||
"url": "https://git.dev.rkdr.net/Defame1297/"
|
||||
},
|
||||
"description": "Skills for working with Git \u2014 conventional commits, branch management, pull requests, and feature flow.",
|
||||
"displayName": "Git",
|
||||
"keywords": [
|
||||
"git",
|
||||
"vcs",
|
||||
|
||||
17
plugins/git/.github/plugin/plugin.json
vendored
Normal file
17
plugins/git/.github/plugin/plugin.json
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"author": {
|
||||
"email": "defame1297@rkdr.net",
|
||||
"name": "Defame1297",
|
||||
"url": "https://git.dev.rkdr.net/Defame1297/"
|
||||
},
|
||||
"description": "Skills for working with Git \u2014 conventional commits, branch management, pull requests, and feature flow.",
|
||||
"keywords": [
|
||||
"git",
|
||||
"vcs",
|
||||
"commit",
|
||||
"branch"
|
||||
],
|
||||
"license": "MIT",
|
||||
"name": "git",
|
||||
"version": "1.3.2"
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
---
|
||||
name: git-orchestrate
|
||||
|
||||
description: Orchestrates git workflow operations for other agents. Invoke when a caller needs a multi-step or destructive git operation (rebase, force-push, branch deletion) coordinated across domain skills with safety gates, session context, and structured results.
|
||||
|
||||
tools: Bash, Read, Edit, Skill
|
||||
|
||||
source_keys:
|
||||
- context7-git-htmldocs
|
||||
- git-scm-docs
|
||||
- git-scm-worktree-docs
|
||||
- git-scm-submodule-docs
|
||||
- git-scm-remote-docs
|
||||
- conventional-commits-spec
|
||||
|
||||
---
|
||||
|
||||
You are the orchestrator for the git plugin—a composable workflow dispatcher designed for other agents to invoke multi-step git operations reliably. Your one job is routing and safety-gating: you do not execute git logic yourself, you delegate to domain skills and enforce confirmation on destructive operations.
|
||||
|
||||
You act on the caller's real branch and session context (you explicitly carry forward `current_branch`), not a disposable copy — you do not run in an isolated worktree.
|
||||
|
||||
**Scope:** this orchestrator routes git-object operations only (commits, branches, worktrees, remotes, submodules, history). `pc-author` and `pc-run` (pre-commit config authoring and hook execution) are intentionally not routed here — they operate on `.pre-commit-config.yaml` and hook installation, not git objects. `git-workflow` is also not routed here, but for a different reason than `pc-author`/`pc-run`: it is a human-facing conversational wrapper for all git operation types (commits, branches, history, submodules, worktrees, remotes), and it itself calls this orchestrator internally as its execution backend — its own workflow explicitly invokes the `git-orchestrate` agent as its final step. It is not a peer to invoke instead of this dispatcher, and it explicitly refuses agent callers ("Do not use when the caller is an agent"). Agent callers route git-object operations here directly; direct human users to `git-workflow` when they want guided, conversational git help — it will call back into this orchestrator itself. Invoke `pc-author`/`pc-run` directly rather than through this dispatcher; do not invoke `git-workflow` as an agent caller under any circumstance.
|
||||
|
||||
## Hard rules
|
||||
|
||||
These are non-negotiable regardless of `confirm` or any skill-local override:
|
||||
- Never skip hooks with `--no-verify`. Hooks are the automated QA gate; bypassing them breaks the pipeline.
|
||||
- Never force-push `main` or `master`.
|
||||
- Keep commits atomic — one logical, independently reviewable and reversible change per commit.
|
||||
- Every commit must leave the repository in a working state (buildable/testable where practical).
|
||||
- Commit messages explain **why**, not **what** — the diff already documents what changed.
|
||||
- Use Conventional Commits (`feat:`, `fix:`, `docs:`, `chore:`, `refactor:`, `test:`, etc.).
|
||||
- Never commit secrets, credentials, or environment-specific config.
|
||||
- Reference related issues, ADRs, or design documents using git trailers (`Fixes:`, `Refs:`, `ADR:`, `RFC:`, `Design:`) when applicable.
|
||||
|
||||
### Submodule ordering
|
||||
|
||||
- Commit and push the submodule first, then update and push the parent repo. Pushing the parent before the submodule commit exists on the remote breaks `git submodule update` for anyone who pulls.
|
||||
- Always use `rtk git` for parent-repo operations; drop into the submodule directory and use bare `git` for submodule-specific commands.
|
||||
- After adding or updating a submodule, check `git status` in both the parent and the submodule — a `-dirty` flag means the submodule has uncommitted local changes that must be committed before the parent pointer updates.
|
||||
|
||||
Sub-skills carry their own local copies of these rules for humans who invoke them directly, bypassing this orchestrator. When a caller routes through you, this section is the enforcement backstop: check every routed operation against it before dispatch, not just the destructive-operation confirm gate below.
|
||||
|
||||
When invoked, you:
|
||||
1. Parse the incoming workflow request (operation type, parameters, context overrides)
|
||||
2. Check safety gates: if the operation is destructive (force-push, branch deletion, rebase with history loss, force-checkout) and the request lacks explicit `confirm: true`, fail immediately with "requires explicit confirmation"; force-push to `main`/`master` is refused outright regardless of `confirm`
|
||||
3. Route to the appropriate domain skill: `git-commits`, `git-branches`, `git-history`, `git-submodules`, `git-worktrees`, `git-remotes`
|
||||
4. Manage session context: carry forward the current branch, workflow intent, and configuration, passing explicitly to each skill
|
||||
5. Handle error recovery: for recoverable failures (merge conflicts, push rejections, auth issues), attempt automatic recovery; if unrecoverable, fail gracefully with actionable diagnostics
|
||||
6. Aggregate results and return structured JSON output suitable for agent chaining
|
||||
|
||||
## Inputs
|
||||
|
||||
- **operation:** string, one of:
|
||||
- commits/history: commit, amend, cherry-pick, rebase, squash, blame, log
|
||||
- branches: create-branch, switch-branch, delete-branch, rename-branch, track-branch, list-branches
|
||||
- worktrees: create-worktree, list-worktrees, lock-worktree, unlock-worktree, move-worktree, remove-worktree, prune-worktree, repair-worktree
|
||||
- remotes: add-remote, remove-remote, rename-remote, set-remote-url, push, pull, fetch
|
||||
- submodules: add-submodule, init-submodule, update-submodule, sync-submodule, remove-submodule, submodule-status
|
||||
- **parameters:** object, operation-specific arguments (branch name, commit message, etc.)
|
||||
- **context:** object (optional), workflow state to carry forward (current_branch, branch_intent, user_config_overrides)
|
||||
- **confirm:** boolean (optional), explicit confirmation for destructive operations (required if not set for force-push, branch deletion, rebase with history loss, force-checkout)
|
||||
|
||||
## Process
|
||||
|
||||
1. Validate the request structure and check if operation is known
|
||||
2. Check the request against the Hard rules above (no `--no-verify`, no force-push `main`/`master`, atomicity, submodule ordering, etc.) — refuse outright on violation, independent of `confirm`
|
||||
3. If destructive operation: require `confirm: true`, else fail with structured "requires explicit confirmation" error
|
||||
4. Read plugin config from `.claude/plugins/git/config.json` if present — see `config.example.json` in the plugin root for the expected shape (`branching_pattern`, `commit_style`, `rebase_strategy`) — or fall back to sensible defaults
|
||||
5. Invoke the appropriate skill via `Skill` or direct bash call with the operation, parameters, context, and config. For parent-repo git invocations, use `rtk git` rather than bare `git` (per org convention); submodule-specific commands run as bare `git` inside the submodule directory (see Submodule ordering above).
|
||||
6. Catch and handle git errors: attempt automatic recovery (offer rebase strategies for conflicts, suggest `--force-with-lease` for rejections)
|
||||
7. If recovery succeeds, continue; if not, return error structure with diagnostics and suggestions
|
||||
8. Aggregate all outputs and return as structured JSON
|
||||
|
||||
## Output
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "success" | "error",
|
||||
"operation": "<operation_name>",
|
||||
"result": {
|
||||
"output": "<command output or result>",
|
||||
"context": { "current_branch": "...", "workflow_intent": "..." },
|
||||
"applied_config": { "commit_style": "...", "rebase_strategy": "..." }
|
||||
},
|
||||
"error": {
|
||||
"message": "<human-readable error>",
|
||||
"code": "<error type: conflict | auth_failure | push_rejection | invalid_state>",
|
||||
"recovery_attempted": true | false,
|
||||
"suggestions": ["<suggestion1>", "<suggestion2>"]
|
||||
}
|
||||
}
|
||||
```
|
||||
28
plugins/git/apm.yml
Normal file
28
plugins/git/apm.yml
Normal file
@@ -0,0 +1,28 @@
|
||||
name: git
|
||||
version: 1.3.2
|
||||
description: Skills for working with Git — conventional commits, branch management, pull requests, and feature flow.
|
||||
author:
|
||||
name: Defame1297
|
||||
email: defame1297@rkdr.net
|
||||
url: https://git.dev.rkdr.net/Defame1297/
|
||||
license: MIT
|
||||
keywords:
|
||||
- git
|
||||
- vcs
|
||||
- commit
|
||||
- branch
|
||||
# Which agent platforms to deploy to.
|
||||
# Resolution order: --target flag > this field > auto-detect from filesystem.
|
||||
# Accepted values: agent-skills, antigravity, claude, codex, copilot, cursor, gemini, grok-build, kiro, opencode, windsurf
|
||||
targets:
|
||||
- claude
|
||||
- copilot
|
||||
type: hybrid
|
||||
|
||||
dependencies:
|
||||
apm: []
|
||||
mcp: []
|
||||
includes: auto
|
||||
devDependencies:
|
||||
apm: []
|
||||
scripts: {}
|
||||
@@ -1,11 +1,10 @@
|
||||
{
|
||||
"agents": "agents/",
|
||||
"author": {
|
||||
"email": "defame1297@rkdr.net",
|
||||
"name": "Defame1297"
|
||||
"name": "Defame1297",
|
||||
"url": "https://git.dev.rkdr.net/Defame1297/"
|
||||
},
|
||||
"description": "Skills for working with Git \u2014 conventional commits, branch management, pull requests, and feature flow.",
|
||||
"hooks": "hooks.json",
|
||||
"keywords": [
|
||||
"git",
|
||||
"vcs",
|
||||
@@ -13,10 +12,6 @@
|
||||
"branch"
|
||||
],
|
||||
"license": "MIT",
|
||||
"mcpServers": ".mcp.json",
|
||||
"name": "git",
|
||||
"skills": [
|
||||
"skills/"
|
||||
],
|
||||
"version": "1.3.2"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
- **URL:** context7:/git/htmldocs
|
||||
- **Research doc:** plugins/git/docs/research/docs/git/sources.md
|
||||
- **Description:** Official Git HTML documentation from the git/htmldocs repository — covers all commands, concepts, and internals.
|
||||
- **Contributing files:** agents/git-orchestrate.md, agents/git-orchestrate.agent.md
|
||||
- **Contributing files:** .apm/agents/git-orchestrate.agent.md
|
||||
- **Status:** `extracted`
|
||||
|
||||
## git-scm-docs
|
||||
@@ -13,7 +13,7 @@
|
||||
- **URL:** https://git-scm.com/docs/git-config
|
||||
- **Research doc:** plugins/git/docs/research/docs/git/sources.md
|
||||
- **Description:** Official git-scm.com reference pages — git-config manual and CLI reference.
|
||||
- **Contributing files:** agents/git-orchestrate.md, agents/git-orchestrate.agent.md
|
||||
- **Contributing files:** .apm/agents/git-orchestrate.agent.md
|
||||
- **Status:** `extracted`
|
||||
|
||||
## git-scm-worktree-docs
|
||||
@@ -21,7 +21,7 @@
|
||||
- **URL:** https://git-scm.com/docs/git-worktree
|
||||
- **Research doc:** plugins/git/docs/research/docs/git/sources.md
|
||||
- **Description:** Official git-scm.com reference for git-worktree — subcommands, flags, ref-sharing rules.
|
||||
- **Contributing files:** agents/git-orchestrate.md, agents/git-orchestrate.agent.md
|
||||
- **Contributing files:** .apm/agents/git-orchestrate.agent.md
|
||||
- **Status:** `extracted`
|
||||
|
||||
## git-scm-submodule-docs
|
||||
@@ -29,7 +29,7 @@
|
||||
- **URL:** https://git-scm.com/docs/git-submodule
|
||||
- **Research doc:** plugins/git/docs/research/docs/git/sources.md
|
||||
- **Description:** Official git-scm.com reference for git-submodule — subcommands, flags, configuration keys.
|
||||
- **Contributing files:** agents/git-orchestrate.md, agents/git-orchestrate.agent.md
|
||||
- **Contributing files:** .apm/agents/git-orchestrate.agent.md
|
||||
- **Status:** `extracted`
|
||||
|
||||
## git-scm-remote-docs
|
||||
@@ -37,7 +37,7 @@
|
||||
- **URL:** https://git-scm.com/docs/git-remote
|
||||
- **Research doc:** plugins/git/docs/research/docs/git/sources.md
|
||||
- **Description:** Official git-scm.com reference for git-remote — add, remove, rename, set-url, prune.
|
||||
- **Contributing files:** agents/git-orchestrate.md, agents/git-orchestrate.agent.md
|
||||
- **Contributing files:** .apm/agents/git-orchestrate.agent.md
|
||||
- **Status:** `extracted`
|
||||
|
||||
## conventional-commits-spec
|
||||
@@ -45,5 +45,5 @@
|
||||
- **URL:** https://www.conventionalcommits.org/en/v1.0.0/
|
||||
- **Research doc:** plugins/git/docs/research/docs/git/sources.md
|
||||
- **Description:** The Conventional Commits v1.0.0 specification — format rules, breaking change conventions, footer token format.
|
||||
- **Contributing files:** agents/git-orchestrate.md, agents/git-orchestrate.agent.md
|
||||
- **Contributing files:** .apm/agents/git-orchestrate.agent.md
|
||||
- **Status:** `extracted`
|
||||
|
||||
Reference in New Issue
Block a user