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:
2026-08-12 18:09:37 +00:00
parent 50d5c30a3c
commit 5e232503c4
289 changed files with 741 additions and 1974 deletions

View File

@@ -2,48 +2,57 @@
"description": "AI development skills for Claude Code and GitHub Copilot CLI \u2014 factory, design, implement, review, and cross-cutting workflows.", "description": "AI development skills for Claude Code and GitHub Copilot CLI \u2014 factory, design, implement, review, and cross-cutting workflows.",
"name": "holocron", "name": "holocron",
"owner": { "owner": {
"email": "defame1297@rkdr.net", "name": "Defame1297",
"name": "Defame1297" "url": "https://git.dev.rkdr.net/Defame1297/"
}, },
"plugins": [ "plugins": [
{ {
"description": "Skills and agents for creating, maintaining, and managing a Claude Code / Copilot CLI plugin marketplace.", "description": "Skills and agents for creating, maintaining, and managing a Claude Code / Copilot CLI plugin marketplace.",
"name": "kyberforge", "name": "kyberforge",
"source": "./plugins/kyberforge" "source": "./plugins/kyberforge",
"version": "1.4.0"
}, },
{ {
"description": "A place for things to be binned", "description": "A place for things to be binned",
"name": "bin", "name": "bin",
"source": "./plugins/bin" "source": "./plugins/bin",
"version": "1.1.1"
}, },
{ {
"description": "Skills for working with Git \u2014 conventional commits, branch management, pull requests, and feature flow.", "description": "Skills for working with Git \u2014 conventional commits, branch management, pull requests, and feature flow.",
"name": "git", "name": "git",
"source": "./plugins/git" "source": "./plugins/git",
"version": "1.3.2"
}, },
{ {
"description": "Skills for managing Gitea repositories \u2014 issues, pull requests, milestones, releases, and wikis.", "description": "Skills for managing Gitea repositories \u2014 issues, pull requests, milestones, releases, and wikis.",
"name": "gitea", "name": "gitea",
"source": "./plugins/gitea" "source": "./plugins/gitea",
"version": "1.3.3"
}, },
{ {
"description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.", "description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.",
"name": "core", "name": "core",
"source": "./plugins/core" "source": "./plugins/core",
"version": "1.1.0"
}, },
{ {
"description": "Skills for Real Engineers \u2014 planning, TDD, architecture, and debugging workflows from Matt Pocock's .claude directory.", "description": "Skills for Real Engineers \u2014 planning, TDD, architecture, and debugging workflows from Matt Pocock's .claude directory.",
"name": "mattpocock-skills", "name": "mattpocock-skills",
"source": { "source": {
"ref": "v1.2.3",
"repo": "mattpocock/skills", "repo": "mattpocock/skills",
"source": "github" "sha": "835450ef244ab7335f75d95b83e7d979eae22a6d",
"source": "github",
"tag_pattern": "v{version}"
} }
}, },
{ {
"description": "Skills and agents for configuring and running linters.", "description": "Skills and agents for configuring and running linters.",
"name": "lint", "name": "lint",
"source": "./plugins/lint" "source": "./plugins/lint",
"version": "1.1.5"
} }
], ],
"version": "0.3.1" "version": "0.3.2"
} }

View File

@@ -2,48 +2,57 @@
"description": "AI development skills for Claude Code and GitHub Copilot CLI \u2014 factory, design, implement, review, and cross-cutting workflows.", "description": "AI development skills for Claude Code and GitHub Copilot CLI \u2014 factory, design, implement, review, and cross-cutting workflows.",
"name": "holocron", "name": "holocron",
"owner": { "owner": {
"email": "defame1297@rkdr.net", "name": "Defame1297",
"name": "Defame1297" "url": "https://git.dev.rkdr.net/Defame1297/"
}, },
"plugins": [ "plugins": [
{ {
"description": "Skills and agents for creating, maintaining, and managing a Claude Code / Copilot CLI plugin marketplace.", "description": "Skills and agents for creating, maintaining, and managing a Claude Code / Copilot CLI plugin marketplace.",
"name": "kyberforge", "name": "kyberforge",
"source": "./plugins/kyberforge" "source": "./plugins/kyberforge",
"version": "1.4.0"
}, },
{ {
"description": "A place for things to be binned", "description": "A place for things to be binned",
"name": "bin", "name": "bin",
"source": "./plugins/bin" "source": "./plugins/bin",
"version": "1.1.1"
}, },
{ {
"description": "Skills for working with Git \u2014 conventional commits, branch management, pull requests, and feature flow.", "description": "Skills for working with Git \u2014 conventional commits, branch management, pull requests, and feature flow.",
"name": "git", "name": "git",
"source": "./plugins/git" "source": "./plugins/git",
"version": "1.3.2"
}, },
{ {
"description": "Skills for managing Gitea repositories \u2014 issues, pull requests, milestones, releases, and wikis.", "description": "Skills for managing Gitea repositories \u2014 issues, pull requests, milestones, releases, and wikis.",
"name": "gitea", "name": "gitea",
"source": "./plugins/gitea" "source": "./plugins/gitea",
"version": "1.3.3"
}, },
{ {
"description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.", "description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.",
"name": "core", "name": "core",
"source": "./plugins/core" "source": "./plugins/core",
"version": "1.1.0"
}, },
{ {
"description": "Skills for Real Engineers \u2014 planning, TDD, architecture, and debugging workflows from Matt Pocock's .claude directory.", "description": "Skills for Real Engineers \u2014 planning, TDD, architecture, and debugging workflows from Matt Pocock's .claude directory.",
"name": "mattpocock-skills", "name": "mattpocock-skills",
"source": { "source": {
"ref": "v1.2.3",
"repo": "mattpocock/skills", "repo": "mattpocock/skills",
"source": "github" "sha": "835450ef244ab7335f75d95b83e7d979eae22a6d",
"source": "github",
"tag_pattern": "v{version}"
} }
}, },
{ {
"description": "Skills and agents for configuring and running linters.", "description": "Skills and agents for configuring and running linters.",
"name": "lint", "name": "lint",
"source": "./plugins/lint" "source": "./plugins/lint",
"version": "1.1.5"
} }
], ],
"version": "0.3.1" "version": "0.3.2"
} }

View File

@@ -131,25 +131,25 @@ repos:
description: Enforce agentskills.io's 500-line/5,000-token SKILL.md size ceiling description: Enforce agentskills.io's 500-line/5,000-token SKILL.md size ceiling
entry: scripts/skill-size-check.sh entry: scripts/skill-size-check.sh
language: script language: script
files: '^plugins/[^/]+/skills/[^/]+/SKILL\.md$' files: '^plugins/[^/]+/\.apm/skills/[^/]+/SKILL\.md$'
pass_filenames: true pass_filenames: true
- id: vale-audit-prefilter-skill - id: vale-audit-prefilter-skill
stages: ['pre-commit'] stages: ['pre-commit']
name: Vale audit prefilter (SKILL.md) name: Vale audit prefilter (SKILL.md)
description: Run Vale against SKILL.md files as a deterministic prefilter for skill-audit, via skill-audit's own bundled copy description: Run Vale against SKILL.md files as a deterministic prefilter for skill-audit, via skill-audit's own bundled copy
entry: plugins/kyberforge/skills/skill-audit/scripts/vale-wrap.sh entry: plugins/kyberforge/.apm/skills/skill-audit/scripts/vale-wrap.sh
language: script language: script
files: '^plugins/[^/]+/skills/[^/]+/SKILL\.md$' files: '^plugins/[^/]+/\.apm/skills/[^/]+/SKILL\.md$'
pass_filenames: true pass_filenames: true
- id: vale-audit-prefilter-agent - id: vale-audit-prefilter-agent
stages: ['pre-commit'] stages: ['pre-commit']
name: Vale audit prefilter (agent files) name: Vale audit prefilter (agent files)
description: Run Vale against agent markdown files as a deterministic prefilter for agent-audit, via agent-audit's own bundled copy description: Run Vale against agent markdown files as a deterministic prefilter for agent-audit, via agent-audit's own bundled copy
entry: plugins/kyberforge/skills/agent-audit/scripts/vale-wrap.sh entry: plugins/kyberforge/.apm/skills/agent-audit/scripts/vale-wrap.sh
language: script language: script
files: '^plugins/[^/]+/agents/[^/]+\.md$' files: '^plugins/[^/]+/\.apm/agents/[^/]+\.agent\.md$'
pass_filenames: true pass_filenames: true
- repo: meta - repo: meta

View File

@@ -1,14 +1,14 @@
- id: kyberforge-vale-audit-skill - id: kyberforge-vale-audit-skill
name: Kyberforge Vale prose audit (SKILL.md) name: Kyberforge Vale prose audit (SKILL.md)
description: Deterministic prose-pattern prefilter for kyberforge's skill-audit, via its own bundled Vale config/styles description: Deterministic prose-pattern prefilter for kyberforge's skill-audit, via its own bundled Vale config/styles
entry: plugins/kyberforge/skills/skill-audit/scripts/vale-wrap.sh entry: plugins/kyberforge/.apm/skills/skill-audit/scripts/vale-wrap.sh
language: script language: script
files: '(^|/)SKILL\.md$' files: '(^|/)SKILL\.md$'
- id: kyberforge-vale-audit-agent - id: kyberforge-vale-audit-agent
name: Kyberforge Vale prose audit (agent files) name: Kyberforge Vale prose audit (agent files)
description: Deterministic prose-pattern prefilter for kyberforge's agent-audit, via its own bundled Vale config/styles description: Deterministic prose-pattern prefilter for kyberforge's agent-audit, via its own bundled Vale config/styles
entry: plugins/kyberforge/skills/agent-audit/scripts/vale-wrap.sh entry: plugins/kyberforge/.apm/skills/agent-audit/scripts/vale-wrap.sh
language: script language: script
files: '(^|/)agents/[^/]+\.md$|\.agent\.md$' files: '(^|/)agents/[^/]+\.md$|\.agent\.md$'

View File

@@ -22,7 +22,7 @@ Fall back to raw shell only when no skill covers it.
## Setup and testing ## Setup and testing
- Install git hooks via `git:pc-run`, wiring all three stages — this repo's `.pre-commit-config.yaml` has no `default_install_hook_types`, so a plain install silently skips `commit-msg` (Conventional Commits) and `pre-push` (tests, manifest check). - Install git hooks via `git:pc-run`, wiring all three stages — this repo's `.pre-commit-config.yaml` has no `default_install_hook_types`, so a plain install silently skips `commit-msg` (Conventional Commits) and `pre-push` (tests, manifest check).
- Install the `vale` binary — required by the `vale-audit-prefilter-skill`/`-agent` pre-commit hooks, which run on every commit touching a `SKILL.md` or agent `.md` file. Without it the hooks fail with a bare "command not found" and no install pointer. `brew install vale` (macOS), `snap install vale` (Linux), `choco install vale` (Windows), or see https://vale.sh/docs/vale-cli/installation/. No `vale sync` needed — the `Kyberforge` styles are committed under `plugins/kyberforge/skills/{skill-audit,agent-audit}/assets/vale/styles/`, not downloaded packages (see ADR-0014). - Install the `vale` binary — required by the `vale-audit-prefilter-skill`/`-agent` pre-commit hooks, which run on every commit touching a `SKILL.md` or agent `.md` file. Without it the hooks fail with a bare "command not found" and no install pointer. `brew install vale` (macOS), `snap install vale` (Linux), `choco install vale` (Windows), or see https://vale.sh/docs/vale-cli/installation/. No `vale sync` needed — the `Kyberforge` styles are committed under `plugins/kyberforge/.apm/skills/{skill-audit,agent-audit}/assets/vale/styles/`, not downloaded packages (see ADR-0014).
- Run `bash tests/run-tests.sh` before considering any change done — it runs every `test-*.sh` script in the repo plus the bats suite (`--bats-only` for just bats). First run auto-initializes the bats submodules; no manual `git submodule update` needed. - Run `bash tests/run-tests.sh` before considering any change done — it runs every `test-*.sh` script in the repo plus the bats suite (`--bats-only` for just bats). First run auto-initializes the bats submodules; no manual `git submodule update` needed.
- Pushing re-runs the full suite plus `scripts/check-manifests.sh` via the pre-push hook — same commands, so run them locally first. - Pushing re-runs the full suite plus `scripts/check-manifests.sh` via the pre-push hook — same commands, so run them locally first.
- Author commits with `git:git-commits` — it validates Conventional Commits (enforced at `commit-msg`) for you. - Author commits with `git:git-commits` — it validates Conventional Commits (enforced at `commit-msg`) for you.

View File

@@ -27,10 +27,10 @@ A separate product (separate repo) for browsing, editing, and configuring AI dev
Reusable slash commands for AI coding tools, defined as `SKILL.md` files following the [Agent Skills open standard](https://agentskills.io). Deployed via plugin — `plugins/<plugin-name>/skills/<skill-name>/SKILL.md`, available after the plugin is installed (`claude plugin install <name>@<marketplace>`). Skills are self-contained — they cannot reference files outside the plugin directory after install-time caching. Reusable slash commands for AI coding tools, defined as `SKILL.md` files following the [Agent Skills open standard](https://agentskills.io). Deployed via plugin — `plugins/<plugin-name>/skills/<skill-name>/SKILL.md`, available after the plugin is installed (`claude plugin install <name>@<marketplace>`). Skills are self-contained — they cannot reference files outside the plugin directory after install-time caching.
### Plugin ### Plugin
The deployable unit in the plugin marketplace. A plugin bundles one or more skills, agents, hooks, prompts, MCP servers, and optionally a `bin/` directory into a single installable directory. Each plugin has two manifests: `.claude-plugin/plugin.json` (Claude Code) and `plugin.json` at the plugin root (Copilot CLI). Plugins are copied to a cache on install — they cannot reference files outside their own directory. In this repo, plugins live under `plugins/<name>/`. Install a plugin with `claude plugin install <name>@<marketplace>`. These manifests are hand-authored today but are slated to become APM-compiled output per ADR-0015, pending issue #90 (not yet changed). The deployable unit in the plugin marketplace. A plugin bundles one or more skills, agents, hooks, prompts, MCP servers, and optionally a `bin/` directory into a single installable directory. In this repo, plugins live under `plugins/<name>/`, each with its own `apm.yml` + `.apm/{skills,agents,hooks,...}` — this is the authoring source of truth for the plugin's content (ADR-0015). `.claude-plugin/plugin.json` (Claude Code) and `.github/plugin/plugin.json` (Copilot CLI) are **compiled output** of `apm pack`/`apm compile`, generated from `apm.yml` + `.apm/` — they are not hand-edited. Plugins are copied to a cache on install — they cannot reference files outside their own directory. Install a plugin with `claude plugin install <name>@<marketplace>`.
### Plugin marketplace ### Plugin marketplace
A Git repository with a `marketplace.json` manifest listing installable plugins. No backend, registry, or SaaS required — the Git repo is the marketplace. This repo is the `holocron` marketplace. The manifest lives at `.claude-plugin/marketplace.json` (read by both Claude Code and Copilot CLI) and is mirrored to `.github/plugin/marketplace.json`. This manifest is hand-authored today but is slated to become APM-compiled output per ADR-0015, pending issue #90 (not yet changed). A Git repository with a `marketplace.json` manifest listing installable plugins. No backend, registry, or SaaS required — the Git repo is the marketplace. This repo is the `holocron` marketplace. The manifest at `.claude-plugin/marketplace.json` (read by both Claude Code and Copilot CLI, mirrored to `.github/plugin/marketplace.json`) is **compiled output** of `apm pack`, generated from the root `apm.yml`'s `marketplace:` block (owner, build/output config, versioning strategy, and the `packages:` list of installable plugins) — it is not hand-edited. See ADR-0015.
### HITL (human-in-the-loop) ### HITL (human-in-the-loop)
Agent pauses before a consequential action; human approves before execution. Required for irreversible or high-stakes actions (architecture changes, production deployments, security configuration). The agent drafts the change plan and waits — it does not proceed autonomously. Contrast with HOTL. Agent pauses before a consequential action; human approves before execution. Required for irreversible or high-stakes actions (architecture changes, production deployments, security configuration). The agent drafts the change plan and waits — it does not proceed autonomously. Contrast with HOTL.

71
apm.yml Normal file
View File

@@ -0,0 +1,71 @@
name: holocron
version: 0.3.2
description: AI development skills for Claude Code and GitHub Copilot CLI — factory, design, implement, review, and cross-cutting workflows.
license: MIT
marketplace:
# apm's Claude marketplace mapper only emits description:/version: into the
# compiled marketplace.json when set explicitly here (an override) — the
# top-level apm.yml description:/version: above are NOT inherited into the
# compiled output despite being used elsewhere (e.g. by `apm audit`).
description: AI development skills for Claude Code and GitHub Copilot CLI — factory, design, implement, review, and cross-cutting workflows.
version: 0.3.2
owner:
name: Defame1297
url: https://git.dev.rkdr.net/Defame1297/
# Default tag pattern used to resolve version ranges for each package.
build:
tagPattern: "v{version}"
# Output targets (map form). 'claude' is enabled by default;
# uncomment 'codex' below to publish the Codex artifact too.
# Each output writes to its profile default path; add 'path:'
# under a key to override.
outputs:
claude: {}
# codex: {}
#
# Note: enabling codex requires every package below to declare
# 'category:' (e.g. category: Productivity).
# CI tip: build one or all formats with a machine-readable manifest:
# apm pack --marketplace=claude,codex --json | jq -r '.marketplace.outputs[].path'
versioning:
strategy: per_package
packages:
- name: kyberforge
description: Skills and agents for creating, maintaining, and managing a Claude Code / Copilot CLI plugin marketplace.
source: ./plugins/kyberforge
version: 1.4.0
- name: bin
description: A place for things to be binned
source: ./plugins/bin
version: 1.1.1
- name: git
description: Skills for working with Git — conventional commits, branch management, pull requests, and feature flow.
source: ./plugins/git
version: 1.3.2
- name: gitea
description: Skills for managing Gitea repositories — issues, pull requests, milestones, releases, and wikis.
source: ./plugins/gitea
version: 1.3.3
- name: core
description: Cross-cutting utility skills for everyday AI-assisted coding — triage, diagnosis, architecture review, and session navigation.
source: ./plugins/core
version: 1.1.0
- name: mattpocock-skills
description: Skills for Real Engineers — planning, TDD, architecture, and debugging workflows from Matt Pocock's .claude directory.
source: mattpocock/skills
version: "^1.2.0"
- name: lint
description: Skills and agents for configuring and running linters.
source: ./plugins/lint
version: 1.1.5

View File

@@ -1,5 +1,16 @@
# Skills are distributed via plugins, not monolithic repo deployment # Skills are distributed via plugins, not monolithic repo deployment
**Superseded by:** ADR-0015 (Microsoft APM replaces the hand-authored plugin/marketplace model
as this repo's authoring source of truth) and, for plugin-scope agent files specifically,
ADR-0016 (plugin-scope `.apm/agents/*.agent.md` drops provider-specific fields). Since issue
#90's conversion executed, plugin content is authored under `plugins/<name>/apm.yml` +
`.apm/{skills,agents,hooks}/` — not the flat `skills/`/`agents/` layout this ADR describes —
and `.claude-plugin/plugin.json`/`.github/plugin/plugin.json` are compiled output of `apm pack`,
not hand-authored. This ADR's content is kept below as the historical record of the
pre-APM decision; it is no longer the current model.
---
Skills (slash commands) are authored and distributed as part of **plugins** — each plugin contains its own `skills/` directory alongside agents and other artifacts. Plugins are installed via `claude plugin install <name>@holocron` rather than deployed from the repo's local tree. This decision decouples skill authoring cadence from core provider deployments and allows independent versioning per plugin. Skills (slash commands) are authored and distributed as part of **plugins** — each plugin contains its own `skills/` directory alongside agents and other artifacts. Plugins are installed via `claude plugin install <name>@holocron` rather than deployed from the repo's local tree. This decision decouples skill authoring cadence from core provider deployments and allows independent versioning per plugin.
## Context ## Context

View File

@@ -1,5 +1,18 @@
# version field is present in both plugin manifests # version field is present in both plugin manifests
**Moot as of ADR-0015.** This ADR addressed drift risk between two independently
*hand-maintained* manifests. Since issue #90's conversion executed, `.claude-plugin/plugin.json`
and `.github/plugin/plugin.json` are both **compiled output** of `apm pack`, generated in the
same pass from a single `apm.yml` per plugin — there is no longer a second hand-authored file
that could drift out of parity. The invariant this ADR required (`version` present and
identical in both manifests) still holds in the compiled output, but structurally, not because
a skill enforces it: both files are derived from the same `apm.yml` `version:` field, so
divergence is no longer possible by construction. `plugin-author`, the skill that enforced this
invariant, is deleted per ADR-0015 rather than adapted. Kept below as the historical record of
the pre-APM decision.
---
Each plugin has two manifests: `plugin.json` (Copilot CLI) and `.claude-plugin/plugin.json` (Claude Code). Both tools support a `version` field. Prior to this decision, only the CC manifest carried `version`; the Copilot manifest omitted it. Each plugin has two manifests: `plugin.json` (Copilot CLI) and `.claude-plugin/plugin.json` (Claude Code). Both tools support a `version` field. Prior to this decision, only the CC manifest carried `version`; the Copilot manifest omitted it.
We now require `version` in both manifests, always identical. A reader of `plugin.json` alone should be able to determine the plugin version without consulting the CC manifest. The `plugin-author` skill enforces this invariant on every create, update, and release operation. We now require `version` in both manifests, always identical. A reader of `plugin.json` alone should be able to determine the plugin version without consulting the CC manifest. The `plugin-author` skill enforces this invariant on every create, update, and release operation.

View File

@@ -5,6 +5,21 @@ claim that "both files share a single `agents/sources.md` for provenance." The r
ADR-0005 (dual-provider generation, scope detection, single-root script interface) is ADR-0005 (dual-provider generation, scope detection, single-root script interface) is
unaffected and remains in force. unaffected and remains in force.
**Path update per ADR-0016:** at plugin scope, agent files no longer live at
`<plugin-root>/agents/<name>.md`. The authoring source is now
`<plugin-root>/.apm/agents/<name>.agent.md` — a single vendor-neutral file (no dual Claude/
Copilot pair) compiled to both targets via `apm pack`. See ADR-0016 for why (the field-dropping
rationale, `tools:` incompatibility, the compiled-output mechanics) — not restated here. This
ADR's own conclusion is unaffected by that move: the provenance file still belongs at
`<plugin-root>/sources.md`, outside any directory `claude plugin validate --strict`
auto-scans, and `.apm/agents/` is, if anything, further removed from plugin-root than the old
flat `agents/` directory was, so the reasoning below still holds. References below to
`<plugin-root>/agents/` describe the pre-APM layout in effect when this decision was made.
**Scope boundary (per ADR-0016):** this path change is plugin scope only. Project scope
(`.claude/agents/` + `.github/agents/`) and user scope (`~/.claude/agents/` +
`~/.copilot/agents/`) are unaffected — they are not APM packages and keep the dual-file
Claude+Copilot pair model this ADR originally described.
`claude plugin validate --strict` auto-discovers every `.md` file directly under a plugin's `claude plugin validate --strict` auto-discovers every `.md` file directly under a plugin's
`agents/` directory and treats it as an agent definition requiring YAML frontmatter (`name`, `agents/` directory and treats it as an agent definition requiring YAML frontmatter (`name`,
`description`, etc.). A flat provenance file at `agents/sources.md` — no frontmatter, by `description`, etc.). A flat provenance file at `agents/sources.md` — no frontmatter, by

View File

@@ -1,7 +1,9 @@
# Microsoft APM replaces the hand-authored plugin/marketplace model as this repo's authoring source of truth # Microsoft APM replaces the hand-authored plugin/marketplace model as this repo's authoring source of truth
**Will supersede:** ADR-0001 ("Skills are distributed via plugins... each plugin contains its **Status: executed (2026-08-12, issue #90).** All six plugins now carry `apm.yml` + `.apm/` as
own `skills/` directory") — once issue #90's conversion actually executes; not yet in effect. their authoring source; `.claude-plugin/marketplace.json` and every plugin's `plugin.json` are
`apm pack`-compiled output. **Supersedes ADR-0001** ("Skills are distributed via plugins... each
plugin contains its own `skills/` directory") — in effect.
This repo replaces its hand-maintained Claude Code plugin/marketplace authoring model This repo replaces its hand-maintained Claude Code plugin/marketplace authoring model
(`.claude-plugin/marketplace.json` + per-plugin `plugin.json`) with Microsoft APM (`apm.yml` + (`.claude-plugin/marketplace.json` + per-plugin `plugin.json`) with Microsoft APM (`apm.yml` +
@@ -31,10 +33,9 @@ new hand-maintained manifest format.
and per-provider `plugin.json` files become **compiled output** via `apm compile`/`apm pack`, and per-provider `plugin.json` files become **compiled output** via `apm compile`/`apm pack`,
generated from `apm.yml` + `.apm/` per plugin, extensible to other `apm runtime`-supported generated from `apm.yml` + `.apm/` per plugin, extensible to other `apm runtime`-supported
providers without hand-maintaining a separate manifest per provider. providers without hand-maintaining a separate manifest per provider.
- **This will supersede ADR-0001** ("Skills are distributed via plugins... each plugin - **This supersedes ADR-0001** ("Skills are distributed via plugins... each plugin
contains its own `skills/` directory"), but not yet — supersession is pending on issue #90's contains its own `skills/` directory"). Executed in issue #90: skills and agents physically moved
conversion. Once that real conversion executes, skills and agents physically move to to `plugins/<name>/.apm/skills/` and `plugins/<name>/.apm/agents/*.agent.md`.
`plugins/<name>/.apm/skills/` and `plugins/<name>/.apm/agents/*.agent.md`.
- New operational tooling — `apm-install` (skill), `apm-workflow` (skill), `apm-orchestrate` - New operational tooling — `apm-install` (skill), `apm-workflow` (skill), `apm-orchestrate`
(agent) — lands in `kyberforge`, tracked in issue #88 (agent) — lands in `kyberforge`, tracked in issue #88
(https://git.dev.rkdr.net/Defame1297/holocron/issues/88). (https://git.dev.rkdr.net/Defame1297/holocron/issues/88).
@@ -49,13 +50,11 @@ new hand-maintained manifest format.
routing: `apm compile`/`apm pack` will generate `.claude-plugin/marketplace.json` and routing: `apm compile`/`apm pack` will generate `.claude-plugin/marketplace.json` and
per-provider `plugin.json` directly from `apm.yml` + `.apm/`, so `apm-install`/`apm-workflow`/ per-provider `plugin.json` directly from `apm.yml` + `.apm/`, so `apm-install`/`apm-workflow`/
`apm-orchestrate` (issue #88, already landed on this branch) fully replace what these two skills `apm-orchestrate` (issue #88, already landed on this branch) fully replace what these two skills
did. Deleting `plugin-author`/`marketplace-author` is part of issue #90's execution, not #89's. did. `plugin-author`/`marketplace-author` were deleted in issue #90's execution.
- Actually translating the existing plugins into `apm.yml` + `.apm/` and running the real - Translating the existing plugins into `apm.yml` + `.apm/` and running the real conversion was
conversion is deferred to issue #90 executed in issue #90 (https://git.dev.rkdr.net/Defame1297/holocron/issues/90, closed).
(https://git.dev.rkdr.net/Defame1297/holocron/issues/90). - `CONTEXT.md`'s "Plugin"/"Plugin marketplace" glossary entries were rewritten in issue #90 to
- `CONTEXT.md`'s "Plugin"/"Plugin marketplace" glossary entries get a forward-pointer to this describe the compiled-output model directly, rather than carrying a forward-pointer to this ADR.
ADR so a session-start read surfaces the pending change; their substantive definitions remain
accurate until issue #90's conversion actually executes — this ADR does not rewrite them.
## Considered options ## Considered options
@@ -89,27 +88,36 @@ correction) sorted what they document into three buckets:
because of hand-authored dual manifests (ADR-0006's version-parity/patch-bump rule, the because of hand-authored dual manifests (ADR-0006's version-parity/patch-bump rule, the
CC-vs-Copilot field-placement split, dual-file mirroring) are obsolete under `apm.yml`'s CC-vs-Copilot field-placement split, dual-file mirroring) are obsolete under `apm.yml`'s
single-manifest model and were deliberately dropped. single-manifest model and were deliberately dropped.
- **Holocron policy choice — flagged for #90, not resolved here.** `marketplace-author`'s - **Holocron policy choice — resolved in #90.** `marketplace-author`'s catalog-version convention
catalog-version convention (minor bump for package add/remove, patch bump for field-only (minor bump for package add/remove, patch bump for field-only updates) isn't an APM mechanic —
updates) isn't an APM mechanic — `apm` doesn't enforce it — but it's still a meaningful holocron `apm` doesn't enforce it, and has no native version-bump automation at all — so rather than
policy worth re-applying to `apm.yml`'s `marketplace.packages[].version` field once #90 wires up building a new script, the convention is now documented as guidance inside `apm-workflow`'s
real marketplace authoring. Where/how that gets implemented is #90's decision, not this ADR's. reference docs (`references/marketplace.md` for the root catalog version rule,
`references/configure.md` for the per-package version-bump-on-content-edit rule), applied
manually by whoever edits `apm.yml`.
## Consequences ## Consequences
- ADR-0001 is superseded once issue #90 executes. - ADR-0001 is superseded (issue #90).
- ADR-0006 (plugin-version-parity) becomes moot once #90 lands: `plugin.json`/`marketplace.json` - ADR-0006 (plugin-version-parity) is moot (issue #90): `plugin.json`/`marketplace.json` are now
become compiled output of a single `apm.yml`, so there's no second hand-authored file left to compiled output of a single `apm.yml`, so there's no second hand-authored file left to keep in
keep in parity, and `plugin-author` — the skill that enforced ADR-0006 — is deleted rather than parity, and `plugin-author` — the skill that enforced ADR-0006 — was deleted rather than adapted
adapted (see "Content migration" above). Not resolved by this ADR. (see "Content migration" above).
- ADR-0010 (agent sources relocated outside agents dir) needs revisiting once agents move to - ADR-0010 (agent sources relocated outside agents dir) was updated (issue #90) for agents now
`plugins/<name>/.apm/agents/` — the directory path changes, not the pre-existing `.agent.md` living at `plugins/<name>/.apm/agents/*.agent.md` — the directory path changed; the pre-existing
extension convention (ADR-0005/ADR-0010, unaffected) — not resolved by this ADR. `.agent.md` extension convention (ADR-0005/ADR-0010) and project/user scope are unaffected, per
- ADR-0014 (Vale prefilter ships from the plugin) has hardcoded path regexes assuming ADR-0016.
`plugins/<name>/skills/...`/`plugins/<name>/agents/...`; these will need updating once paths - ADR-0014 (Vale prefilter ships from the plugin) had its hardcoded path regexes
move under `.apm/` — not resolved by this ADR. (`plugins/<name>/skills/...`/`plugins/<name>/agents/...`) updated for the `.apm/` nesting as part
- `kyberforge` gains three new artifacts (issue #88) before any conversion of existing content of issue #90's execution.
happens. - `kyberforge` gained three new artifacts (issue #88) before any conversion of existing content
- Two follow-up issues track the remaining work: #89 (`skill-author`/`agent-author` routing happened, then lost two (`plugin-author`/`marketplace-author`, deleted once issue #90 verified
adaptation) and #90 (the actual repo conversion, which also deletes `plugin-author`/ parity) — net version bump 1.3.1 → 1.4.0. The root marketplace catalog bumped 0.3.1 → 0.3.2 to
`marketplace-author`). match.
- ADR-0016 (a narrower decision discovered while designing issue #89) turned out to gate how
issue #90 had to re-author plugin-scope agents: `.apm/agents/*.agent.md` compiles verbatim to
both Claude and Copilot, so those files carry only `name`/`description`/`model`/`source_keys` —
existing dual-file `<name>.md`+`<name>.agent.md` pairs could not be raw-moved, only re-authored.
- Two follow-up issues tracked the remaining work, both done: #89 (`skill-author`/`agent-author`
routing adaptation, merged in #93) and #90 (the actual repo conversion, which also deleted
`plugin-author`/`marketplace-author`).

View File

@@ -1,12 +1,21 @@
{ {
"author": { "author": {
"email": "defame1297@rkdr.net",
"name": "Defame1297", "name": "Defame1297",
"url": "https://git.dev.rkdr.net/Defame1297/" "url": "https://git.dev.rkdr.net/Defame1297/"
}, },
"description": "A place for things to be binned", "description": "A place for things to be binned",
"displayName": "bin",
"keywords": [],
"license": "MIT", "license": "MIT",
"mcpServers": {
"obsidian": {
"args": [
"@bitbonsai/mcpvault@latest",
"docs/"
],
"command": "npx",
"type": "stdio"
}
},
"name": "bin", "name": "bin",
"version": "1.1.1" "version": "1.1.1"
} }

11
plugins/bin/.github/plugin/plugin.json vendored Normal file
View File

@@ -0,0 +1,11 @@
{
"author": {
"email": "defame1297@rkdr.net",
"name": "Defame1297",
"url": "https://git.dev.rkdr.net/Defame1297/"
},
"description": "A place for things to be binned",
"license": "MIT",
"name": "bin",
"version": "1.1.1"
}

26
plugins/bin/apm.yml Normal file
View File

@@ -0,0 +1,26 @@
name: bin
version: 1.1.1
description: A place for things to be binned
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
license: MIT
keywords: []
# Constrains what .apm/ may contain: instructions, skill, hybrid, or prompts
type: skill
# 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
dependencies:
apm: []
mcp: []
includes: auto
devDependencies:
apm: []
scripts: {}

View File

@@ -1,15 +1,12 @@
{ {
"author": { "author": {
"email": "defame1297@rkdr.net", "email": "defame1297@rkdr.net",
"name": "Defame1297" "name": "Defame1297",
"url": "https://git.dev.rkdr.net/Defame1297/"
}, },
"description": "A place for things to be binned", "description": "A place for things to be binned",
"keywords": [], "keywords": [],
"license": "MIT", "license": "MIT",
"mcpServers": ".mcp.json",
"name": "bin", "name": "bin",
"skills": [
"skills/"
],
"version": "1.1.1" "version": "1.1.1"
} }

View File

@@ -18,7 +18,7 @@ git clone https://github.com/bats-core/bats-assert tests/test_helper/bats-assert
Run all tests for this skill (from the repo root): Run all tests for this skill (from the repo root):
```bash ```bash
bats plugins/core/skills/agentsmd-audit/tests/ bats plugins/core/.apm/skills/agentsmd-audit/tests/
``` ```
## Files ## Files

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bats #!/usr/bin/env bats
setup() { setup() {
REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../" && pwd)" REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../../" && pwd)"
load "$REPO_ROOT/tests/test_helper/bats-support/load" load "$REPO_ROOT/tests/test_helper/bats-support/load"
load "$REPO_ROOT/tests/test_helper/bats-assert/load" load "$REPO_ROOT/tests/test_helper/bats-assert/load"

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bats #!/usr/bin/env bats
setup() { setup() {
REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../" && pwd)" REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../../" && pwd)"
load "$REPO_ROOT/tests/test_helper/bats-support/load" load "$REPO_ROOT/tests/test_helper/bats-support/load"
load "$REPO_ROOT/tests/test_helper/bats-assert/load" load "$REPO_ROOT/tests/test_helper/bats-assert/load"

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bats #!/usr/bin/env bats
setup() { setup() {
REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../" && pwd)" REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../../" && pwd)"
load "$REPO_ROOT/tests/test_helper/bats-support/load" load "$REPO_ROOT/tests/test_helper/bats-support/load"
load "$REPO_ROOT/tests/test_helper/bats-assert/load" load "$REPO_ROOT/tests/test_helper/bats-assert/load"

View File

@@ -18,7 +18,7 @@ git clone https://github.com/bats-core/bats-assert tests/test_helper/bats-assert
Run all tests for this skill (from the repo root): Run all tests for this skill (from the repo root):
```bash ```bash
bats plugins/core/skills/provider-adapter-author/tests/ bats plugins/core/.apm/skills/provider-adapter-author/tests/
``` ```
## Files ## Files

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bats #!/usr/bin/env bats
setup() { setup() {
REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../" && pwd)" REPO_ROOT="$(cd "$BATS_TEST_DIRNAME/../../../../../../" && pwd)"
load "$REPO_ROOT/tests/test_helper/bats-support/load" load "$REPO_ROOT/tests/test_helper/bats-support/load"
load "$REPO_ROOT/tests/test_helper/bats-assert/load" load "$REPO_ROOT/tests/test_helper/bats-assert/load"

View File

@@ -1,10 +1,10 @@
{ {
"author": { "author": {
"email": "defame1297@rkdr.net",
"name": "Defame1297", "name": "Defame1297",
"url": "https://git.dev.rkdr.net/Defame1297/" "url": "https://git.dev.rkdr.net/Defame1297/"
}, },
"description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.", "description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.",
"displayName": "Core",
"keywords": [ "keywords": [
"cross-cutting", "cross-cutting",
"triage", "triage",

18
plugins/core/.github/plugin/plugin.json vendored Normal file
View File

@@ -0,0 +1,18 @@
{
"author": {
"email": "defame1297@rkdr.net",
"name": "Defame1297",
"url": "https://git.dev.rkdr.net/Defame1297/"
},
"description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.",
"keywords": [
"cross-cutting",
"triage",
"diagnose",
"architecture",
"debug"
],
"license": "MIT",
"name": "core",
"version": "1.1.0"
}

32
plugins/core/apm.yml Normal file
View File

@@ -0,0 +1,32 @@
name: core
version: 1.1.0
description: Cross-cutting utility skills for everyday AI-assisted coding — triage, diagnosis, architecture review, and session navigation.
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
license: MIT
keywords:
- cross-cutting
- triage
- diagnose
- architecture
- debug
# Constrains what .apm/ may contain: instructions, skill, hybrid, or prompts
type: skill
targets:
- claude
- copilot
# "auto" publishes the authoritative local source layout, or list explicit
# repo paths to define the complete publication set.
includes: auto
dependencies:
apm: []
mcp: []
devDependencies:
apm: []
scripts: {}

View File

@@ -1,10 +1,10 @@
{ {
"author": { "author": {
"email": "defame1297@rkdr.net", "email": "defame1297@rkdr.net",
"name": "Defame1297" "name": "Defame1297",
"url": "https://git.dev.rkdr.net/Defame1297/"
}, },
"description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.", "description": "Cross-cutting utility skills for everyday AI-assisted coding \u2014 triage, diagnosis, architecture review, and session navigation.",
"hooks": "hooks.json",
"keywords": [ "keywords": [
"cross-cutting", "cross-cutting",
"triage", "triage",
@@ -13,10 +13,6 @@
"debug" "debug"
], ],
"license": "MIT", "license": "MIT",
"mcpServers": ".mcp.json",
"name": "core", "name": "core",
"skills": [
"skills/"
],
"version": "1.1.0" "version": "1.1.0"
} }

View File

@@ -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. 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: source_keys:
- context7-git-htmldocs - context7-git-htmldocs
- git-scm-docs - git-scm-docs
@@ -12,7 +10,6 @@ source_keys:
- git-scm-submodule-docs - git-scm-submodule-docs
- git-scm-remote-docs - git-scm-remote-docs
- conventional-commits-spec - 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 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: When invoked, you:
1. Parse the incoming workflow request (operation type, parameters, context overrides) 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` 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 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 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 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` 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 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 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) 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 7. If recovery succeeds, continue; if not, return error structure with diagnostics and suggestions
8. Aggregate all outputs and return as structured JSON 8. Aggregate all outputs and return as structured JSON
## Output ## 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>"]
}
}
```

Some files were not shown because too many files have changed in this diff Show More