Compare commits
4 Commits
feat/66-wi
...
198eafd790
| Author | SHA1 | Date | |
|---|---|---|---|
| 198eafd790 | |||
| 629320b8fd | |||
| edcc57c0d6 | |||
| 9eb8bc7e48 |
@@ -15,8 +15,6 @@ This file carries only what applies to **every** session. Setup, prerequisites,
|
|||||||
|
|
||||||
Not everything in a plugin root is generated. `README.md`, `docs/`, `bin/`, `sources.md`, `.mcp.json` and per-plugin extras are hand-authored there with no `.apm/` source — edit those in place. The rule is per-path, not per-directory. But a file placed *inside* a mirrored directory is deleted on the next sync (`sync_dir` runs `rm -rf` before every copy), so plugin-root documentation goes in `docs/`, never in `hooks/` or `skills/`.
|
Not everything in a plugin root is generated. `README.md`, `docs/`, `bin/`, `sources.md`, `.mcp.json` and per-plugin extras are hand-authored there with no `.apm/` source — edit those in place. The rule is per-path, not per-directory. But a file placed *inside* a mirrored directory is deleted on the next sync (`sync_dir` runs `rm -rf` before every copy), so plugin-root documentation goes in `docs/`, never in `hooks/` or `skills/`.
|
||||||
|
|
||||||
`.mcp.json` is hand-authored but it is **not** outside apm. MCP is a first-class apm primitive, and a plugin's `.mcp.json` is how this repo declares one: apm reads the `mcpServers` pointer in the generated `.github/plugin/plugin.json`, resolves it to `.mcp.json`, and injects the result into that package's `dependencies.mcp` when a consumer installs it. Declare MCP servers there and **never** in the plugin's own `apm.yml` — that arms a per-package gate this repo cannot satisfy (`LESSONS.md`, 2026-09-12).
|
|
||||||
|
|
||||||
Full model: `docs/spec/architecture.md`.
|
Full model: `docs/spec/architecture.md`.
|
||||||
|
|
||||||
## Prefer plugin skills over raw shell
|
## Prefer plugin skills over raw shell
|
||||||
|
|||||||
198
LESSONS.md
198
LESSONS.md
@@ -10,254 +10,122 @@ Patterns observed during development of this repo. Three or more entries on the
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2026-09-12 — "Not an `.apm/` primitive" was read as "not an apm primitive", and the review that followed was wrong
|
|
||||||
|
|
||||||
`AGENTS.md` and `docs/spec/architecture.md` both listed `.mcp.json` alongside `README.md`, `docs/` and `bin/` as plugin-root material "hand-authored with no `.apm/` source". That is literally true — nothing under `.apm/` produces MCP config — but it reads as "apm has no MCP concept", and a review of PR #132 drew exactly that conclusion and recommended moving the declaration into the plugin's `apm.yml` under `dependencies.mcp`. The recommendation was wrong twice over. It arms `lockfile-exists` in the per-package `apm audit --ci` that the `apm-audit-ci` hook runs in every `plugins/*/`, which then demands the package's whole deployed tree inside the package directory: 93 missing files and 79 drifted paths on `plugins/gitea`. And it was unnecessary, because the `.mcp.json` route already reaches `dependencies.mcp` through the `mcpServers` pointer in the generated Copilot manifest, env references intact.
|
|
||||||
|
|
||||||
Two process lessons, not one. First, when a doc says a file is not a primitive **of a specific subsystem**, say which subsystem and what the file actually is instead — the negative claim alone invites the wrong generalisation. Second, the three scratch installs that produced the wrong conclusion all used local `./path` dependencies, where apm skips the plugin-normalisation step that injects `.mcp.json`. The repo consumes its plugins as `git:` + `path:` objects. A scratch test that does not reproduce the real dependency form can invert the result, so reproduce the form, not just the shape.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2026-05-17 — Workflow documents should prescribe sub-agent usage, not just allow it
|
|
||||||
|
|
||||||
When writing workflow documents (like `docs/notes/skill-implementation-workflow.md`), the natural tendency is to describe steps at a high level and leave sub-agent usage as an implementation detail. But if the workflow doesn't explicitly prescribe "spawn a sub-agent here," practitioners default to doing everything in the main context — accumulating token cost and losing the isolation benefit. Fix: make sub-agent usage a named step in the workflow, specifying what the agent receives, what it returns, and why it's isolated. This makes the workflow reproducible rather than dependent on the practitioner remembering to use agents.
|
|
||||||
|
|
||||||
## 2026-05-17 — Conflict check before synthesis grill, not during
|
|
||||||
|
|
||||||
When combining upstream sources into a skill, conflicts with governing documents (AI constitution, factory principles) tend to surface in the middle of the synthesis grill — disrupting the combining discussion and requiring context switches. Fix: run a dedicated conflict-check step before the grill. A sub-agent reads the governing documents, checks the upstream content against them, and returns a numbered list of tensions. The grill then starts with those items as explicit agenda points, making it faster and more systematic. An empty conflict list is also valuable — it confirms the upstreams are clean before co-writing begins.
|
|
||||||
|
|
||||||
## 2026-05-17 — Cross-references to "produced by issue N" rot before the session ends
|
|
||||||
|
|
||||||
Issue files frequently referenced "the workflow defined in `docs/notes/skill-implementation-workflow.md` (produced by issue 0016)." Within the same session that closes issue 0016, that parenthetical is already stale — the document exists and is the authoritative reference. Fix: reference the document path directly, not the issue that produced it. The git history records the producing issue; cross-references should point to the artifact that persists.
|
|
||||||
|
|
||||||
## 2026-05-17 — "Read at session start" is a behavioral hope, not a guarantee
|
|
||||||
|
|
||||||
The repo CLAUDE.md instructs agents to read CONTEXT.md at session start, but agents skip this in practice — defaulting to reading only what's directly relevant to the immediate prompt (e.g. the skills folder). The governance.md works because `@import` is technically enforced by Claude Code. Fix: (1) add `@CONTEXT.md` to repo CLAUDE.md using `@import` to make it always-loaded; (2) add a "Key decisions" section to CONTEXT.md with one-line resolved-ADR summaries so locked choices are always in context.
|
|
||||||
|
|
||||||
**Status (2026-08-14): neither part landed.** Root `CLAUDE.md` imports `@AGENTS.md` only — no `@CONTEXT.md` — and `CONTEXT.md` has no "Key decisions" section. The behavioral hope this entry diagnosed is still the only mechanism in place: `AGENTS.md` carries the line "Read `CONTEXT.md` at the start of every session," which is loaded but is itself an instruction, not an import. The proposal above is open work, not a record of a completed change.
|
|
||||||
|
|
||||||
## 2026-05-17 — Instruction rules lose to RLHF defaults without specificity
|
## 2026-05-17 — Instruction rules lose to RLHF defaults without specificity
|
||||||
|
|
||||||
Behavioral tests (2026-05-17) showed three communication/behavior rules failing: exploratory question format (gave verbose multi-bullet answer instead of 2-3 sentences), file edit intent (asked for clarification instead of stating intent and proceeding), and push confirmation (went straight to tool call instead of asking first). All three rules are present in `providers/claude-code/CLAUDE.md` as one-liner statements. The RLHF-trained defaults (thorough answers, risk-averse clarification seeking, fast execution) consistently outcompete thin rules. Fix: rewrite failing rules with specificity, a counter-example, and a boundary statement — not just a single-line imperative.
|
Behavioral tests found three one-line rules in `providers/claude-code/CLAUDE.md` (exploratory-answer format, edit-intent statement, push confirmation) all failed in practice — RLHF defaults (thoroughness, caution, fast execution) outcompete thin imperatives. Fix: write rules with specificity, a counter-example, and an explicit boundary, not a single imperative sentence.
|
||||||
|
|
||||||
## 2026-05-17 — Secrets rule gap: response text not covered
|
## 2026-05-17 — Secrets rule gap: response text not covered
|
||||||
|
|
||||||
The secrets prohibition in `core/instructions/governance.md` fired correctly when asked to write a password to a file, but the agent then reproduced the literal credential in its response text (in a shell `export` example). The rule was interpreted as "don't write to files" not "don't output at all." Fix: the rule needs to explicitly state "never produce the credential value in any output" and give an example showing placeholder usage (`export DB_PASSWORD='<your-password>'`).
|
The governance.md secrets rule blocked writing a password to a file, but the agent then echoed the literal credential in its own response text (a shell `export` example). The rule read as "don't write files," not "don't output at all." Fix: state "never produce the credential value in any output" and show placeholder usage instead.
|
||||||
|
|
||||||
## 2026-05-17 — Synthesis grill and SKILL.md co-write are two separate conversations
|
|
||||||
|
|
||||||
The synthesis grill (step 4) answers schema-level questions: how to combine upstreams, which eval schema to use, merge behaviour. Step 5b is a different conversation: how upstream content maps to each SKILL.md body section, what options each section had, and which was chosen. Collapsing them — writing the SKILL.md immediately after the grill without a per-section walk-through — means the human never sees the upstream options for the body and has no opportunity to redirect before the file is written. Fix: step 5b is now a named gate in the workflow. Walk through every body section one at a time, cite the upstream source, present alternatives, get confirmation. Only then write. Applies to both hand-written (bootstrap) and write-skill-produced skills.
|
|
||||||
|
|
||||||
## 2026-05-17 — Skill-calls-skill composition must be a named process step
|
|
||||||
|
|
||||||
When a skill invokes another skill as part of its work (e.g. write-skill invoking write-eval to produce the eval), that call must be a numbered step in the Process section — not left as an implicit external workflow step. If it isn't named, practitioners either forget it or do it manually outside the skill, breaking the composition chain. The user caught this during the write-skill co-write; it was absent from the process despite being in the workflow doc. Fix: when designing any skill that composes another, list each composed call explicitly as a numbered step with a "do not mark complete until X exists" constraint.
|
|
||||||
|
|
||||||
## 2026-05-17 — AGPL-3.0 repos appear prominently in community skill search results
|
|
||||||
|
|
||||||
When searching GitHub for agent skill upstreams, AGPL-3.0 repos (e.g. dceoy/speckit-agent-skills) appear alongside permissive-licensed ones without obvious visual distinction. AGPL imposes copyleft obligations on adopted content. Always run a licence check (GitHub API `/license` endpoint) before extracting any content from a new upstream. An AGPL finding is a hard exclude — record the repo, SHA, and licence in source review notes so future sessions don't re-review it.
|
|
||||||
|
|
||||||
## 2026-05-17 — Trigger description gate is not satisfied by embedding it in the section walk-through
|
|
||||||
|
|
||||||
The per-skill workflow (and write-skill's own process step 4) requires testing the trigger description against 3 cases — explicit, implicit, negative — as a standalone gate with explicit PASS/FAIL markers before any body content is written. During write-docs (issue 0018 phase 2), the trigger description was included in the section walk-through (step 5b) rather than tested first as a named gate. The gate never had explicit pass/fail output, which means neither the human nor the agent confirmed the trigger was sound before section content was written. Fix: treat the trigger test as a numbered standalone step with per-case PASS/FAIL output before step 5b begins. A section walk-through that happens to include the description field is not a substitute.
|
|
||||||
|
|
||||||
## 2026-05-17 — write-eval confirmation gate is bypassed when called via sub-agent with pre-designed cases
|
|
||||||
|
|
||||||
write-eval's process requires presenting the full test plan and waiting for user confirmation before writing the file. When write-eval is invoked by passing pre-designed test cases directly to a write sub-agent, this gate is skipped — the file is written before the user sees the plan. This happened during write-docs (issue 0018 phase 2). Fix: when orchestrating write-eval as part of a larger workflow, split into two steps: (1) sub-agent proposes test cases and returns to the main conversation; (2) after user confirmation, sub-agent writes the file. Or: design cases in the main conversation, present them to the user, then spawn the write agent. The plan-then-write separation is the gate — collapsing it into a single sub-agent call silently removes it.
|
|
||||||
|
|
||||||
## 2026-05-18 — Skill body sections were cargo-culted, not spec-defined
|
|
||||||
|
|
||||||
The write-skill authoring standard required 8 body sections including Role and When/When not. These were assumed to be agentskills.io requirements. Checking the actual spec revealed the body has no format restrictions at all — recommended sections are step-by-step instructions, examples, and edge cases. Role and When/When not were added by convention without verifying the standard. Fix: before encoding any requirement as part of an authoring standard, check the upstream spec directly. The agentskills.io spec also confirmed that negative triggers belong in the description field — not in a separate body section — which eliminates a persistent duplication pattern across all skills.
|
|
||||||
|
|
||||||
## 2026-05-18 — Copy-fill is more deterministic than generate for structured skill artifacts
|
|
||||||
|
|
||||||
When a skill produces a structured artifact like SKILL.md, the natural approach is to generate it from internalized rules in the Process section. But this means section structure is only as reliable as the agent's instruction-following under token pressure. Copy-fill (copy the template to the target path, then fill in content) separates structure from content: the template mechanically enforces section order and presence, freeing the Process section to focus only on sequencing constraints (what order to decide things) rather than also policing structure. Side benefit: the template is a human-usable artifact that can be adopted independently of the skill. Fix applied in write-skill refactor: SKILL-TEMPLATE.md is the authoritative structure source; the Process section no longer contains a body structure constraint — the template handles it.
|
|
||||||
|
|
||||||
## 2026-05-17 — HITL gap: agent delegates confirmation to permission system
|
## 2026-05-17 — HITL gap: agent delegates confirmation to permission system
|
||||||
|
|
||||||
The agent-level HITL rule ("require explicit confirmation before irreversible shared-state operations") is being bypassed: the agent calls the tool and lets the permission dialog catch it. This means the rule is not firing in agent reasoning — it's the permission system acting as a safety net. If a user selects "don't ask again," the net disappears. Fix: the HITL rule needs to be framed as "do not call the tool" rather than "ask before proceeding" — the agent must ask first, then act only after explicit confirmation.
|
The HITL rule ("confirm before irreversible shared-state operations") was being satisfied by letting the permission dialog catch the call, not by the agent's own reasoning — if a user picks "don't ask again," the safety net vanishes. Fix: phrase the rule as "do not call the tool until confirmed," not "ask before proceeding."
|
||||||
|
|
||||||
## 2026-05-26 — Overlap checks must scan the deployed directory, not just the source repo
|
## 2026-05-26 — Overlap checks must scan the deployed directory, not just the source repo
|
||||||
|
|
||||||
`write-a-skill` existed only in `~/.agents/skills/` (installed from a pre-refactor source) and was invisible during a repo-level scan of `.agents/skills/`. Governance reviews and overlap checks that only look at the source repo will miss skills added by install.sh from other sources or prior runs. Fix: overlap checks must scan the deployed `~/.agents/skills/` directory, not just the repo's `.agents/skills/`.
|
A skill installed only to `~/.agents/skills/` (not the repo's `.agents/skills/`) was invisible to a repo-level overlap scan. Skills added by `install.sh` or prior runs live in the deployed directory, not just the source. Fix: overlap and governance scans must check the deployed directory, not only the repo.
|
||||||
|
|
||||||
## 2026-05-26 — `model:` field belongs in SKILL.md frontmatter, not a sidecar file
|
## 2026-05-26 — `model:` field belongs in SKILL.md frontmatter, not a sidecar file
|
||||||
|
|
||||||
Claude Code supports `model:` as a provider extension in SKILL.md frontmatter — it overrides the session model for the skill's turn and reverts after. Attempting to move it out to a provenance sidecar was wrong: a sidecar is audit metadata, not runtime config. The boundary: if a field affects agent behaviour at invocation time, it belongs in SKILL.md frontmatter.
|
`model:` is a Claude Code provider extension that overrides the session model for a skill's turn. Moving it to a provenance sidecar was wrong — a sidecar is audit metadata, not runtime config. Rule: if a field affects invocation-time behaviour, it belongs in SKILL.md frontmatter, not a sidecar.
|
||||||
|
|
||||||
## 2026-05-26 — Research agents present synthesis as spec fact
|
## 2026-05-26 — Research agents present synthesis as spec fact
|
||||||
|
|
||||||
When asked to research skill sub-file best practices, the research sub-agent reported "Process goes in SKILL.md. Context goes in reference files" as if it were verbatim from the Claude Code docs or the Agent Skills spec. Checking agentskills.io directly showed the spec says: "There are no format restrictions" on the body. The principle is a reasonable synthesis, not a quoted rule — but it nearly landed in write-skill's constraints as authoritative spec language. Fix: always verify research agent claims against the primary source before encoding them as rules, especially for spec or documentation claims. Plausible synthesis is the hardest fabrication to catch because it's often correct in spirit.
|
A research sub-agent reported "Process goes in SKILL.md, context in reference files" as if quoted from the agentskills.io spec; the spec actually says there are no body format restrictions. Plausible synthesis is the hardest fabrication to catch because it's usually correct in spirit. Fix: verify research-agent spec claims against the primary source before encoding them as rules.
|
||||||
|
|
||||||
## 2026-06-21 — `claude plugin validate --strict` is absent from the standard test sweep
|
## 2026-06-21 — `claude plugin validate --strict` is absent from the standard test sweep
|
||||||
|
|
||||||
When running a full test audit, `claude plugin validate --strict` was not included in the initial agent sweep — only discovered mid-session when the user flagged the gap. The command catches warnings that normal mode tolerates (missing `version` fields, non-agent `.md` files in `agents/`) and will cause CI to fail when strict mode is enforced in Chunk 6. Fix: include `claude plugin validate --strict` on all plugin paths and marketplace manifests as a named step in any plugin audit. It belongs in the pre-push hook alongside `check-manifests.sh` — currently only `check-manifests.sh` runs there. See `tests/test-plugin-validate.sh` (pending, Gitea issue #2).
|
`claude plugin validate --strict` was left out of the standard plugin audit sweep and only discovered when the user flagged the gap. It catches warnings (missing `version` fields, stray non-agent `.md` files) that will fail CI once strict mode is enforced. Fix: run it on every plugin path and marketplace manifest as a named audit step.
|
||||||
|
|
||||||
## 2026-06-21 — Source and deployed gitleaks configs can silently diverge
|
## 2026-06-21 — Source and deployed gitleaks configs can silently diverge
|
||||||
|
|
||||||
`scripts/gitleaks.toml` (source, in git, deployed to repo root by `setup-gitleaks.sh`) and `.gitleaks.toml` (deployed root copy, read by the hook, also tracked in git) were found with different allowlist states — someone had updated the deployed file directly without updating the source. Running `setup-gitleaks.sh` again would overwrite the deployed file with the stale source, silently deleting the existing allowlist and re-exposing a known false positive as a blocking pre-commit failure. Fix: treat `scripts/gitleaks.toml` as the single source of truth; never edit `.gitleaks.toml` directly. When making allowlist changes, always update source and deployed copy together in the same commit. Longer-term fix: `setup-gitleaks.sh` should merge rather than overwrite, or detect divergence and warn when `.gitleaks.toml` is tracked in git.
|
`scripts/gitleaks.toml` (source) and `.gitleaks.toml` (deployed, hook-read) drifted after someone edited the deployed copy directly; rerunning `setup-gitleaks.sh` would have overwritten it, silently deleting the allowlist. Fix: treat the source as sole truth, never hand-edit the deployed copy, and update both together in the same commit.
|
||||||
|
|
||||||
## 2026-06-21 — `shellcheck` without `-x` blocks pre-commit on any script using `source` (LEGACY SHELL HOOKS)
|
## 2026-06-21 — `shellcheck` without `-x` blocks pre-commit on scripts using `source` (historical)
|
||||||
|
|
||||||
**Status:** Historical. Shell-hook-based pre-commit was replaced by pre-commit framework (Chunk 5, .pre-commit-config.yaml). Modern repos no longer affected. Documented for reference when supporting legacy repos.
|
Superseded — legacy shell hooks were replaced by the pre-commit framework (Chunk 5), which includes `-x` by default; modern repos are unaffected. Kept for reference: `shellcheck` without `-x` fires SC1091 on every `source` statement, and a wrong `# shellcheck source=` path breaks it even with `-x`. Verify with `shellcheck -x <file>` when supporting legacy scripts.
|
||||||
|
|
||||||
The pre-commit hook ran `shellcheck "$f"` without `-x`. Without `-x`, shellcheck fires SC1091 for every `source` statement and exits non-zero, blocking the commit. This was a latent bug in legacy shell hooks, only triggered when `install.sh` (which sources `deploy-manifest.sh`) was staged for the first time. Compounding it: the `# shellcheck source=` directive in `install.sh` pointed to `deploy-manifest.sh` (bare filename, resolved from CWD = repo root) rather than `scripts/deploy-manifest.sh` (correct repo-root-relative path), so even with `-x` the file wasn't found on the first attempt.
|
|
||||||
|
|
||||||
**Lesson for future work:** When writing a `source=` directive, use a path that resolves correctly from the CWD where shellcheck will be invoked — verify with `shellcheck -x <file>` before committing. Pre-commit framework hooks include `-x` by default in the ecosystem's shellcheck integration.
|
|
||||||
|
|
||||||
## 2026-06-22 — Plugin cache isolation rules out shared/ directories between skills
|
## 2026-06-22 — Plugin cache isolation rules out shared/ directories between skills
|
||||||
|
|
||||||
When two skills in the same plugin share a resource (e.g. validate.sh), the instinct is to put it in a shared/ directory and reference it with a relative path. This breaks silently after install: plugins are copied to a cache, and `../` paths across skill directories stop resolving. The correct pattern is duplication with clear ownership — one skill owns the canonical copy and the other delegates to it via a skill invocation (e.g. /skill-audit) rather than a file path. If delegation is not possible, duplicate the file and note the owning skill in a comment.
|
Skills sharing a resource (e.g. `validate.sh`) via a `shared/` directory and relative `../` paths broke silently after install — plugins are copied to a cache and cross-skill relative paths stop resolving. Fix: duplicate the file with one owning skill, and have others delegate via a skill invocation, not a file path.
|
||||||
|
|
||||||
## 2026-06-22 — Qualitative rubrics should be grounded in upstream spec docs, not derived from in-repo usage
|
## 2026-06-22 — Qualitative rubrics should be grounded in upstream spec docs, not in-repo usage
|
||||||
|
|
||||||
When skill-audit's qualitative checks for description quality and body discipline were first written, they were derived from skill-write's own authoring conventions — a circular dependency. Any drift in skill-write's conventions would silently propagate into the audit criteria. Fix: extract condensed reference files directly from the upstream spec (agentskills.io) and load them conditionally from the audit skill. The rubric is then grounded in the authoritative source and independent of in-repo convention drift.
|
`skill-audit`'s description and body-discipline rubrics were derived from `skill-write`'s own conventions — circular, so drift in one silently propagated to the other. Fix: extract condensed reference files directly from the upstream spec (agentskills.io) into the audit skill, so the rubric is independent of in-repo convention drift.
|
||||||
|
|
||||||
## 2026-06-22 — Test files in scripts/ are dev tooling; document them in README as non-spec
|
## 2026-06-22 — Test files in scripts/ are dev tooling; document them in README as non-spec
|
||||||
|
|
||||||
The agentskills.io spec defines scripts/ for bundled executable scripts — it says nothing about test infrastructure. Bats test files placed in scripts/ (or scripts/tests/) are invisible to auditors following the spec and create silent README drift if not documented. Fix: place test files directly in scripts/ (no subdirectory), add a row to the README file table for each with a "dev tooling, not shipped with the plugin" note, and don't nest them in a tests/ subdirectory since that creates a non-spec directory structure.
|
The agentskills.io spec defines `scripts/` for bundled executables, not test infrastructure — bats files placed there are invisible to spec-following auditors and cause README drift. Fix: place test files directly in `scripts/` (no subdirectory), and add a README row noting each as "dev tooling, not shipped."
|
||||||
|
|
||||||
## 2026-06-27 — Clean-context audit catches what biased forks miss
|
## 2026-06-27 — Clean-context audit catches what biased forks miss
|
||||||
|
|
||||||
A skill-audit run by a fresh agent (no conversation context) caught 2 FAILs that the implementation fork's own audit pass missed — an incomplete README.md file table and `references/sources.md` paths invalid in the plugin cache. Forks that built the artifact are biased toward their own output: they know what was intended and fill in gaps silently. A fresh agent has no such priors and audits what is actually written. Fix: always run a clean-context audit as a named final step after implementation forks complete. It is not redundant with the in-process audit — it is a different check.
|
A fresh-context skill-audit caught two FAILs (an incomplete README table, invalid cache paths) that the implementing fork's own audit missed — the fork that built the artifact knows what was intended and fills gaps silently. Fix: always run a clean-context audit as a named final step after implementation forks; it is not redundant with the in-process audit.
|
||||||
|
|
||||||
## 2026-06-27 — Parallel forks on the same file produce conflicts requiring a third fork to reconcile
|
## 2026-06-27 — Parallel forks on the same file produce conflicts requiring a third fork to reconcile
|
||||||
|
|
||||||
Two forks independently fixed `references/sources.md` with different approaches — one added a header comment, the other replaced the paths with relative references. Both were plausible; neither read the spec first. Reconciling required a third fork to read the authoritative source and revert to the correct format (repo-root-relative, per skill-author Step 5). Fix: when multiple forks are in scope for the same file, either (a) scope them to non-overlapping files explicitly, or (b) sequence them rather than parallelise. If a fix is spec-governed, always read the spec before applying it — the "obvious" fix is wrong as often as it is right.
|
Two forks independently "fixed" `references/sources.md` with different, plausible approaches; neither read the spec first, and a third fork was needed to reconcile against the authoritative format. Fix: scope forks to non-overlapping files or sequence them. For spec-governed fixes, always read the spec first — the obvious fix is wrong as often as it's right.
|
||||||
|
|
||||||
## 2026-06-28 — Implementation agents must invoke /skill-author, not write skill files directly
|
## 2026-06-28 — Implementation agents must invoke /skill-author, not write skill files directly
|
||||||
|
|
||||||
When briefing an agent to implement a new skill, the instinct is to tell it to write the SKILL.md and supporting files directly. This bypasses Step 5 of the skill-author process (provenance), which requires reading all research `sources.md` files and recording every `extracted` slug in the skill's own `references/sources.md`. The `validate-provenance.sh` script catches the gap — but only after the commit, requiring a fix round. This pattern recurred twice in one session (plugin-author and marketplace-author initial implementation, then again in the first round of fix agents). Fix: briefs for implementation agents must explicitly say "invoke `/skill-author` (read and follow `plugins/kyberforge/.apm/skills/skill-author/SKILL.md`)" — not "write the skill files." Invoking the skill is the only reliable way to ensure all process gates, including provenance, run.
|
Briefing an agent to "write the SKILL.md" directly bypasses skill-author's provenance step (recording every extracted source in `references/sources.md`), caught only by `validate-provenance.sh` after the commit — this recurred twice in one session. Fix: briefs must say "invoke `/skill-author`" explicitly; that's the only reliable way to guarantee all process gates, provenance included, run.
|
||||||
|
|
||||||
## 2026-07-05 — Repo root is a bare checkout; work happens in worktrees only
|
## 2026-07-05 — Repo root is a bare checkout; work happens in worktrees only
|
||||||
|
|
||||||
`/root/ai-development/.git` has `core.bare = true` — the root directory itself has no working tree. Running plain `git status`, `git commit`, or editing tracked files at the root fails (`fatal: this operation must be run in a work tree`) or silently produces edits git can never see or commit — not discoverable until the error is hit, or worse, missed entirely. All real work — including one-line docs fixes — requires `git worktree add <path> -b <branch> origin/main` first. Fresh worktrees also don't have submodules (`tests/bats`, `docs/wiki`, etc.) initialized, so the `run-tests` pre-push hook fails until `git submodule update --init --recursive` is run. Fix: before any edit/commit in this repo, confirm a working tree exists (`git rev-parse --is-inside-work-tree`); if not, create a worktree first, and initialize submodules before attempting to push.
|
This repo's root `.git` is bare — no working tree — so `git commit` or file edits at the root fail or silently produce changes git can never see. Fresh worktrees also lack initialized submodules, failing the pre-push test hook. Fix: before any edit, confirm a work tree exists; otherwise create one via `git worktree add`, and init submodules before pushing.
|
||||||
|
|
||||||
## 2026-07-05 — Local remote-tracking refs go stale; verify against the Gitea API before asking
|
## 2026-07-05 — Local remote-tracking refs go stale; verify against the Gitea API before asking
|
||||||
|
|
||||||
After a PR merge (with Gitea's default auto-delete-branch behavior), `git branch -a` still showed the remote feature branch — the local `remotes/origin/*` ref hadn't been pruned. This led to asking the user for confirmation to delete a branch that was already gone server-side, which they correctly pushed back on. Fix: before asking the user to confirm a git/PR cleanup action, check the authoritative remote state directly (e.g. `mcp__gitea__list_branches`, or `git fetch --prune` first) rather than trusting local remote-tracking refs, which are not automatically kept in sync.
|
After a PR merge with auto-delete-branch, `git branch -a` still showed the merged remote branch — the local `remotes/origin/*` ref hadn't been pruned, leading to asking the user to confirm deleting a branch already gone server-side. Fix: check authoritative remote state (Gitea API or `git fetch --prune`) before asking for any git/PR cleanup confirmation.
|
||||||
|
|
||||||
## 2026-05-18 — Planning meta-commentary does not belong in deployed artifacts
|
## 2026-05-18 — Planning meta-commentary does not belong in deployed artifacts
|
||||||
|
|
||||||
During write-skill refactor, an "open thread" note (about a deferred research step) was written directly into the SKILL.md Process section. The user caught it. The rule it violated: a deployed artifact (SKILL.md, a runtime file loaded by agents) must not contain planning meta-commentary — deferred items, open threads, and implementation notes belong in the issue file, which is the planning artifact. The skill body should contain only content relevant to runtime execution. If a decision is deferred, record it in the issue and leave no trace in the skill. The distinction: issue = planning record; skill = executable instruction.
|
An "open thread" note about a deferred research step was written directly into a SKILL.md Process section during a refactor. Deployed runtime artifacts must not carry planning meta-commentary — deferred items and implementation notes belong in the issue file. Rule: issue = planning record; skill = executable instruction only.
|
||||||
|
|
||||||
## 2026-08-08 — A clean linter result can mean "nothing was checked"
|
## 2026-08-08 — A clean linter result can mean "nothing was checked" [graduated → core/instructions/testing.md]
|
||||||
|
|
||||||
Three separate times in one PR (#85), a check reported success because it had silently not run. (1) Vale's `text.frontmatter.description` scope stops matching once the value is a multi-line YAML block scalar — the style most skills here use — so a repo-wide sweep returned 0 alerts across 49 files and was read as a clean repo. (2) Five of six rules were `level: warning`, but Vale's exit code keys on `error` alone and pre-commit hides output from passing hooks, so those rules were invisible and blocked nothing for two review rounds while the ADR described them as "enforcing immediately." (3) `.vale.ini`'s globs matched no file outside `plugins/`, so Vale printed "0 files" and exited 0, which both audit skills read as "no findings" and used to skip their own judgment passes. Each time the green result was worse than no check at all, because it was cited as positive evidence of cleanliness. Fix: for any new check, prove it fails before trusting that it passes — run it against a deliberately-bad fixture, confirm the failure, then run the real corpus. Where a check can scan zero inputs, assert on the input count, not just the exit code. **[graduated → core/instructions/testing.md]** (4th instance below, kept for audit trail).
|
Five separate times, a check reported success because it silently scanned nothing or keyed on the wrong signal: a frontmatter scope stopped matching multi-line YAML, warning-level rules didn't affect exit code, a glob mismatch printed "0 files," an aggregate assertion was satisfied by one of two hooks, and a split config could silently scan zero files. Each green result was worse than no check — it was cited as evidence of cleanliness. Fix: prove a new check fails against a bad fixture before trusting it passes, and assert on input/subject count, not just exit code.
|
||||||
|
|
||||||
**5th instance (2026-08-09, PR #85 round 6):** `tests/test-vale-hooks-consumer.sh` asserted `grep -c "VagueWording" >= 2` across the *combined* output of both shipped Vale hooks, and the SKILL.md fixture alone raised two alerts — so one working hook satisfied the threshold and the agent hook could be disabled entirely (glob retargeted to match nothing) while the suite still reported `3 passed` under the message "both hooks flatten and flag". The `Skipped` guard did not catch it: the hook still *matched* the file, Vale simply linted nothing, reported `0 errors in 1 file`, and exited 0, which pre-commit renders as `Passed`. The general shape: **an assertion that aggregates over N subjects proves nothing about any individual subject** — a total is satisfiable by a proper subset. Fix: attribute each signal to its source before asserting (alerts are now filed by path, with a distinct trigger token per fixture so one hook's alert cannot be credited to another), and assert per subject. Corollary technique, now standing practice for any check whose failure mode is silence: run the mutation sweep in *reverse* as well — neuter each assertion in turn and confirm exactly one test case fails. Applied to `check-vale-style-sync.sh` it exposed two assertions bound to no failing case at all, one of them masked by a stronger check that ran first.
|
|
||||||
|
|
||||||
**4th instance (2026-08-09, ADR-0014):** splitting the single root `.vale.ini` into two skill-scoped copies (skill-audit: `SKILL.md` only; agent-audit: agent files only) meant a single retargeted pre-commit hook pointed at agent-audit's copy alone would have silently scanned 0 `SKILL.md` files and exited 0 — caught only because the full corpus was dry-run against both the old and new config and the outputs diffed before the old config was deleted, not because any test asserted on file counts. Standing practice going forward: when a Vale (or any linter) config that serves multiple file-glob scopes is split or moved, dry-run the full corpus through both the old and new config and diff the outputs before removing the superseded source — a hook silently scanning 0 files looks identical to a clean pass.
|
|
||||||
|
|
||||||
## 2026-08-08 — One signal, two consumers, no named distinction
|
## 2026-08-08 — One signal, two consumers, no named distinction
|
||||||
|
|
||||||
Vale's output fed two consumers with different contracts: the audit skills read severity *strings* to grade a report (`error`→FAIL, `warning`→SUGGESTION), while the pre-commit hook read the process *exit code* to allow or block a commit. Severities were tuned for the first consumer; the second silently inherited whatever exit code that produced, which was always 0. CONTEXT.md described both as a single mechanism under one heading, which is precisely why the divergence went unnoticed — there was no vocabulary in which "the gate" and "the prefilter" were different things that could disagree. Fix: when one output feeds two consumers, name them separately in the domain language and state each contract explicitly. If they cannot be given independent contracts, collapse them into one — which is what happened here: every rule became `level: error`, so the gate and the audit now share a single verdict with nothing to keep in sync.
|
Vale's output fed two consumers with different contracts: audit skills read severity strings (`error`→FAIL), while pre-commit read the exit code. Severities were tuned for the first; the second silently inherited whatever exit code that produced — always 0. Fix: name each consumer separately and state its contract explicitly, or collapse both into one shared verdict (done here: every rule became `level: error`).
|
||||||
|
|
||||||
## 2026-08-08 — Measure a rule's false-positive rate at the severity you will ship it at
|
## 2026-08-08 — Measure a rule's false-positive rate at the severity you will ship it at
|
||||||
|
|
||||||
`Kyberforge.VagueQualifier` was cherry-picked from `write-good` after being trialled as "low-noise against this repo's corpus" — but the trial ran at `level: warning`, where a false positive costs nothing because nobody ever sees it. Shipped at `error`, the same false positive costs a blocked commit and a permanent suppression comment. Re-measured at the severity it actually shipped at, the rule scored one marginal true positive and one unfixable false positive across 41 files (`caveman/SKILL.md` *quotes* filler words as its subject matter — a mention, not a use), and was deleted. Fix: trial conditions must match shipping conditions. A noise measurement taken where false positives are free does not transfer to a context where they are expensive, and "low-noise" is not a property of a rule alone — it is a property of the rule at a severity.
|
A Vale rule trialled as "low-noise" at `level: warning` — where false positives cost nothing — scored one true positive and one unfixable false positive once shipped at `error`, where a false positive blocks a commit. It was deleted. Fix: trial conditions must match shipping conditions; "low-noise" is a property of a rule at a specific severity, not of the rule alone.
|
||||||
|
|
||||||
## 2026-08-09 — Exercising a config's "local" mode proves nothing about the mode that ships
|
## 2026-08-09 — Exercising a config's "local" mode proves nothing about the mode that ships
|
||||||
|
|
||||||
The root `.pre-commit-hooks.yaml` shipped Vale hooks whose `entry:` carried a `--config <repo-relative-path>` argument. pre-commit prefixes only `entry[0]` with the hook-repo clone path (`cmd = (prefix.path(cmd[0]), *cmd[1:])`), so every later argument resolves against the *consuming* repo's root: each external consumer hard-failed with `E100 [--config] Runtime error ... does not exist`, and two of the three hooks ADR-0014 promised were unusable. The defect survived three review rounds of PR #85 and a green `pre-commit run --all-files` every time, because this repo consumes the same hooks through `repo: local`, where the clone prefix, the cwd, and the repo root are one directory — the byte-identical `entry:` string worked locally for a reason that exists only locally. Nothing under `tests/` exercised the manifest as a hook repo at all. The sharp part: the local run was not weaker evidence of the same thing, it was evidence of a different thing, and the two were indistinguishable by reading either file. Fix: when a config has a local mode whose resolution semantics differ from the shipped mode, test the shipped mode against a real consumer — `tests/test-vale-hooks-consumer.sh` stands up a `file://` clone of this repo and runs the hooks from it — and then delete the divergence rather than living with it: `vale-wrap.sh` now self-locates its config from `${BASH_SOURCE[0]}`, and the local and shipped `entry:` lines are identical, so the local run no longer exercises a path no consumer takes.
|
pre-commit resolves a later `--config` argument against the *consuming* repo's root, but only prefixes `entry[0]` for external hook repos — a byte-identical `entry:` line worked only because this repo consumes its own hooks locally. Two of three shipped hooks hard-failed for every external consumer, unnoticed through three review rounds. Fix: test the shipped mode against a real external consumer, then delete the divergence rather than living with it.
|
||||||
|
|
||||||
## 2026-08-09 — Deleting a token from a shared artifact breaks whatever parses it, silently
|
## 2026-08-09 — Deleting a token from a shared artifact breaks whatever parses it, silently
|
||||||
|
|
||||||
Dropping the `--config` argument from `.pre-commit-hooks.yaml` was the right fix, but `scripts/check-release-needed.sh` derived its release-relevant path list by scanning those same `entry:` lines for `--config` and taking the target's `dirname` — that parse was the only thing giving the bundled `.vale.ini` and its sibling `styles/` tree release coverage. With the token gone the loop simply never fired: no error, no failing test, no warning, just a path list that shrank from six entries to four and lost both `assets/vale/` trees. Consequence: a change to a Vale *rule* could land on `main` without demanding a release tag, leaving external consumers pinned to an old `rev:` with stale rules — the exact drift the gate exists to prevent. It surfaced only because the agent making the change reported it as a suspected side effect of its own edit, and was confirmed by diffing the derived path list before and after. Fix: before removing a token from an artifact more than one script reads, grep for everything that *parses* the artifact, not just everything that consumes its documented purpose. The smell to watch for is a loop that builds a list, where an empty or short list is indistinguishable from a correct one — assert on the expected members, so a derivation whose input vanished fails loudly instead of quietly covering less.
|
Removing a `--config` argument from `.pre-commit-hooks.yaml` was the right fix, but `check-release-needed.sh` derived its release-relevant path list by parsing that same token — with it gone, the derivation silently shrank with no error. Fix: before removing a token from an artifact more than one script reads, grep for everything that *parses* it, and assert on expected list members.
|
||||||
|
|
||||||
## 2026-08-09 — A documented impossibility is a claim, not a constraint
|
## 2026-08-09 — A documented impossibility is a claim, not a constraint
|
||||||
|
|
||||||
`vale-wrap.sh` flattens multi-line YAML `description:` scalars so Vale's `text.frontmatter.description` scope keeps matching. Its last-resort branch rewrote ASCII `'` to U+2019, justified at the emission site and in review as "the single combination no YAML scalar can carry verbatim" — an accepted-by-design residual, documented and test-covered, which is exactly why nobody retested it. The claim was false: a `|-` literal block with one indented content line carries `'`, `"`, `\` and `: ` verbatim, keeps the scope alive, and the wrapper's own header docstring already said literal blocks were unaffected. The cost of the unexamined claim was a silent underlint on 12 of 54 in-scope files — any rule whose token contained an apostrophe simply never fired, and the covering test (case 20) pinned only "the scope stays alive", so it passed either way. Fix: when a residual is accepted because something is "impossible", write down the specific claim in a falsifiable form and test *that*, not the workaround built on top of it. The tell here was that the residual and its justification were documented in the same breath by the same author — documentation records a belief, and a belief adjacent to a workaround is the one most worth attacking. Related: an assertion written to cover an accepted residual tends to assert the residual's *presence* rather than the behaviour it costs; case 20b asserted the scope survived flattening, never that a rule matching the rewritten characters still fired.
|
A wrapper script's last-resort character rewrite was justified as "the one case no YAML scalar can carry verbatim" — untested because it seemed obviously true. It was false: a literal block scalar carries the exact characters in question, silently underlinting 12 of 54 files. Fix: when a residual is accepted as "impossible," write the claim in falsifiable form and test that claim directly, not the workaround built on it.
|
||||||
|
|
||||||
## 2026-08-14 — A fix handed down with authority is the least-reviewed code in the change
|
## 2026-08-14 — A fix handed down with authority is the least-reviewed code in the change
|
||||||
|
|
||||||
Across one review round, four fixes specified by the orchestrating reviewer were wrong, and every one would have shipped a guard that looked correct and caught nothing — the same defect class the guard was written to close. `nproc([[:space:]]|$)` does not match `$(nproc)`, the only spelling that occurs in real code. `grep -E ... | grep -Evq ...` under `set -o pipefail` returns 141 because `-q` exits on first match and SIGPIPEs the upstream, and 141 as an `if` condition reads as "no findings" — worse, it is *size-dependent*, so on the real 4-line `.vale.ini` the broken form behaves correctly and only fails once the input grows. `FUNCNAME` and `BASH_ARGC` were proposed as never-empty shell arrays to exempt from an unguarded-expansion scan; both are empty in reachable states (outside a function; `BASH_ARGC` measured 1 at top level and 0 inside a function), so exempting them suppresses a real bash 3.2 abort. `sed 's/#.*//'` as a comment-stripper truncates at the `#` in `${var#prefix}` — a form this repo actually uses at `check-manifests.sh:58` — reintroducing the exact blind spot being fixed. Each was caught only because the implementing agent re-derived the fix and measured, rather than applying what it was told; each had survived being written down confidently in a numbered finding with a reproduction attached. The asymmetry is the point: a finding arrives with evidence and gets scrutinised, while the fix beside it arrives with the same authority and gets implemented. Fix: state a proposed fix as a hypothesis with its own falsifiable check, and require the implementer to verify the fix mechanism independently of the defect reproduction — the two are different claims. The tell is a fix whose correctness depends on a regex boundary, a shell exit-status rule, or an "always/never" property of a builtin: measure it at the size, scope, and spelling it will actually meet, because the small case and the shipped case can disagree.
|
Four fixes specified by an orchestrating reviewer were all wrong — a regex that didn't match the real code shape, a pipefail exit code misread as "no findings," two "never-empty" shell arrays that were empty in reachable states, and a comment-stripping `sed` that truncated `${var#prefix}`. Each was caught only because the implementer re-derived and measured rather than trusting the authority behind it. Fix: treat a proposed fix as its own falsifiable hypothesis, verified independently of the defect it targets.
|
||||||
|
|
||||||
## 2026-08-14 — Every assertion needs a revert it provably fails against [graduation candidate]
|
## 2026-08-14 — Every assertion needs a revert it provably fails against [graduation candidate]
|
||||||
|
|
||||||
Mutation testing a review round's own fixes found repeatedly that a passing test was pinning nothing. Deleting `sync_dir`'s stale-directory wipe, its check-mode stale branch, or three of five `MIRROR_DIRS` entries each left the suite at 18/18 green; so did replacing the hooks trailing-newline normalisation with plain `cp`. A pair of concurrency assertions written to guard a reentrancy defect caught it 0 times in 10 runs against the deliberately broken script — and one of them was structurally incapable of ever catching it, because the broken code wrote to the system temp dir while the assertion inspected `$TMPDIR`. A fixture-leak fix ran green with and without the fix, verified only by external observation. Two manifest fixtures passed with the canonicalisation they claimed to cover deleted, rescued by an unrelated name-matching axis. In each case the test named the right behaviour in its description and asserted something adjacent to it. The cheap discipline that finds all of these: for every assertion, construct the revert it is supposed to catch and confirm it fails — and when an assertion survives every revert you can think of, that is not reassurance, it is the finding (one test only revealed itself as decoration once a sixth, differently-targeted revert was built for it). Fix: treat "which revert does this fail against?" as a required answer at the time an assertion is written, and record it where the assertion lives, since a test's own description is exactly the artifact that made the gap invisible.
|
Mutation testing repeatedly found tests passing green with the behaviour they claimed to guard deleted — a stale-directory wipe, a reentrancy guard, a fixture-leak fix, canonicalization logic. Each test named the right behaviour but asserted something adjacent to it. Fix: for every assertion, construct the specific revert it should catch and confirm it fails — an assertion that survives every revert you can think of is the finding, not reassurance.
|
||||||
|
|
||||||
Graduation candidate: this overlaps 2026-08-09's "an assertion written to cover an accepted residual tends to assert the residual's presence rather than the behaviour it costs" and the same date's "assert on the expected members, so a derivation whose input vanished fails loudly instead of quietly covering less." Three entries circling one pattern — human review for promotion to `core/instructions/testing.md`.
|
|
||||||
|
|
||||||
## 2026-08-14 — Vale's `existence` extension concatenates `raw:` entries, it does not alternate them
|
## 2026-08-14 — Vale's `existence` extension concatenates `raw:` entries, it does not alternate them
|
||||||
|
|
||||||
A new `Kyberforge.CompositionNote` rule was first written with seven `raw:` entries, one per banned
|
A new rule with seven `raw:` entries (one per banned phrase) loaded without error and matched zero of 43 files — indistinguishable from a clean corpus. `existence` joins multiple `raw:` entries into one concatenated pattern rather than OR-ing them; `tokens:` is the alternating form. Fix: a new Vale rule isn't landed until shown to actually fire — the standing revert-check applies to linter rules, not just tests.
|
||||||
phrasing. Vale loaded it without a diagnostic and it matched **zero of 43 files** — an outcome
|
|
||||||
indistinguishable from a clean corpus, and the exact shape of 2026-08-08's "a clean linter result can
|
|
||||||
mean nothing was checked". The cause is that `existence` joins multiple `raw:` entries into one
|
|
||||||
pattern rather than OR-ing them, so the rule was searching for all seven phrases concatenated. Every
|
|
||||||
pre-existing rule in this style has exactly one `raw:` entry, so nothing in the repo demonstrated the
|
|
||||||
difference, and the multi-entry form looks natural beside them. `tokens:` is the alternated form,
|
|
||||||
which is why `VagueWording` uses it. Fix: a new Vale rule is not landed until it has been shown to
|
|
||||||
*fire* — the standing revert-check applies to linter rules as much as to tests, and the revert here
|
|
||||||
is the broken multi-`raw:` form, which `tests/test-vale-hooks-consumer.sh` now fails against.
|
|
||||||
|
|
||||||
## 2026-08-14 — Un-anchoring a description rule to reach mid-sentence text is unshippable
|
## 2026-08-14 — Un-anchoring a description rule to reach mid-sentence text is unshippable
|
||||||
|
|
||||||
Widening `DescriptionOpener` to catch `gitea-workflow`'s mid-description "This is the human-facing
|
Widening a description-opener rule to also catch mid-sentence text looked like a one-character change, but `scope: text.frontmatter.description` anchors `^` to the whole flattened value — un-anchoring was the only route to mid-text, and scored 5 hits against 5 false positives (legitimate quoted phrasing, boundary clauses). Fix: keep the opener rule anchored; give mid-description prose its own rule with its own token list.
|
||||||
entry point…" looked like a one-character change. Both that skill and `gitea-labels-milestones`
|
|
||||||
*open* with "Use when…" and satisfy the opener rule; the offending clause sits at character 377 and
|
|
||||||
300 of the folded value respectively, so the rule was never violated and never silently passed — it
|
|
||||||
simply had no jurisdiction, which is a different defect and takes a different fix.
|
|
||||||
Under `scope: text.frontmatter.description`, `^`
|
|
||||||
anchors to the start of the whole description value — and `vale-wrap.sh` has already flattened that
|
|
||||||
value to one physical line, so `(?m)` changes nothing. Un-anchoring is therefore the only route to
|
|
||||||
mid-description text, and measured across the corpus it scores 5 hits and 5 false positives: skills
|
|
||||||
legitimately quote user phrasings (`says "audit this skill"`) and write boundary clauses (`do not use
|
|
||||||
this skill to manage label definitions`). That is the `Kyberforge.VagueQualifier` deletion repeating.
|
|
||||||
Fix: keep the opener rule opener-anchored and give mid-description prose its own rule with its own
|
|
||||||
token list. A rule's scope anchor is part of its contract, not an implementation detail to relax when
|
|
||||||
a new case does not fit.
|
|
||||||
|
|
||||||
## 2026-08-14 — A formatter in the commit path manufactures drift on a file with a clean git diff
|
## 2026-08-14 — A formatter in the commit path manufactures drift on a file with a clean git diff
|
||||||
|
|
||||||
`apm audit --ci` failed on `.claude/settings.json` while `git diff` on that file was empty — the worst
|
`apm audit --ci` failed on `.claude/settings.json` with an empty `git diff` — `pretty-format-json --autofix` silently re-sorts JSON keys, and this generated file was missing from its exclude list, so every commit re-sorted apm's insertion-ordered output before apm compared against it. Separately, a defect introduced 3 hours earlier on the same branch was first mis-described as "pre-existing," an unverified claim about history. Fix: add tool-owned paths to every autofixing hook's exclude the moment ownership is declared, and verify "pre-existing" claims with `git log -S` or `git branch --contains` before writing them down.
|
||||||
possible pairing of signals, because the file matched HEAD exactly and every instinct says "nothing
|
|
||||||
changed here". The content was identical to apm's output to the byte; only the JSON key order
|
|
||||||
differed. `pretty-format-json --autofix` sorts object keys unless `--no-sort-keys` is passed, and its
|
|
||||||
`exclude:` listed fifteen generated manifests but not this file, so from the commit that first wrote
|
|
||||||
a hook entry there onward, apm's insertion-ordered output was silently re-sorted on the way in. apm
|
|
||||||
then replayed the install, produced its own order, and reported drift against a file no human had
|
|
||||||
touched.
|
|
||||||
|
|
||||||
The provenance matters as much as the mechanism, and the first account of this entry got it wrong in
|
|
||||||
both directions. `git log --format='%h %ad %s' --date=iso` puts the introducing commit `2e395a4` at
|
|
||||||
2026-08-14 18:47 and the fix `7607522` at 21:54 — roughly three hours, not "weeks". And `2e395a4` is
|
|
||||||
the **first commit of the `refactor/trim-skills-agents-context` branch**, eleven minutes after the
|
|
||||||
base merge `f9b919d`; `git branch -a --contains 2e395a4` returns only that branch and its own
|
|
||||||
`remotes/origin/` tracking copy — two lines naming one branch, and `main` is not among them. So
|
|
||||||
this was not a latent defect inherited from `main`, it was manufactured inside the same PR that
|
|
||||||
diagnosed it, and the fixing commit's own message calling it "pre-existing … red at HEAD before
|
|
||||||
ADR-0020 work began" is the mis-attribution rather than the record. Two cheap commands would have
|
|
||||||
settled it before either sentence was written.
|
|
||||||
|
|
||||||
Three general points. First, a tool-owned generated file that passes through an autofixing formatter
|
|
||||||
is drifted by construction, and the diff that would reveal it never appears in `git diff` — it only
|
|
||||||
exists between the formatter's input and its output, which nothing stores. Second, the fix is
|
|
||||||
self-undoing unless the exclude lands in the same commit: correcting the file alone means the hook
|
|
||||||
re-breaks it as it is staged. Third — the one this entry had to learn twice — "pre-existing" is a
|
|
||||||
claim about history, and history is queryable; a defect found while working on a branch feels
|
|
||||||
inherited, and the feeling is not evidence. A three-hour-old self-inflicted bug and a months-old
|
|
||||||
inherited one call for different responses, and writing the wrong one down converts a process failure
|
|
||||||
into a story about someone else's neglect. Fix: when a tool declares ownership of a path, add that
|
|
||||||
path to every autofixing hook's `exclude` at the moment ownership is declared, not when the drift is
|
|
||||||
noticed — and before describing any defect as pre-existing, run `git log -S` or
|
|
||||||
`git branch --contains` on the commit that introduced it. This repo gates marketplace-mirror,
|
|
||||||
plugin-content and vale-style drift deterministically and has no equivalent gate asserting tool-owned
|
|
||||||
paths stay out of formatter scope — `.claude/settings.json` was the sixteenth exclude and nothing
|
|
||||||
prevents a seventeenth.
|
|
||||||
|
|
||||||
## 2026-08-16 — A rule reversed inside a retrofit leaves no trace unless someone writes it down
|
## 2026-08-16 — A rule reversed inside a retrofit leaves no trace unless someone writes it down
|
||||||
|
|
||||||
`skill-author/SKILL.md:204` on `main` said "Keep reference chains one level deep — a reference file
|
A retrofit replaced "keep reference chains one level deep" with "two hops, never three" — the opposite rule, needed because the new dispatch pattern requires `SKILL.md` → `improve.md` → `retrofit.md`. The ADR never mentioned chain depth, so the reversal was carried entirely by the diff with no sign a contradicting rule ever existed. Fix: when a change inverts a standing rule, record the inversion where the rule's rationale lives, or it reads as forgotten rather than overturned.
|
||||||
that references another reference file is rarely loaded correctly." The ADR-0020 retrofit replaced it
|
|
||||||
with "Two hops from `SKILL.md`, never three" in `references/create.md` and `references/retrofit.md`,
|
|
||||||
which permits exactly the chain the old rule banned. The looser rule is the right one and the
|
|
||||||
retrofit could not have shipped without it: dispatch pushes each flow into its own file, so the
|
|
||||||
shipped structure is `SKILL.md` → `improve.md` → `retrofit.md`, and a one-level ceiling would have
|
|
||||||
made the mandatory dispatch pattern illegal. But ADR-0020 says nothing about chain depth, so the
|
|
||||||
reversal was carried entirely by the diff — the new text asserts the new rule with no sign that a
|
|
||||||
contradicting rule ever existed, and a reader who remembers the old one has no way to tell whether it
|
|
||||||
was overturned or overlooked. Fix: when a change inverts a standing authoring rule rather than
|
|
||||||
tightening or restating it, record the inversion where the rule's rationale lives — the ADR if the
|
|
||||||
ADR is the reason, here otherwise. A rule that quietly flips is indistinguishable from a rule that
|
|
||||||
was forgotten, and the second reading is the one that gets it re-added later.
|
|
||||||
|
|||||||
11
README.md
11
README.md
@@ -35,17 +35,6 @@ Install all of these before setting up. Each one is a hard dependency of a git h
|
|||||||
| `python3` + PyYAML | Required by `scripts/skill-size-check.sh` (the `skill-size-check` pre-commit hook), which reads folded YAML frontmatter | `python3` is usually present — pre-commit is itself a Python application. `pip install pyyaml` if the hook reports PyYAML missing |
|
| `python3` + PyYAML | Required by `scripts/skill-size-check.sh` (the `skill-size-check` pre-commit hook), which reads folded YAML frontmatter | `python3` is usually present — pre-commit is itself a Python application. `pip install pyyaml` if the hook reports PyYAML missing |
|
||||||
| `vale` | Required by the `vale-audit-prefilter-skill` / `-agent` pre-commit hooks and the `check-vale-style-sync` pre-push hook | `brew install vale` (macOS), `snap install vale` (Linux), `choco install vale` (Windows), or https://vale.sh/docs/vale-cli/installation/ |
|
| `vale` | Required by the `vale-audit-prefilter-skill` / `-agent` pre-commit hooks and the `check-vale-style-sync` pre-push hook | `brew install vale` (macOS), `snap install vale` (Linux), `choco install vale` (Windows), or https://vale.sh/docs/vale-cli/installation/ |
|
||||||
| `claude` CLI | Required by the `validate-plugins` and `validate-marketplace` pre-push hooks | Claude Code |
|
| `claude` CLI | Required by the `validate-plugins` and `validate-marketplace` pre-push hooks | Claude Code |
|
||||||
| `go` toolchain | The gitea MCP server runs as `go run gitea.com/gitea/gitea-mcp@v1.7.0`, resolved from `PATH`. Without it the server fails to start and every `gitea-*` skill loses its tools | https://go.dev/dl/ — verify with `go version` |
|
|
||||||
|
|
||||||
The gitea MCP server additionally needs two environment variables in the shell that launches your agent — referenced as `${GITEA_ACCESS_TOKEN}` and `${GITEA_HOST}` in `plugins/gitea/.mcp.json`, with apm passing those references through to the deployed config unexpanded so the values are resolved at server startup and never committed. Copy `plugins/gitea/.env.example` to `.env` at the repo root, fill in real values, then export it — nothing in this repo auto-loads a `.env` file:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp plugins/gitea/.env.example .env
|
|
||||||
$EDITOR .env
|
|
||||||
set -a; source .env; set +a
|
|
||||||
```
|
|
||||||
|
|
||||||
Generate the token in Gitea under Settings, Applications. Scope it to the repositories you want the agent to reach. If the server starts but every call returns an authorization error, that token is the first thing to check.
|
|
||||||
|
|
||||||
Two notes worth reading before you skip one:
|
Two notes worth reading before you skip one:
|
||||||
|
|
||||||
|
|||||||
185
SIMPLIFICATION-AUDIT.md
Normal file
185
SIMPLIFICATION-AUDIT.md
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
# Simplification audit
|
||||||
|
|
||||||
|
Date: 2026-09-10. Read-only analysis; nothing has been changed. Purpose: a hand-off for deciding what to remove, merge, and shrink. Findings are ranked by payoff within each area; effort is S/M/L. Claims were independently re-verified against the repo by a clean reviewer; corrections have been applied.
|
||||||
|
|
||||||
|
Assumptions agreed before analysis: anything is on the table, Claude Code and Copilot CLI both stay supported, findings are ranked with effort.
|
||||||
|
|
||||||
|
Counting convention: line counts are hand-edited `.apm/` source unless marked "incl. mirror". Every `.apm/` file has a byte-identical generated copy at the plugin root, so plugin cuts count double in the repo total.
|
||||||
|
|
||||||
|
## 1. The shape of the problem
|
||||||
|
|
||||||
|
| Measure | Value |
|
||||||
|
| ---------------------------------------------------------------------------| -----------------------------------------------------------------------------------------|
|
||||||
|
| Tracked files / lines | 820 / 102,000 |
|
||||||
|
| Lines in `plugins/` | 70,600 (69% of repo) |
|
||||||
|
| Of which the 39 `SKILL.md` files a model actually loads | ~2,600 lines (under 4% of plugin lines) |
|
||||||
|
| Generated flat mirror files (byte copies of `.apm/`) | 263 files, ~22,000 lines |
|
||||||
|
| `docs/research/` vendored inside plugins | ~19,000 lines, nothing executable reads it |
|
||||||
|
| Repo-level `docs/research/` + `docs/notes/` | 4,500 lines, 47% of all prose words, 6 of 11 research files linked only from each other |
|
||||||
|
| Enforcement: hook entries in `.pre-commit-config.yaml` / pre-push hooks | 33 / 14 |
|
||||||
|
| Enforcement: `tests/*.sh` + runners + `scripts/` | 12,400 + 475 + 4,500 lines |
|
||||||
|
| Validator scripts inside kyberforge (+ their bats tests) | 6,800 + 5,300 lines |
|
||||||
|
| Preload tax (39 skill names + descriptions) | 10,987 chars, ~2,750 tokens per session |
|
||||||
|
| Commits since 2026-05-10 / share touching hook, test, gate, vale, or sync | 447 / ~25% |
|
||||||
|
|
||||||
|
The pattern across every area is the same: the payload (skill bodies, rules, decisions) is small and the scaffolding around it (mirrors, research dumps, sync gates, tests of tests, justification prose) is 10 to 30 times larger. A quarter of all commits have gone into maintaining the scaffolding.
|
||||||
|
|
||||||
|
## 2. Measured baseline: hooks and tests
|
||||||
|
|
||||||
|
Measured on this machine, clean tree, all hooks passing. `pre-commit run --all-files` per stage.
|
||||||
|
|
||||||
|
| Gate | Wall time |
|
||||||
|
|---|---|
|
||||||
|
| **Full pre-push stage (everything below, sequential)** | **~5 min 10 s** |
|
||||||
|
| `run-tests` (26 bash suites + 351 bats tests) | 276 s |
|
||||||
|
| `apm-audit-ci` (7 manifests) | 12.2 s |
|
||||||
|
| `validate-plugins` (6 × `claude plugin validate`) | 4.9 s |
|
||||||
|
| `check-plugin-content-sync` | 4.5 s |
|
||||||
|
| `apm-pack-check-clean` | 3.1 s |
|
||||||
|
| Other 9 pre-push hooks combined | 7.6 s |
|
||||||
|
| **Full pre-commit stage, all files** | **18.2 s** |
|
||||||
|
|
||||||
|
`run-tests` is 90% of the wall time. Every push pays it in full: the runner has no change detection and the config sets `always_run: true`. `apm-audit-ci` is the second-slowest hook; per its own comment block its earlier description overclaimed, and what it verifies today is that seven manifests parse and the lockfile exists.
|
||||||
|
|
||||||
|
Where the 276 s goes (each suite run alone, sequential):
|
||||||
|
|
||||||
|
| Suite | Time | Note |
|
||||||
|
|---|---|---|
|
||||||
|
| `test-sync-plugin-content.sh` | 83 s | 14 temp trees, 2 `git init`, repeated `apm pack` |
|
||||||
|
| all 351 bats tests (10 files, kyberforge and core validators) | 64 s | mostly `validate.sh` / `validate-provenance.sh` fixtures |
|
||||||
|
| `test-adr0020-differential.sh` | 29 s | 12 assertions; re-runs two validators over the live corpus and a fixture tree |
|
||||||
|
| `test-check-vale-style-sync.sh` | 25 s | guards a byte-identical copy |
|
||||||
|
| `test-vale-wrap.sh` | 14 s | |
|
||||||
|
| `test-adr0020-frontmatter.sh` + `-targets.sh` | 25 s | |
|
||||||
|
| Remaining 20 suites | 36 s | 12 of them run in under 2 s each |
|
||||||
|
|
||||||
|
Five suites account for 215 s of 276 s. Three of those five (sync-plugin-content, vale-style-sync, adr0020-differential) test tooling that findings 2, 7, and 14 propose to delete or shrink, so the fastest path to a quick pre-push is removing the duplication those tests guard rather than optimising the tests.
|
||||||
|
|
||||||
|
## 3. Enforcement layer: hooks, tests, scripts
|
||||||
|
|
||||||
|
This is the area you named as hardest to understand and slowest. Root cause: most pre-push hooks exist to keep two copies of something in sync, or to re-validate what another hook already validates.
|
||||||
|
|
||||||
|
1. **Six hooks validate overlapping sets of the same manifests.** `check-manifests`, `validate-plugins`, `validate-marketplace`, `apm-pack-check-clean`, `apm-marketplace-check`, `apm-audit-ci`. Keep the two `claude plugin validate` hooks plus `apm-pack-check-clean`. Delete `check-manifests` (282 lines + 771 test lines; its `lib/marketplace-plugins.sh` stays because `sync-plugin-content.sh` sources it). `apm-audit-ci` spends 12 s confirming that manifests `apm pack` already parses do parse; drop or keep on that basis. Move the network-dependent `apm-marketplace-check` to a release checklist. Effort S.
|
||||||
|
|
||||||
|
2. **Four "keep two copies in sync" gates: 1,100 script lines + 1,600 test lines.** Each one is a symptom of duplication that could be removed instead of guarded:
|
||||||
|
- `check-vale-style-sync`: 413 lines + 798 test lines guarding a byte-identical 526-line `vale-wrap.sh` and style directory copied between skill-audit and agent-audit. About 350 of its lines run Vale glob probes against the hook file patterns. Disappears if the two audit skills merge (finding 14); the probes belong in `test-vale-wrap.sh`.
|
||||||
|
- `check-scope-walkup-sync`: 365 lines cross-checking four independent ports of the same package-root walk-up. Disappears if the ports share one script or the skills merge.
|
||||||
|
- `check-marketplace-mirror-sync`: guards `.github/plugin/marketplace.json`. The script header calls it Copilot's legacy convention path and says Copilot also accepts the Claude path; the vendored Copilot docs list it as primary. Verify against current Copilot CLI before deleting hook, script, test, and mirror file.
|
||||||
|
- `check-executables-allow-sync`: 474 lines to assert one string equals kyberforge's version. A six-line grep, or drop it (the failure mode is visible and recoverable).
|
||||||
|
Effort S each, M for the walk-up.
|
||||||
|
|
||||||
|
3. **Tests of the test harness: 1,090 lines testing 475 lines.** `test-run-tests.sh` and `test-run-bats.sh` defend "green either way" holes that exist only because the runners hand-roll TAP parsing and set-equality checks. Replace both runners with about 40 lines (`bats -r plugins` plus a parallel `find | xargs` over `test-*.sh`) and delete the meta-tests. `lib/batch-run.sh` stays; `sync-plugin-content.sh` sources it. Effort M.
|
||||||
|
|
||||||
|
4. **`skill-frontmatter` is a 62-line bash script inlined in YAML** with its own 366-line test. `skill-size-check.sh` already parses the same frontmatter with PyYAML. Fold it in (about 15 Python lines), delete the inline hook, its test, and the 79 lines in `gates.md` arguing for the split. Effort S.
|
||||||
|
|
||||||
|
5. **`skill-size-check.sh` has six test files totalling 3,589 lines for one 1,497-line script**, split by ADR section rather than behaviour. `test-adr0020-differential.sh` is 452 lines for 12 assertions. Merge to two files. Effort M.
|
||||||
|
|
||||||
|
6. **Prose-grep tests.** `test-governance-layer.sh` and `test-instructions-and-docs.sh` (583 lines) grep markdown for phrases, including a one-shot "issue 0015 refactor incomplete" assertion made permanent and an assertion that `docs/notes/` exists. Delete both. `check-apm-agents-valid.sh` (161 + 264 test lines) is a loop plus fail-closed guards around `validate.sh`; it folds into the merged audit skill's own tests (finding 14). Effort S.
|
||||||
|
|
||||||
|
7. **`check-plugin-content-sync.sh` is 813 lines wrapping `apm pack`, with a 1,291-line test.** The mirror itself must stay (Claude Code marketplace installs need flat directories), and the script does real work a bare `git diff` would lose: it strips `tests/` from the mirror, regenerates both `plugin.json` files with `mcpServers` reinjected, and packs into a scratch copy so `--check` never mutates. Even so, 2,100 lines for that is disproportionate; target a third. Effort M.
|
||||||
|
|
||||||
|
8. **`docs/spec/gates.md` (1,048 lines) is roughly 15% "what is enforced" and 85% post-mortems** of defects already fixed and pinned by tests. The 60-line hook table is the useful part. Target 200 lines. The same applies to the 106 comment lines in `.pre-commit-config.yaml` and to `scripts/`, where 8 of 15 files are 40 to 60% comments. Effort M.
|
||||||
|
|
||||||
|
**Proposed target.** Pre-push 14 hooks to 6: `run-tests`, `validate-plugins`, `validate-marketplace`, `apm-pack-check-clean`, `check-plugin-content-sync`, `check-release-needed`. Pre-commit stays roughly as is minus `skill-frontmatter`, and minus `check-ast` once finding 9 removes the only `.py` files. Tests 26 files to about 10 (12,400 to about 5,000 lines). Keep bats and its three submodules; the 351 bats tests ship inside plugins and are the right tool there. Do not port the bash suites to bats; delete them instead.
|
||||||
|
|
||||||
|
## 4. Plugins
|
||||||
|
|
||||||
|
The shared pattern: per-skill `README.md` files no model reads, a `docs/research/` dump per plugin, a `sources.md` provenance chain with its own validator, and reference files that restate man pages.
|
||||||
|
|
||||||
|
### 4.1 Cross-plugin (apply everywhere)
|
||||||
|
|
||||||
|
9. [ ] **Delete `docs/research/` from every plugin (~19,000 lines).** kyberforge's alone is 14,143 lines, 32% of the plugin, and about 8,900 of those are vendored third-party content (Anthropic `skill-creator` including a 1,325-line `viewer.html` and ten `.py` files, obra/superpowers, mattpocock). The rest is copied tool documentation. The gitea references explicitly say the research doc "has a known history of drifting from the deployed server". Every `apm.yml` uses `includes: auto`; whether the directory ships to consumers needs one check. Keep upstream URLs in one line per plugin README; git history keeps the rest. Check obra/superpowers licence if anything is retained. Goes together with finding 11: 32 `sources.md` files carry "Research doc" paths into these directories. Effort S.
|
||||||
|
> **Decision (2026-09-12):** Keep. `docs/research/` is retained on purpose — it's read by agents doing work sourced from those docs. Not proceeding.
|
||||||
|
|
||||||
|
10. [x] ~~**Delete per-skill `README.md` and `references/README.md` (48 files, 1,574 lines).** They restate the SKILL.md in narrative form. The pre-commit config itself notes a skill README "is consumer-facing prose that no agent ever loads". Keep one plugin-level README with one line per skill. Requires dropping the README criterion in `skill-audit/references/file-structure.md` and the README step in `new-skill.sh`. Effort S.~~
|
||||||
|
> **Done (2026-09-12):** see commit `edcc57c` on `docs/simplification-audit`. Deleted the 48 per-skill/reference READMEs plus 2 scaffold templates; dropped the README criterion from `skill-audit`'s `file-structure.md` and `finding-criteria.md` and the README-generation step from `new-skill.sh`; updated `new-skill.bats` to match. Plugin-root READMEs were kept, not part of this finding.
|
||||||
|
|
||||||
|
11. **Drop the provenance chain: `sources.md`, `source_keys` frontmatter, `validate-provenance.sh`.** 32 plugin and skill `sources.md` files (about 1,300 lines) plus 9 research indexes, 216 source files with `source_keys`, two copies of the validator (1,198 and 632 lines) with ten checks, and 125 bats tests exist to track which upstream informed which file. Git blame and a URL in the README do the same job. This is more code than the content it tracks. Effort M (touches skill-audit, both validator copies, two repo tests, and every skill's frontmatter).
|
||||||
|
|
||||||
|
12. [x] ~~**Strip ADR and changelog narration from model-facing files.** `ADR-0020` is cited in 3 of 7 kyberforge SKILL.md files and 16 references; ADR-0023 is cited inline 21 times in the git plugin. Examples: "was the old house rule and ADR-0020 deleted it", "were removed per ADR-0015 once issue #90 landed", "this file previously recorded `list_issues` as having neither a `type` nor a `milestones` parameter". `skill-author/references/retrofit.md` (197 lines) is a one-time migration guide; it is loaded from `improve.md` and listed in `sources.md`, so remove those in the same change. These belong in git history or the ADR, not in context. Effort S.~~
|
||||||
|
> **Done (2026-09-12):** see commit `edcc57c` on `docs/simplification-audit`. Historical narration stripped from kyberforge (ADR-0020) and git (ADR-0023) skill content; `retrofit.md` deleted along with its load-step and `sources.md` entries. Caught in review: some `ADR-0023` tags were not narration but the `check-rtk-prefix` hook's required opt-out marker for intentionally-bare git commands — those 12 were restored, not left stripped.
|
||||||
|
|
||||||
|
13. **State repeated boilerplate once or delete it.** A near-identical "Resolve owner and repo" block in 5 of 7 gitea skills; 404-masks-403 in 6 files; manual pagination in 7; main/master refusal in 9 git files; the "use the project's domain glossary, respect ADRs" paragraph in 5 bin skills. Three git skills define three different structured-result JSON shapes whose only consumer is `git-orchestrate` (finding 19). Effort S.
|
||||||
|
|
||||||
|
### 4.2 kyberforge (290 files, 44,568 lines incl. mirror; the 7 SKILL.md bodies are 333 lines, under 1%)
|
||||||
|
|
||||||
|
14. **Merge `skill-audit` + `agent-audit` into one `audit` skill (removes about 3,300 lines and two pre-push hooks).** `vale-wrap.sh` is byte-identical in both; five Vale rules byte-identical (agent-audit carries one extra, so it is the superset); `validate.sh` shares a 1,061-line boundary-target resolver block that diffs as zero lines; SKILL.md steps 1, 3, 4 and the gotchas are the same text. Each copy is hard-wired to one mode, so the merged script needs a path switch. The duplication exists because a plugin-cache install copies only each skill's own files (the rule ADR-0014 follows), so a script cannot be shared across skills; merging the skills is the only way to remove the copy. Effort M.
|
||||||
|
|
||||||
|
15. **Merge `skill-author` + `agent-author` likewise.** `contract.md` shares most of its Description section; `new-skill.sh` and `new-agent.sh` implement the same package-root walk-up with different mode names; step 1 dispatch tables and step 3 gates are near-identical. Keep the agent scope logic (plugin vs project/user) as its own reference. Effort M.
|
||||||
|
|
||||||
|
16. **Cut the validators by an order of magnitude.** `validate.sh` is 1,677 lines of bash with embedded Python, ported twice; `skill-size-check.sh` is 1,497. Target about 200 lines total: frontmatter present, size ceilings, boundary targets resolve. The 526-line `vale-wrap.sh` exists to work around folded `>` scalars in descriptions; writing descriptions as `|` literal blocks removes the folding problem, but the wrapper is also the exported hook entry in `.pre-commit-hooks.yaml` and carries the NOT RUN guard the audits depend on, so it shrinks rather than disappears. This is where the real complexity lives and is the item most worth discussing. Effort L.
|
||||||
|
|
||||||
|
17. **Fold `forge` and `apm-install`.** `forge` is a four-row routing table plus 207 lines of references explaining fork vs inline; it should be 25 lines with no references. `apm-install` (53 lines + 17-line sources) becomes a sixth dispatch row in `apm-workflow`. Effort S.
|
||||||
|
|
||||||
|
18. **Delete prose the model already knows.** "Valid characters: lowercase letters, numbers, hyphens"; what pipx does and PEP 668; "code blocks carry a language tag"; "data to stdout, diagnostics to stderr". Ironically `body-discipline.md` instructs auditors not to include "concepts the agent already knows". Effort S.
|
||||||
|
|
||||||
|
### 4.3 git and gitea (153 + 93 files, 9,889 + 6,047 lines incl. mirror; source 3,288 + 2,286)
|
||||||
|
|
||||||
|
19. **Delete the two router skills and two orchestrate agents (309 lines + 195 reference lines).** No skill invokes them as a step; they appear only in boundary clauses (`AGENTS.md`, `git-worktrees`, `gitea-issues`, `gitea-prs`) and as worked examples in agent-audit references, all of which must change in the same commit or `skill-size-check` fails on the dangling target. Claude Code already routes on descriptions. The chain today is `git-workflow` step 5 invokes `git-orchestrate`, whose step 5 invokes `git-commits`, which runs `rtk git commit`: three hops. Both agents exceed 900 words; ADR-0020 deliberately sets no agent body gate. Effort S.
|
||||||
|
|
||||||
|
20. **Collapse git 7 skills to 1; gitea 7 to 2.** Git references are man-page restatement: `git-log-format.md` (242 lines listing `%H`, `%ar`), `conventional-commits-spec.md` (170 lines), `worktrees.md` (178), `merging.md` explaining fast-forward. Roughly 60% of the plugin is generic. The genuinely house-specific content fits in about 150 lines: the `rtk` rule and ADR-0023 exceptions, main/master refusal, `--no-verify`, the `-i --autosquash` 2.39.5 trap, `--force-with-lease --force-if-includes`, bisect exit codes, submodule push ordering, the detached-HEAD worktree trap. Gitea is more legitimately specific (MCP schema quirks: `tree_sha`, `withLines`, silent drops on PR create, `per_page` 20 vs 30, 404 means 403) and splits naturally into `gitea-tracker` (issues, PRs, labels, milestones) and `gitea-repo` (branches, files, releases). Risk: one description must carry all trigger phrases; keep a dispatch table at the top of the body. Keep `pc-author` and `pc-run` (finding 38). Effort M.
|
||||||
|
|
||||||
|
21. **Delete `config.example.json` / `.claude/plugins/git/config.json`.** Read by two steps, written by nothing. Default to GitHub Flow with the existing `develop` / `release/*` inference. Effort S.
|
||||||
|
|
||||||
|
### 4.4 bin, core, lint (88 + 49 + 31 files incl. mirror)
|
||||||
|
|
||||||
|
22. **bin: strip generic process theatre.** `write-docs` is 109 lines, mostly form-filling sections plus a 15-line source provenance block; its rules fit in 25 lines. `tdd` is about 70% textbook (RED/GREEN diagram, "good tests are integration-style", five thin references restating textbook design advice). `diagnose` 40%, `prototype` 50% (pixel-level UI switcher spec), `grill-with-docs` 35%. Keep the opinionated parts: "no horizontal slicing", "no phase 2 without a loop", `[DEBUG-xxxx]` tags, "never infer the output path", the triage state machine. Effort M.
|
||||||
|
|
||||||
|
23. **bin: merge `grill-me` into `grill-with-docs`.** `grill-me` is 16 lines and a subset of the docs flow; `grill-with-docs` creates `CONTEXT.md` when missing, so the merged skill needs a no-write opt-out. `caveman` (50 lines) and `zoom-out` (9) are hand-invoked prompts rather than workflow skills; they are also the repo's `disable-model-invocation` exemplars in `CONTEXT.md`, `contract.md`, ADR-0020, ADR-0021, and `gates.md`, and `install.sh` has no path for `~/.claude/commands/`, so moving them means picking a new exemplar. `improve-codebase-architecture` defines its glossary twice (inline and in `language.md`; the README documents the split as intentional). Effort S.
|
||||||
|
|
||||||
|
24. **core: `provider-adapter-author` is a 1,200-line wrapper around one instruction** ("replace duplicated lines with `@AGENTS.md`, keep provider-specific lines"): a 496-line validator with a 519-line bats suite for a check that is a grep. `agentsmd-author` already calls `agentsmd-audit` as mandatory closeout, and both route to `provider-adapter-author` in boundary clauses that must change with it. Target: one `agentsmd` skill with an audit mode, adapter conversion as a step, validator about 40 lines. Needs an ADR-0012 revisit. Effort L.
|
||||||
|
|
||||||
|
25. **lint: delete the `lint-runner` agent.** Its body is "call `vale-run`, reformat output", which `--output=JSON` already gives; it exists for backends that do not exist. It is the example boundary clause in three `agent-author` templates and ADR-0016, so those need a new example. About 40% of `vale-config` is install tables and settings lists the model can fetch from vale.sh. Keep the house-verified matrices (`E100`/`E201`, `Packages` below glob, frontmatter, ignore paths). `lint/docs/research/docs/vale/` overlaps the skill's own references by about two thirds. Effort S.
|
||||||
|
|
||||||
|
## 5. Prose and docs (9,600 lines, 109,000 words outside plugins)
|
||||||
|
|
||||||
|
26. [ ] **Move or delete `docs/research/` and `docs/notes/` (4,500 lines, 47% of prose words).** Six of eleven research files are linked only from each other; they are self-described session audit trails, agendas, and a "temporary build reference". `docs/notes/factory-research-gaps-conflicts.md` says "Status: Superseded"; `factory-integration-decisions.md` says "Complete" and its decisions already live in ADRs, yet `AGENTS.md` tells every session to read it. `archive/team-self-organisation-sprint-brief.md` (3,400 words) is unrelated to this repo. Archive or delete; drop the three `AGENTS.md` pointers. Moving `CONTROLS.md` to `docs/spec/` means updating its literal path in nine or more files including the deployed `governance.md`. Effort S.
|
||||||
|
> **Decision (2026-09-12):** Keep. Same reasoning as finding 9 — these docs are intentional context for sourced work. Not proceeding.
|
||||||
|
|
||||||
|
27. **Four governance documents say one thing.** `core/instructions/governance.md` (949 words, always-on), `docs/ai-constitution.md` (2,906), `docs/wiki/HUMANS.md` (1,413), `CONTROLS.md` (1,224), with near-identical preambles and, in three of the four, a "what this file does not govern" block pointing at the others. The constitution repeats one of its own principle lead sentences. Keep `governance.md` as the operative file, trimmed to about 50 lines (drop the classification table that repeats the bullets above it, the footer, the non-governance block). Dedupe the constitution by about 20%. Effort M.
|
||||||
|
|
||||||
|
28. **ADRs: 2,740 lines, 72% in eight ADRs over 150 lines.** ADR-0020 is 513 lines with a 71-line measurement log as Context; ADR-0017 has 173 lines of amendments against 45 of decision. ADR-0001 is superseded and ADR-0006 moot, both keeping full text below the banner. ADR-0002 is three lines. Truncate superseded ones to the banner, fold amendments into the decision, cap Context at 20 lines, add a 25-line `docs/adr/README.md` index with status. The rules already live in `gates.md`; the ADRs need only decision and consequences. Effort M.
|
||||||
|
|
||||||
|
29. **The same facts are stated in full three or four times.** "Edit `.apm/`, never the mirror": README (2 paragraphs), AGENTS.md (2 paragraphs), architecture.md (2 paragraphs plus the lost-README anecdote), ADR-0017. The apm.lock / SessionStart story: README (11 lines), AGENTS.md, ADR-0018, ADR-0019, gates.md. The offline `SKIP=` command and the three-stage install each appear three times. Rule: README has the how-to, AGENTS.md has one-line rules with links, architecture.md has mechanics. Effort S.
|
||||||
|
|
||||||
|
30. [x] ~~**`LESSONS.md`: 41 entries, 2 graduated, about 12 stale.** Twelve entries from 2026-05-17 describe a write-skill / write-eval workflow whose skills no longer exist. One entry is open work labelled "Status: neither part landed". The longest eight are 200 to 550-word incident reports. Delete the stale entries, move open work to an issue, cap entries at about 60 words, target 100 lines. Effort S.~~
|
||||||
|
> **Done (2026-09-12):** see commit `629320b` on `docs/simplification-audit`. 255→131 lines, 41→30 entries. Kept 3 of the same-dated entries (RLHF defaults, secrets-rule gap, HITL gap) — judged unrelated to the defunct write-skill/write-eval workflow and still applicable, so 10 deleted rather than 12. The "neither part landed" open-work entry (CONTEXT.md not `@import`ed at session start) was removed rather than filed as an issue — full text preserved in this session's transcript if wanted later.
|
||||||
|
|
||||||
|
31. **`CONTEXT.md`: 28 terms, most used only by gates.md, scripts, or tests rather than by skills;** two (Preload tax, Skill context contract) are never used outside `CONTEXT.md` and ADR-0020. The preload-tax entry quotes two dated numbers then says not to quote them. The example dialogue and flagged-ambiguities sections are grill residue. Cut to about 20 one-line terms. Effort S.
|
||||||
|
|
||||||
|
32. **Structure is described three ways** (README layout table, architecture.md plugin table, AGENTS.md structure bullets), and `VISION.md` carries a 35-line stack spec for a product that lives in another repo. One layout table in README; architecture.md keeps mechanics only; VISION drops the stack detail. Effort S.
|
||||||
|
|
||||||
|
## 6. Distribution, versioning, and session startup
|
||||||
|
|
||||||
|
Not covered by the area audits above; found on a final sweep of the root config and install pipeline. The install pipeline itself (`scripts/install.sh` 55 lines, `deploy-manifest.sh` 24, statusline 109) is fine and needs nothing.
|
||||||
|
|
||||||
|
33. **Every plugin version lives in four places (five for kyberforge), plus one per skill.** `plugins/<name>/apm.yml`, two generated `plugin.json` files, the root `apm.yml` packages list, the `executables.allow` key (`kyberforge#1.6.2`), and a `metadata.version` in all 39 SKILL.md files (ADR-0022) that nothing consumes and that drifts freely (gitea skills sit at five different values). Repo tags (`v2.0.1`) follow a third scheme that the declared `tagPattern: v{version}` can never match under `per_package` versioning. ADR-0006, ADR-0022, `check-executables-allow-sync`, `skill-frontmatter`, and `apm pack --check-versions` all exist to police this. Proposal: one version per plugin in its `apm.yml`; drop `metadata.version` and ADR-0022; let `apm pack` derive the rest. Effort M.
|
||||||
|
|
||||||
|
34. **The SessionStart hook auto-updates the install on every startup.** `check-apm-current.sh` runs `apm outdated` (network, 60 s timeout) and then `apm update --yes` (300 s timeout) at every session start, rewriting `apm.lock.yaml`. That is why the lock file is dirty at the start of this session and why `AGENTS.md` has to explain "commit or discard it deliberately". It is a 60-line script with a 368-line test, an ADR (0019), the `executables.allow` pin, and a sync hook behind it. For a repo that is its own source, the update belongs in `install.sh` or a manual `apm update`, not in session startup. Effort S to remove; the design question is whether auto-update at startup is wanted at all.
|
||||||
|
|
||||||
|
35. **Outputs and packages for consumers that do not exist.** The `codex` output profile generates `.agents/plugins/marketplace.json` (95 lines) although Codex is not a supported consumer. The `mattpocock-skills` remote package entry is the only reason `apm-marketplace-check` needs the network, and its pin is advanced by hand (ADR-0015). The `.github/plugin/marketplace.json` mirror is a legacy path (finding 2). Removing all three leaves one generated marketplace manifest (the per-plugin `plugin.json` pairs remain) and no network-dependent hook. Effort S.
|
||||||
|
|
||||||
|
36. **The release-tag mechanism guards an external contract with no known consumer.** `.pre-commit-hooks.yaml` exports three hooks for other repos to pin by `rev: <tag>`. `check-release-needed` (242 lines + 442 test), `test-vale-hooks-consumer` (270 lines), ADR-0014, and three tags exist to serve that. If no other repo pins these hooks today, the whole mechanism can be deferred until one does. Effort S.
|
||||||
|
|
||||||
|
37. **Two `.mcp.json` files declare an Obsidian vault server over `docs/`** (root and `plugins/bin/`; the other five plugin `.mcp.json` files are empty stubs), while `AGENTS.md` forbids using an external memory system for this repo. If the Obsidian tools are unused, drop both and the `reinject_mcp_servers` explanation in the bin README; the bin `plugin.json` pair regenerates. Effort S.
|
||||||
|
|
||||||
|
38. **`pc-author` / `pc-run` (689 lines) carry generic pre-commit documentation.** `hooks-by-language.md` (128 lines) and `failure-patterns.md` (133) restate pre-commit.com. Keep the skills, trim to the house-specific rules. Effort S.
|
||||||
|
|
||||||
|
## 7. Suggested order
|
||||||
|
|
||||||
|
1. Quick wins, all S, no design decisions needed: findings 9, 10, 26, 30, 31, 29, 12, 13, 1, 6, 4, 35, 37, 38, and the mirror-sync and executables-allow halves of 2. Removes roughly 25,000 to 30,000 lines and 6 hooks.
|
||||||
|
2. Structural changes that need a short discussion: 14, 15, 19, 20, 23, 25, 17, 3, 5, 7, 33, 34, 36.
|
||||||
|
3. The real complexity: 16 (validators), 11 (provenance), 24 (core), 8 and 28 (gates.md and ADRs).
|
||||||
|
|
||||||
|
Findings 9, 10, 11, and 12 are coupled through the provenance validator and the audit criteria; land them together or the audit gates start reporting the removals.
|
||||||
|
|
||||||
|
## 8. Questions to settle before starting
|
||||||
|
|
||||||
|
- **Native Claude Code marketplace install vs apm-only.** The flat mirror, `check-plugin-content-sync`, and ADR-0017 exist only for native `claude plugin install`. If apm install is the only supported path, the mirror and its 2,100 lines of tooling go away. Which install paths must work for consumers?
|
||||||
|
- **Copilot CLI legacy path.** Is `.github/plugin/marketplace.json` still read by any Copilot version you target? If not, finding 2c is a pure delete.
|
||||||
|
- **Provenance chain.** Is "which upstream informed this file" a requirement you still want, or was it a governance experiment? Finding 11 hinges on this.
|
||||||
|
- **ADR-0012 (three core skills) and the one-script-per-skill install constraint.** The merges in 14, 15, and 24 need the first revisited and are the only way around the second. Are you open to superseding ADR-0012?
|
||||||
|
- **Granularity of git/gitea skills.** One `git` skill vs seven trades routing precision for size. Is one broad description acceptable?
|
||||||
|
- **Auto-update at session start.** Do you want the install refreshed from the remote every time a session opens (finding 34), or is a manual `apm update` acceptable?
|
||||||
|
- **External hook consumers.** Does any other repo pin this repo's `.pre-commit-hooks.yaml` by tag today? If not, finding 36 defers the release mechanism entirely.
|
||||||
|
- **Obsidian MCP.** Are the Obsidian tools over `docs/` used by anyone? If not, finding 37 is a pure delete.
|
||||||
@@ -49,13 +49,6 @@ Two compilers produce the plugin roots you see in the tree:
|
|||||||
|
|
||||||
`.apm/` is the sole hand-edited authoring source for plugin content. An edit made in the flat mirror is discarded by the next sync and is reported as drift by the `check-plugin-content-sync` pre-push hook. Hand-authored material that is not an `.apm/` primitive — `README.md`, `docs/`, `bin/`, `sources.md`, `.mcp.json`, and per-plugin extras such as `plugins/git/config.example.json`, `plugins/gitea/references/` and `plugins/bin/evals/` — lives at the plugin **root** and is untouched by either compiler.
|
`.apm/` is the sole hand-edited authoring source for plugin content. An edit made in the flat mirror is discarded by the next sync and is reported as drift by the `check-plugin-content-sync` pre-push hook. Hand-authored material that is not an `.apm/` primitive — `README.md`, `docs/`, `bin/`, `sources.md`, `.mcp.json`, and per-plugin extras such as `plugins/git/config.example.json`, `plugins/gitea/references/` and `plugins/bin/evals/` — lives at the plugin **root** and is untouched by either compiler.
|
||||||
|
|
||||||
`.mcp.json` is the one entry in that list that is still load-bearing for apm rather than merely ignored by it. MCP is a first-class apm primitive — `dependencies.mcp` sits beside `dependencies.apm` in the manifest schema, and apm tracks deployed servers in `apm.lock.yaml` under `mcp_servers`, `mcp_configs` and `mcp_config_provenance`. A plugin reaches that primitive indirectly. `apm pack` writes the string `".mcp.json"` into the generated `.github/plugin/plugin.json` as its `mcpServers` value, and on install apm resolves the plugin manifest in the order `plugin.json`, `.github/plugin/plugin.json`, `.claude-plugin/plugin.json` — so the Copilot manifest wins, the pointer is followed, and `.mcp.json` is injected into the package's `dependencies.mcp` with any `${VAR}` env references intact. Verified against the real remote: a git-sourced install of `plugins/gitea` deploys the gitea server with both env references unexpanded.
|
|
||||||
|
|
||||||
Two consequences follow, and both have bitten already:
|
|
||||||
|
|
||||||
- **Do not declare `dependencies.mcp` in a plugin's own `apm.yml`.** It is the schema-correct place and it breaks the build. The `apm-audit-ci` pre-push hook runs `apm audit --ci` inside every `plugins/*/`, so a declared dependency arms `lockfile-exists` there, which then demands an `apm.lock.yaml` in the package plus every file of that package's own deployed tree present inside the package directory. Measured on `plugins/gitea`: 93 missing deployed files and 79 drifted paths.
|
|
||||||
- **`.claude-plugin/plugin.json` carries an env-stripped copy.** `apm pack` inlines `.mcp.json` there, and its sanitiser drops `env` and `headers` blocks unconditionally at any depth, `${VAR}` indirection included. That copy is inert under apm, which never reaches it, but a native Claude Code plugin install reads exactly that file and would launch the server with no credentials. Anything installed natively rather than through apm needs its MCP env supplied by the host.
|
|
||||||
|
|
||||||
That immunity is positional, not by filename. Anything placed *inside* a mirrored directory is destroyed regardless of what it is: `sync_dir` runs `rm -rf "$dst"` before every copy, and `sync_hooks_json` does the same to `hooks/`. A hand-written `README.md` under `plugins/<name>/hooks/` or `plugins/<name>/skills/` is deleted by the next sync with no drift report, because a file with no `.apm/` counterpart is simply absent from the regenerated tree. This has already cost the repo one document — `plugins/kyberforge/hooks/README.md`, since restored to `plugins/kyberforge/docs/hooks.md`. Plugin-root documentation belongs in `docs/`.
|
That immunity is positional, not by filename. Anything placed *inside* a mirrored directory is destroyed regardless of what it is: `sync_dir` runs `rm -rf "$dst"` before every copy, and `sync_hooks_json` does the same to `hooks/`. A hand-written `README.md` under `plugins/<name>/hooks/` or `plugins/<name>/skills/` is deleted by the next sync with no drift report, because a file with no `.apm/` counterpart is simply absent from the regenerated tree. This has already cost the repo one document — `plugins/kyberforge/hooks/README.md`, since restored to `plugins/kyberforge/docs/hooks.md`. Plugin-root documentation belongs in `docs/`.
|
||||||
|
|
||||||
## Governance layer
|
## Governance layer
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
# caveman
|
|
||||||
|
|
||||||
Ultra-compressed output mode: drop articles, filler and pleasantries, keep the technical substance exact.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Switches the agent into a terse register — no articles, no hedging, no pleasantries, fragments allowed, arrows for causality — while leaving technical terms, code blocks and quoted error strings untouched. The mode is *sticky*: once turned on it stays on for every subsequent response until the user says "stop caveman" or "normal mode", rather than decaying back to normal prose after a few turns.
|
|
||||||
|
|
||||||
It carries one built-in escape hatch. Security warnings, confirmations for irreversible actions, multi-step sequences where fragment order could be misread, and any request to clarify are answered in normal prose, then the compressed register resumes.
|
|
||||||
|
|
||||||
## Hand-invoked only
|
|
||||||
|
|
||||||
`SKILL.md` sets `disable-model-invocation: true`. This is the single most important thing to know about this skill: **the model cannot route to it.** No other skill can hand off to it, and no phrasing in a user's request will cause it to be selected automatically. The only way in is the human typing `/caveman`.
|
|
||||||
|
|
||||||
That is deliberate — output style is the user's choice, not an inference the router should make on their behalf. It is also why the description reads as one plain human-facing sentence rather than carrying the trigger phrasing and boundary clause a routable skill needs.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/caveman
|
|
||||||
```
|
|
||||||
|
|
||||||
Then keep working normally. To leave the mode, say "stop caveman" or "normal mode".
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The whole skill — persistence rule, compression rules, worked examples, and the auto-clarity exception |
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# diagnose
|
|
||||||
|
|
||||||
A six-phase discipline for hard bugs and performance regressions: feedback loop → reproduce → hypothesise → instrument → fix with a regression test → clean up.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Imposes an order of operations on debugging so the agent cannot skip to guessing. The load-bearing phase is the first one: build a fast, deterministic, agent-runnable pass/fail signal for the bug. Everything downstream — bisection, hypothesis testing, instrumentation — just consumes that signal, so the skill refuses to advance to Phase 2 without one, and says so explicitly rather than hypothesising blind.
|
|
||||||
|
|
||||||
The remaining phases each carry a constraint worth knowing about: hypotheses are generated 3–5 at a time and must be falsifiable, so the first plausible idea cannot anchor the whole investigation; every debug log is tagged with a unique prefix (`[DEBUG-a4f2]`) so cleanup is a single grep; the regression test is written before the fix and only at a seam that exercises the real bug pattern; and the run closes by asking what would have prevented the bug, handing off to `improve-codebase-architecture` when the answer is architectural.
|
|
||||||
|
|
||||||
Performance regressions take a branch of their own inside Phase 4 — baseline measurement and bisection, not logs.
|
|
||||||
|
|
||||||
## Conditional reading
|
|
||||||
|
|
||||||
Neither reference file is read on every run; `SKILL.md` names the condition for each.
|
|
||||||
|
|
||||||
- `references/feedback-loops.md` is read when Phase 1 has no signal yet, or when the loop you have is slow or intermittent.
|
|
||||||
- `references/regression-seams.md` is read when Phase 5 leaves you unsure whether the available seam is deep enough — or whether one exists at all.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/diagnose
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the bug or the regression. For filing and triaging a reported bug rather than diagnosing it, use `triage`; for test-first feature work, use `tdd`.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The six phases and their gates — what must be true before each one ends |
|
|
||||||
| `references/feedback-loops.md` | Loaded when Phase 1 has no loop or the loop is too weak: ten ways to construct one ordered by cost, how to sharpen an existing loop, handling intermittent bugs, and what to ask the user for when the bug resists reproduction |
|
|
||||||
| `references/regression-seams.md` | Loaded when Phase 5 is unsure about the seam: what makes a seam correct, the four shapes of a too-shallow seam, and what to do when no correct seam exists |
|
|
||||||
| `assets/hitl-loop.template.sh` | Copy-and-edit bash template for the last-resort human-in-the-loop feedback loop, cited by `references/feedback-loops.md`. Provides `step` and `capture` helpers and prints captured values as `KEY=VALUE` for the agent to parse |
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# grill-me
|
|
||||||
|
|
||||||
Interview the user relentlessly about a plan or design until the decision tree is fully resolved.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Turns the agent into an interviewer rather than an implementer. It walks the design tree branch by branch, resolving dependencies between decisions one at a time, and offers its own recommended answer alongside each question so the user has something concrete to push against. Two rules give it its shape: **one question at a time**, and **never ask what the codebase can answer** — if a question is settleable by reading the code, the agent goes and reads the code instead of spending the user's attention on it.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
This is the plain grilling loop, with no documentation side effects. The sibling `grill-with-docs` skill runs the same interview but additionally challenges answers against the project's `CONTEXT.md` glossary and existing ADRs, and writes decisions back into those files as they crystallise. Reach for that one when the project has a domain model worth defending; reach for this one when it does not, or when nothing should be written down yet.
|
|
||||||
|
|
||||||
`triage` composes the documented variant, not this one, when an issue needs fleshing out.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/grill-me
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the plan or design to be stress-tested. Expect questions one at a time, each with a recommended answer.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The whole skill — the interview instruction, the one-question-at-a-time rule, and the explore-instead-of-asking rule |
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# grill-with-docs
|
|
||||||
|
|
||||||
The grilling interview, run against the project's domain model — and writing decisions back into `CONTEXT.md` and ADRs as they land.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Runs the same relentless one-question-at-a-time interview as `grill-me`, with the project's own documentation as an active participant. During codebase exploration it also locates the domain documentation — a root `CONTEXT.md` and `docs/adr/`, or a `CONTEXT-MAP.md` pointing at per-context glossaries and ADR directories in a multi-context repo — and then uses it five ways:
|
|
||||||
|
|
||||||
- **Challenges terms against the glossary.** When the user's usage conflicts with what `CONTEXT.md` already defines, that is raised immediately rather than absorbed.
|
|
||||||
- **Sharpens fuzzy language** by proposing a precise canonical term ("you're saying 'account' — do you mean the Customer or the User?").
|
|
||||||
- **Stress-tests domain relationships with concrete scenarios**, inventing edge cases that force the user to be precise about where one concept ends and the next begins.
|
|
||||||
- **Cross-references claims against the code**, and surfaces contradictions between what the user says happens and what the code does.
|
|
||||||
- **Updates `CONTEXT.md` inline**, the moment a term is resolved, rather than batching changes to the end of the session where they get lost.
|
|
||||||
|
|
||||||
Files are created lazily — only when there is something real to write.
|
|
||||||
|
|
||||||
ADRs are offered *sparingly*, and only when all three tests pass: the decision is hard to reverse, it would surprise a future reader without the context, and it was a genuine trade-off with real alternatives. Missing any one of the three means no ADR.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`grill-me` is the same interview without the documentation side effects — use it when there is no domain model to defend or nothing should be written down yet. `triage` composes this skill (not `grill-me`) at step 4 when an issue needs fleshing out. `improve-codebase-architecture` runs its own grilling loop and borrows this skill's `CONTEXT.md` and ADR discipline for the decisions that come out of it.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/grill-with-docs
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the plan or design. Expect questions one at a time, each with a recommended answer, and expect `CONTEXT.md` to be edited during the session rather than after it.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The interview instruction plus the domain-awareness rules: file layout discovery, the five during-session behaviours, and the three-part ADR test |
|
|
||||||
| `references/context-format.md` | Cited when a term is resolved: the structure of a `CONTEXT.md` and how to write a Language entry |
|
|
||||||
| `references/adr-format.md` | Cited when an ADR is offered: `docs/adr/` naming, sequential numbering, and the ADR template |
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# improve-codebase-architecture
|
|
||||||
|
|
||||||
Surface architectural friction and propose deepening opportunities — refactors that turn shallow modules into deep ones.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Looks for places where a codebase is hard to understand, hard to test, or hard for an agent to navigate, and proposes refactors that concentrate behaviour behind smaller interfaces. It runs in three stages:
|
|
||||||
|
|
||||||
1. **Explore.** Reads the domain glossary and any ADRs in the area first, then walks the codebase with an `Explore` sub-agent — organically, noting friction rather than applying fixed heuristics. The **deletion test** is the filter: imagine deleting the module; if complexity vanishes it was a pass-through, if complexity reappears across N callers it was earning its keep.
|
|
||||||
2. **Present candidates.** A numbered list, each with files, problem, solution and benefits — benefits stated in terms of *locality* and *leverage* and of how tests would improve. No interfaces are proposed yet; the user picks one.
|
|
||||||
3. **Grilling loop.** Walks the design tree for the chosen candidate, with documentation side effects landing inline as decisions crystallise.
|
|
||||||
|
|
||||||
The skill is opinionated about vocabulary, and that is the point: **module, interface, implementation, depth, seam, adapter, leverage, locality**, used exactly, with no drift into "component", "service", "API" or "boundary". Domain nouns come from `CONTEXT.md`, architecture nouns from `references/language.md` — so a proposal reads as "the Order intake module", never "the FooBarHandler".
|
|
||||||
|
|
||||||
ADRs are treated as decisions not to be re-litigated. A candidate that contradicts one is surfaced only when the friction is real enough to warrant reopening it, and is marked as such.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`diagnose` hands off here when a bug's post-mortem concludes that no correct test seam exists, or that callers are tangled — the recommendation is made after the fix is in, not before. The grilling loop follows `grill-with-docs`'s discipline for `CONTEXT.md` entries and ADR offers, and `SKILL.md` names that skill's format documents directly.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/improve-codebase-architecture
|
|
||||||
```
|
|
||||||
|
|
||||||
Point at a codebase or an area of one. Expect a numbered candidate list and a "which of these would you like to explore?" before any interface design happens.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Condensed glossary, key principles, and the three-stage process |
|
|
||||||
| `references/language.md` | Cited throughout `SKILL.md`: full definitions of every term, the words each one replaces, and the full principle list |
|
|
||||||
| `references/interface-design.md` | Read at stage 3 when the user wants alternative interfaces explored: the parallel sub-agent "Design It Twice" pattern, framing the problem space, and the per-agent design constraints |
|
|
||||||
| `references/deepening.md` | Cited from `references/interface-design.md`: how to deepen a cluster of shallow modules safely, the four dependency categories (in-process, local-substitutable, remote-but-owned, true external), seam discipline, and the replace-don't-layer testing strategy |
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# prototype
|
|
||||||
|
|
||||||
Build a throwaway prototype that answers one design question — either a runnable terminal app or several UI variations.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Treats a prototype as **throwaway code that answers a question**, and lets the question decide the artifact. `SKILL.md` opens with a two-row dispatch table and the run resolves exactly one row before doing anything else:
|
|
||||||
|
|
||||||
- *"Does this logic / state model feel right?"* → a tiny interactive terminal app that pushes the state machine through the cases that are hard to reason about on paper.
|
|
||||||
- *"What should this look like?"* → several radically different UI variations on one route, switchable from a floating bottom bar via a URL search param.
|
|
||||||
|
|
||||||
The two branches produce fundamentally different artifacts, so picking wrong wastes the whole prototype. When the question is genuinely ambiguous and the user is unreachable, the skill defaults on the shape of the surrounding code (backend module → logic, page or component → UI) and states the assumption at the top of the prototype rather than silently choosing.
|
|
||||||
|
|
||||||
Six rules apply to both branches: throwaway and visibly named as such, one command to run, no persistence by default, no polish, surface the full state after every action or variant switch, and delete or absorb the prototype when it is done. The *answer* is the only durable output — the skill captures it in a commit message, ADR, issue or `NOTES.md` before the code is deleted.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/prototype
|
|
||||||
```
|
|
||||||
|
|
||||||
State the design question. For production code, use `tdd`; for talking a design through without building anything, use `grill-me`.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The branch dispatch table and the rules that apply to both branches |
|
|
||||||
| `references/logic.md` | The logic branch, read only when that row is selected: when it is the right shape, and how to build the interactive terminal app |
|
|
||||||
| `references/ui.md` | The UI branch, read only when that row is selected: when it is the right shape, and how to build and switch between the variations |
|
|
||||||
|
|
||||||
Each reference is self-contained — a run reads one of the two, never both.
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# research
|
|
||||||
|
|
||||||
Research a tool, library or API from canonical documentation into a directory of structured per-topic reference files.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Runs a six-step pipeline: scope against the working directory (what version is actually in use, what is already documented), resolve the topic through Context7, websearch for canonical docs covering whatever Context7 missed, read those sources, deepen one level into the links worth following, then write one markdown file per topic area plus a `sources.md` provenance record.
|
|
||||||
|
|
||||||
Four gotchas at the top of `SKILL.md` shape the whole run, and each exists because of a specific failure: the output path is never inferred (a guessed destination scatters a directory's worth of files through someone's source tree); nothing is written outside that path; no empty topic file is ever written (a stub `troubleshooting.md` reads downstream as researched and closed); and a Context7 "no results", redirect or header-only response does not count as coverage. If no topic area has content, the run writes nothing at all — `sources.md` included — and reports what it searched.
|
|
||||||
|
|
||||||
The frontmatter pins `model: sonnet` and a closed `allowed-tools` list. Notably it grants no subagent tool, so every `WebFetch` is serial and each fetched page lands in the run's own context — which is why steps 4 and 5 insist on reducing each page to notes before fetching the next, and cap deepening at roughly ten extra pages.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
Both reference files are read on condition, never on every run — `SKILL.md` inlines the minimum each step needs (the seven default topic areas at step 1, the four `sources.md` field names and the topic-file frontmatter keys at step 6) and sends the run to the reference only for what it does not carry. Those four field names are matched literally by the downstream provenance validator, so prose written in their place parses as nothing and the check passes having verified nothing — which is why they are inlined rather than deferred.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/research
|
|
||||||
```
|
|
||||||
|
|
||||||
Name the topic and the output path — the skill will stop and ask if the path is missing. Supplying starting URLs is treated as a deliberate source choice and skips Context7 resolution and discovery. For documentation derived from existing code or specs, use `write-docs`; for a bug or incident, use `diagnose`.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The four gotchas and the six research steps |
|
|
||||||
| `references/topics.md` | Read at Step 1 only when what belongs in a default topic is unclear or a custom topic is needed: the per-topic coverage table and the custom-topic naming rule |
|
|
||||||
| `references/file-format.md` | Read at Step 6 only when the inlined field names do not settle the case: slug derivation, the Context7 slug and URL convention, and what belongs in a topic body |
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# tdd
|
|
||||||
|
|
||||||
Test-driven development as a strict red-green-refactor loop, one behaviour at a time.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Two convictions drive this skill. The first is about what a test is for: tests verify behaviour through public interfaces, not implementation details. A good test reads like a specification ("user can checkout with valid cart") and survives refactors because it does not care about internal structure. The warning sign for a bad one is precise — the test breaks when you refactor but behaviour has not changed.
|
|
||||||
|
|
||||||
The second is an explicit anti-pattern: **do not write all the tests first, then all the implementation.** Horizontal slicing treats RED as "write every test" and GREEN as "write every implementation", and it produces tests of *imagined* behaviour — tests of the shape of things, insensitive to real change, committed to before the implementation was understood. The correct shape is vertical: one test → one implementation → repeat, each cycle informed by what the last one taught you.
|
|
||||||
|
|
||||||
The workflow is four stages: plan (confirm the interface and which behaviours matter, with the user — you cannot test everything), fire a tracer bullet (one test proving the path works end to end), loop incrementally one behaviour at a time, then refactor once everything is green. Refactoring while RED is forbidden.
|
|
||||||
|
|
||||||
Codebase exploration uses the project's domain glossary, so test names and interface vocabulary match the project's language, and ADRs in the area are respected.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/tdd
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the feature or bug. Expect the skill to ask what the public interface should look like and which behaviours matter most before any code is written. For diagnosing an existing bug rather than building test-first, use `diagnose`; for throwaway exploratory code, use `prototype`.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Philosophy, the horizontal-slicing anti-pattern, the four-stage workflow, and the per-cycle checklist |
|
|
||||||
| `references/tests.md` | Cited from Philosophy: worked good and bad test examples |
|
|
||||||
| `references/mocking.md` | Cited from Philosophy: mock at system boundaries only, and what not to mock |
|
|
||||||
| `references/deep-modules.md` | Cited from stage 1: what a deep module is (small interface, large implementation) and why it is the design to aim for |
|
|
||||||
| `references/interface-design.md` | Cited from stage 1: designing interfaces for testability, starting with accepting dependencies rather than creating them |
|
|
||||||
| `references/refactoring.md` | Cited from stage 4: the refactor-candidate checklist — duplication, long methods, shallow modules, feature envy, primitive obsession |
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# triage
|
|
||||||
|
|
||||||
Move issues on the project issue tracker through a small state machine of triage roles.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Gives issue triage an explicit state model and a fixed set of moves. Every issue carries exactly one **category** role (`bug`, `enhancement`) and one **state** role (`needs-triage`, `needs-info`, `ready-for-agent`, `ready-for-human`, `wontfix`); conflicting state roles are flagged to the maintainer before anything else happens. Unlabeled issues normally enter at `needs-triage`; `needs-info` returns there once the reporter replies. The maintainer can override at any point, and unusual transitions are questioned rather than executed silently.
|
|
||||||
|
|
||||||
A run does one of three things depending on what the maintainer asks for:
|
|
||||||
|
|
||||||
- **Show what needs attention** — three buckets, oldest first: unlabeled, `needs-triage`, and `needs-info` with reporter activity since the last triage notes.
|
|
||||||
- **Triage a specific issue** — gather context (including prior triage notes, so resolved questions are not re-asked, and `.out-of-scope/` records that resemble the issue), recommend a category and state with reasoning, attempt reproduction for bugs *before* any grilling, run a `grill-with-docs` session if the issue needs fleshing out, then apply the outcome.
|
|
||||||
- **Quick state override** — "move #42 to ready-for-agent" is trusted and applied directly, skipping grilling, after confirming the exact changes.
|
|
||||||
|
|
||||||
Two hard rules: every comment or issue the skill posts during triage must open with the AI-generated disclaimer, and the canonical role names above are *not* necessarily the label strings in the tracker — each is resolved against the tracker's live label set before it is applied, and a name with no counterpart there is reported to the maintainer as a gap rather than guessed at.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`grill-with-docs` is invoked at step 4 when an issue needs fleshing out; whatever that session establishes is carried into the triage notes so the work is not lost. The reverse direction also exists: `diagnose` names this skill as the place to send a *reported* bug that needs filing rather than debugging.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/triage
|
|
||||||
```
|
|
||||||
|
|
||||||
Then describe what you want in natural language — "show me anything that needs my attention", "let's look at #42", "move #42 to ready-for-agent", "what's ready for agents to pick up?".
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The roles and state machine, the three invocation modes, the needs-info template, and how to resume a prior session |
|
|
||||||
| `references/agent-brief.md` | Cited when an issue moves to `ready-for-agent` (and reused for `ready-for-human`): how to write a brief that stays durable for weeks while the codebase moves under it — describe interfaces and behavioural contracts, not line numbers |
|
|
||||||
| `references/out-of-scope.md` | Cited when an enhancement is closed `wontfix` and when checking for prior rejections: how the `.out-of-scope/` knowledge base is laid out and what it is for — institutional memory, and deduplication against re-litigated requests |
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# write-docs
|
|
||||||
|
|
||||||
Produce technical documentation derived from code and spec, one section at a time, with a confirmation gate on every section.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Casts the agent as a technical writer with one non-negotiable constraint: **every claim must be traceable to a source file line, a spec section, or an explicit user statement.** Nothing is invented, and behaviour that genuinely cannot be documented from the available sources is marked out-of-scope rather than explained away.
|
|
||||||
|
|
||||||
The process is eight steps — identify scope, read and extract, gap check, draft section by section, confirmation gate, delta summary, reader testing, finalise — and several of them are deliberately gated on the human:
|
|
||||||
|
|
||||||
- Files are read only after the user approves them by name. The skill may propose candidates; it waits.
|
|
||||||
- The **gap check** presents what the code does say and asks the user to fill only what it does not: caller intent, error-handling rationale, non-obvious side effects.
|
|
||||||
- No section is finalised until the full revised text has been shown. The skill never gates on output the user has not seen, and never reprints the whole document — all edits are surgical.
|
|
||||||
- **Reader testing** predicts 5–10 questions a target reader would ask, then spawns a sub-agent that receives only the finished doc and the questions — no source files. If the doc cannot answer them, neither can the sub-agent, and the run loops back to drafting.
|
|
||||||
|
|
||||||
Summary and overview sections are written last, once the detail sections are stable.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/write-docs
|
|
||||||
```
|
|
||||||
|
|
||||||
Name the files or modules to document, the target audience (developer / user / contributor / internal), and the documentation type (reference, guide, README section, inline comment, changelog entry). For a PRD, ADR or decision doc, use `grill-me` or `grill-with-docs` instead — those have dedicated handling.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The whole skill — role, use/do-not-use boundaries, required inputs, constraints, the eight-step process, output format, failure handling, and a nine-item self-check |
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# zoom-out
|
|
||||||
|
|
||||||
Ask the agent to go up a layer of abstraction and map the modules and callers around unfamiliar code.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
A single-purpose prompt for the moment you land in a part of the codebase you do not know. Instead of answering at the level of the file in front of it, the agent climbs one layer and produces a map of the relevant modules and their callers — and names them using the project's own domain glossary vocabulary, so the map lines up with the language the rest of the repo already uses.
|
|
||||||
|
|
||||||
## Hand-invoked only
|
|
||||||
|
|
||||||
`SKILL.md` sets `disable-model-invocation: true`, so the router never selects this skill on its own and no other skill can hand off to it. It runs when the human asks for it. That also means its description is written as one plain human-facing sentence — it carries no trigger phrasing or boundary clause, because nothing routes on it.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/zoom-out
|
|
||||||
```
|
|
||||||
|
|
||||||
Best used with the unfamiliar code already in context — the skill widens the view around what you are looking at rather than picking a starting point for you.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The whole skill — a single instruction, no supporting files |
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# caveman
|
|
||||||
|
|
||||||
Ultra-compressed output mode: drop articles, filler and pleasantries, keep the technical substance exact.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Switches the agent into a terse register — no articles, no hedging, no pleasantries, fragments allowed, arrows for causality — while leaving technical terms, code blocks and quoted error strings untouched. The mode is *sticky*: once turned on it stays on for every subsequent response until the user says "stop caveman" or "normal mode", rather than decaying back to normal prose after a few turns.
|
|
||||||
|
|
||||||
It carries one built-in escape hatch. Security warnings, confirmations for irreversible actions, multi-step sequences where fragment order could be misread, and any request to clarify are answered in normal prose, then the compressed register resumes.
|
|
||||||
|
|
||||||
## Hand-invoked only
|
|
||||||
|
|
||||||
`SKILL.md` sets `disable-model-invocation: true`. This is the single most important thing to know about this skill: **the model cannot route to it.** No other skill can hand off to it, and no phrasing in a user's request will cause it to be selected automatically. The only way in is the human typing `/caveman`.
|
|
||||||
|
|
||||||
That is deliberate — output style is the user's choice, not an inference the router should make on their behalf. It is also why the description reads as one plain human-facing sentence rather than carrying the trigger phrasing and boundary clause a routable skill needs.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/caveman
|
|
||||||
```
|
|
||||||
|
|
||||||
Then keep working normally. To leave the mode, say "stop caveman" or "normal mode".
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The whole skill — persistence rule, compression rules, worked examples, and the auto-clarity exception |
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# diagnose
|
|
||||||
|
|
||||||
A six-phase discipline for hard bugs and performance regressions: feedback loop → reproduce → hypothesise → instrument → fix with a regression test → clean up.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Imposes an order of operations on debugging so the agent cannot skip to guessing. The load-bearing phase is the first one: build a fast, deterministic, agent-runnable pass/fail signal for the bug. Everything downstream — bisection, hypothesis testing, instrumentation — just consumes that signal, so the skill refuses to advance to Phase 2 without one, and says so explicitly rather than hypothesising blind.
|
|
||||||
|
|
||||||
The remaining phases each carry a constraint worth knowing about: hypotheses are generated 3–5 at a time and must be falsifiable, so the first plausible idea cannot anchor the whole investigation; every debug log is tagged with a unique prefix (`[DEBUG-a4f2]`) so cleanup is a single grep; the regression test is written before the fix and only at a seam that exercises the real bug pattern; and the run closes by asking what would have prevented the bug, handing off to `improve-codebase-architecture` when the answer is architectural.
|
|
||||||
|
|
||||||
Performance regressions take a branch of their own inside Phase 4 — baseline measurement and bisection, not logs.
|
|
||||||
|
|
||||||
## Conditional reading
|
|
||||||
|
|
||||||
Neither reference file is read on every run; `SKILL.md` names the condition for each.
|
|
||||||
|
|
||||||
- `references/feedback-loops.md` is read when Phase 1 has no signal yet, or when the loop you have is slow or intermittent.
|
|
||||||
- `references/regression-seams.md` is read when Phase 5 leaves you unsure whether the available seam is deep enough — or whether one exists at all.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/diagnose
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the bug or the regression. For filing and triaging a reported bug rather than diagnosing it, use `triage`; for test-first feature work, use `tdd`.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The six phases and their gates — what must be true before each one ends |
|
|
||||||
| `references/feedback-loops.md` | Loaded when Phase 1 has no loop or the loop is too weak: ten ways to construct one ordered by cost, how to sharpen an existing loop, handling intermittent bugs, and what to ask the user for when the bug resists reproduction |
|
|
||||||
| `references/regression-seams.md` | Loaded when Phase 5 is unsure about the seam: what makes a seam correct, the four shapes of a too-shallow seam, and what to do when no correct seam exists |
|
|
||||||
| `assets/hitl-loop.template.sh` | Copy-and-edit bash template for the last-resort human-in-the-loop feedback loop, cited by `references/feedback-loops.md`. Provides `step` and `capture` helpers and prints captured values as `KEY=VALUE` for the agent to parse |
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# grill-me
|
|
||||||
|
|
||||||
Interview the user relentlessly about a plan or design until the decision tree is fully resolved.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Turns the agent into an interviewer rather than an implementer. It walks the design tree branch by branch, resolving dependencies between decisions one at a time, and offers its own recommended answer alongside each question so the user has something concrete to push against. Two rules give it its shape: **one question at a time**, and **never ask what the codebase can answer** — if a question is settleable by reading the code, the agent goes and reads the code instead of spending the user's attention on it.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
This is the plain grilling loop, with no documentation side effects. The sibling `grill-with-docs` skill runs the same interview but additionally challenges answers against the project's `CONTEXT.md` glossary and existing ADRs, and writes decisions back into those files as they crystallise. Reach for that one when the project has a domain model worth defending; reach for this one when it does not, or when nothing should be written down yet.
|
|
||||||
|
|
||||||
`triage` composes the documented variant, not this one, when an issue needs fleshing out.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/grill-me
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the plan or design to be stress-tested. Expect questions one at a time, each with a recommended answer.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The whole skill — the interview instruction, the one-question-at-a-time rule, and the explore-instead-of-asking rule |
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# grill-with-docs
|
|
||||||
|
|
||||||
The grilling interview, run against the project's domain model — and writing decisions back into `CONTEXT.md` and ADRs as they land.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Runs the same relentless one-question-at-a-time interview as `grill-me`, with the project's own documentation as an active participant. During codebase exploration it also locates the domain documentation — a root `CONTEXT.md` and `docs/adr/`, or a `CONTEXT-MAP.md` pointing at per-context glossaries and ADR directories in a multi-context repo — and then uses it five ways:
|
|
||||||
|
|
||||||
- **Challenges terms against the glossary.** When the user's usage conflicts with what `CONTEXT.md` already defines, that is raised immediately rather than absorbed.
|
|
||||||
- **Sharpens fuzzy language** by proposing a precise canonical term ("you're saying 'account' — do you mean the Customer or the User?").
|
|
||||||
- **Stress-tests domain relationships with concrete scenarios**, inventing edge cases that force the user to be precise about where one concept ends and the next begins.
|
|
||||||
- **Cross-references claims against the code**, and surfaces contradictions between what the user says happens and what the code does.
|
|
||||||
- **Updates `CONTEXT.md` inline**, the moment a term is resolved, rather than batching changes to the end of the session where they get lost.
|
|
||||||
|
|
||||||
Files are created lazily — only when there is something real to write.
|
|
||||||
|
|
||||||
ADRs are offered *sparingly*, and only when all three tests pass: the decision is hard to reverse, it would surprise a future reader without the context, and it was a genuine trade-off with real alternatives. Missing any one of the three means no ADR.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`grill-me` is the same interview without the documentation side effects — use it when there is no domain model to defend or nothing should be written down yet. `triage` composes this skill (not `grill-me`) at step 4 when an issue needs fleshing out. `improve-codebase-architecture` runs its own grilling loop and borrows this skill's `CONTEXT.md` and ADR discipline for the decisions that come out of it.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/grill-with-docs
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the plan or design. Expect questions one at a time, each with a recommended answer, and expect `CONTEXT.md` to be edited during the session rather than after it.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The interview instruction plus the domain-awareness rules: file layout discovery, the five during-session behaviours, and the three-part ADR test |
|
|
||||||
| `references/context-format.md` | Cited when a term is resolved: the structure of a `CONTEXT.md` and how to write a Language entry |
|
|
||||||
| `references/adr-format.md` | Cited when an ADR is offered: `docs/adr/` naming, sequential numbering, and the ADR template |
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# improve-codebase-architecture
|
|
||||||
|
|
||||||
Surface architectural friction and propose deepening opportunities — refactors that turn shallow modules into deep ones.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Looks for places where a codebase is hard to understand, hard to test, or hard for an agent to navigate, and proposes refactors that concentrate behaviour behind smaller interfaces. It runs in three stages:
|
|
||||||
|
|
||||||
1. **Explore.** Reads the domain glossary and any ADRs in the area first, then walks the codebase with an `Explore` sub-agent — organically, noting friction rather than applying fixed heuristics. The **deletion test** is the filter: imagine deleting the module; if complexity vanishes it was a pass-through, if complexity reappears across N callers it was earning its keep.
|
|
||||||
2. **Present candidates.** A numbered list, each with files, problem, solution and benefits — benefits stated in terms of *locality* and *leverage* and of how tests would improve. No interfaces are proposed yet; the user picks one.
|
|
||||||
3. **Grilling loop.** Walks the design tree for the chosen candidate, with documentation side effects landing inline as decisions crystallise.
|
|
||||||
|
|
||||||
The skill is opinionated about vocabulary, and that is the point: **module, interface, implementation, depth, seam, adapter, leverage, locality**, used exactly, with no drift into "component", "service", "API" or "boundary". Domain nouns come from `CONTEXT.md`, architecture nouns from `references/language.md` — so a proposal reads as "the Order intake module", never "the FooBarHandler".
|
|
||||||
|
|
||||||
ADRs are treated as decisions not to be re-litigated. A candidate that contradicts one is surfaced only when the friction is real enough to warrant reopening it, and is marked as such.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`diagnose` hands off here when a bug's post-mortem concludes that no correct test seam exists, or that callers are tangled — the recommendation is made after the fix is in, not before. The grilling loop follows `grill-with-docs`'s discipline for `CONTEXT.md` entries and ADR offers, and `SKILL.md` names that skill's format documents directly.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/improve-codebase-architecture
|
|
||||||
```
|
|
||||||
|
|
||||||
Point at a codebase or an area of one. Expect a numbered candidate list and a "which of these would you like to explore?" before any interface design happens.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Condensed glossary, key principles, and the three-stage process |
|
|
||||||
| `references/language.md` | Cited throughout `SKILL.md`: full definitions of every term, the words each one replaces, and the full principle list |
|
|
||||||
| `references/interface-design.md` | Read at stage 3 when the user wants alternative interfaces explored: the parallel sub-agent "Design It Twice" pattern, framing the problem space, and the per-agent design constraints |
|
|
||||||
| `references/deepening.md` | Cited from `references/interface-design.md`: how to deepen a cluster of shallow modules safely, the four dependency categories (in-process, local-substitutable, remote-but-owned, true external), seam discipline, and the replace-don't-layer testing strategy |
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# prototype
|
|
||||||
|
|
||||||
Build a throwaway prototype that answers one design question — either a runnable terminal app or several UI variations.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Treats a prototype as **throwaway code that answers a question**, and lets the question decide the artifact. `SKILL.md` opens with a two-row dispatch table and the run resolves exactly one row before doing anything else:
|
|
||||||
|
|
||||||
- *"Does this logic / state model feel right?"* → a tiny interactive terminal app that pushes the state machine through the cases that are hard to reason about on paper.
|
|
||||||
- *"What should this look like?"* → several radically different UI variations on one route, switchable from a floating bottom bar via a URL search param.
|
|
||||||
|
|
||||||
The two branches produce fundamentally different artifacts, so picking wrong wastes the whole prototype. When the question is genuinely ambiguous and the user is unreachable, the skill defaults on the shape of the surrounding code (backend module → logic, page or component → UI) and states the assumption at the top of the prototype rather than silently choosing.
|
|
||||||
|
|
||||||
Six rules apply to both branches: throwaway and visibly named as such, one command to run, no persistence by default, no polish, surface the full state after every action or variant switch, and delete or absorb the prototype when it is done. The *answer* is the only durable output — the skill captures it in a commit message, ADR, issue or `NOTES.md` before the code is deleted.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/prototype
|
|
||||||
```
|
|
||||||
|
|
||||||
State the design question. For production code, use `tdd`; for talking a design through without building anything, use `grill-me`.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The branch dispatch table and the rules that apply to both branches |
|
|
||||||
| `references/logic.md` | The logic branch, read only when that row is selected: when it is the right shape, and how to build the interactive terminal app |
|
|
||||||
| `references/ui.md` | The UI branch, read only when that row is selected: when it is the right shape, and how to build and switch between the variations |
|
|
||||||
|
|
||||||
Each reference is self-contained — a run reads one of the two, never both.
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# research
|
|
||||||
|
|
||||||
Research a tool, library or API from canonical documentation into a directory of structured per-topic reference files.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Runs a six-step pipeline: scope against the working directory (what version is actually in use, what is already documented), resolve the topic through Context7, websearch for canonical docs covering whatever Context7 missed, read those sources, deepen one level into the links worth following, then write one markdown file per topic area plus a `sources.md` provenance record.
|
|
||||||
|
|
||||||
Four gotchas at the top of `SKILL.md` shape the whole run, and each exists because of a specific failure: the output path is never inferred (a guessed destination scatters a directory's worth of files through someone's source tree); nothing is written outside that path; no empty topic file is ever written (a stub `troubleshooting.md` reads downstream as researched and closed); and a Context7 "no results", redirect or header-only response does not count as coverage. If no topic area has content, the run writes nothing at all — `sources.md` included — and reports what it searched.
|
|
||||||
|
|
||||||
The frontmatter pins `model: sonnet` and a closed `allowed-tools` list. Notably it grants no subagent tool, so every `WebFetch` is serial and each fetched page lands in the run's own context — which is why steps 4 and 5 insist on reducing each page to notes before fetching the next, and cap deepening at roughly ten extra pages.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
Both reference files are read on condition, never on every run — `SKILL.md` inlines the minimum each step needs (the seven default topic areas at step 1, the four `sources.md` field names and the topic-file frontmatter keys at step 6) and sends the run to the reference only for what it does not carry. Those four field names are matched literally by the downstream provenance validator, so prose written in their place parses as nothing and the check passes having verified nothing — which is why they are inlined rather than deferred.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/research
|
|
||||||
```
|
|
||||||
|
|
||||||
Name the topic and the output path — the skill will stop and ask if the path is missing. Supplying starting URLs is treated as a deliberate source choice and skips Context7 resolution and discovery. For documentation derived from existing code or specs, use `write-docs`; for a bug or incident, use `diagnose`.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The four gotchas and the six research steps |
|
|
||||||
| `references/topics.md` | Read at Step 1 only when what belongs in a default topic is unclear or a custom topic is needed: the per-topic coverage table and the custom-topic naming rule |
|
|
||||||
| `references/file-format.md` | Read at Step 6 only when the inlined field names do not settle the case: slug derivation, the Context7 slug and URL convention, and what belongs in a topic body |
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# tdd
|
|
||||||
|
|
||||||
Test-driven development as a strict red-green-refactor loop, one behaviour at a time.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Two convictions drive this skill. The first is about what a test is for: tests verify behaviour through public interfaces, not implementation details. A good test reads like a specification ("user can checkout with valid cart") and survives refactors because it does not care about internal structure. The warning sign for a bad one is precise — the test breaks when you refactor but behaviour has not changed.
|
|
||||||
|
|
||||||
The second is an explicit anti-pattern: **do not write all the tests first, then all the implementation.** Horizontal slicing treats RED as "write every test" and GREEN as "write every implementation", and it produces tests of *imagined* behaviour — tests of the shape of things, insensitive to real change, committed to before the implementation was understood. The correct shape is vertical: one test → one implementation → repeat, each cycle informed by what the last one taught you.
|
|
||||||
|
|
||||||
The workflow is four stages: plan (confirm the interface and which behaviours matter, with the user — you cannot test everything), fire a tracer bullet (one test proving the path works end to end), loop incrementally one behaviour at a time, then refactor once everything is green. Refactoring while RED is forbidden.
|
|
||||||
|
|
||||||
Codebase exploration uses the project's domain glossary, so test names and interface vocabulary match the project's language, and ADRs in the area are respected.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/tdd
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the feature or bug. Expect the skill to ask what the public interface should look like and which behaviours matter most before any code is written. For diagnosing an existing bug rather than building test-first, use `diagnose`; for throwaway exploratory code, use `prototype`.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Philosophy, the horizontal-slicing anti-pattern, the four-stage workflow, and the per-cycle checklist |
|
|
||||||
| `references/tests.md` | Cited from Philosophy: worked good and bad test examples |
|
|
||||||
| `references/mocking.md` | Cited from Philosophy: mock at system boundaries only, and what not to mock |
|
|
||||||
| `references/deep-modules.md` | Cited from stage 1: what a deep module is (small interface, large implementation) and why it is the design to aim for |
|
|
||||||
| `references/interface-design.md` | Cited from stage 1: designing interfaces for testability, starting with accepting dependencies rather than creating them |
|
|
||||||
| `references/refactoring.md` | Cited from stage 4: the refactor-candidate checklist — duplication, long methods, shallow modules, feature envy, primitive obsession |
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# triage
|
|
||||||
|
|
||||||
Move issues on the project issue tracker through a small state machine of triage roles.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Gives issue triage an explicit state model and a fixed set of moves. Every issue carries exactly one **category** role (`bug`, `enhancement`) and one **state** role (`needs-triage`, `needs-info`, `ready-for-agent`, `ready-for-human`, `wontfix`); conflicting state roles are flagged to the maintainer before anything else happens. Unlabeled issues normally enter at `needs-triage`; `needs-info` returns there once the reporter replies. The maintainer can override at any point, and unusual transitions are questioned rather than executed silently.
|
|
||||||
|
|
||||||
A run does one of three things depending on what the maintainer asks for:
|
|
||||||
|
|
||||||
- **Show what needs attention** — three buckets, oldest first: unlabeled, `needs-triage`, and `needs-info` with reporter activity since the last triage notes.
|
|
||||||
- **Triage a specific issue** — gather context (including prior triage notes, so resolved questions are not re-asked, and `.out-of-scope/` records that resemble the issue), recommend a category and state with reasoning, attempt reproduction for bugs *before* any grilling, run a `grill-with-docs` session if the issue needs fleshing out, then apply the outcome.
|
|
||||||
- **Quick state override** — "move #42 to ready-for-agent" is trusted and applied directly, skipping grilling, after confirming the exact changes.
|
|
||||||
|
|
||||||
Two hard rules: every comment or issue the skill posts during triage must open with the AI-generated disclaimer, and the canonical role names above are *not* necessarily the label strings in the tracker — each is resolved against the tracker's live label set before it is applied, and a name with no counterpart there is reported to the maintainer as a gap rather than guessed at.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`grill-with-docs` is invoked at step 4 when an issue needs fleshing out; whatever that session establishes is carried into the triage notes so the work is not lost. The reverse direction also exists: `diagnose` names this skill as the place to send a *reported* bug that needs filing rather than debugging.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/triage
|
|
||||||
```
|
|
||||||
|
|
||||||
Then describe what you want in natural language — "show me anything that needs my attention", "let's look at #42", "move #42 to ready-for-agent", "what's ready for agents to pick up?".
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The roles and state machine, the three invocation modes, the needs-info template, and how to resume a prior session |
|
|
||||||
| `references/agent-brief.md` | Cited when an issue moves to `ready-for-agent` (and reused for `ready-for-human`): how to write a brief that stays durable for weeks while the codebase moves under it — describe interfaces and behavioural contracts, not line numbers |
|
|
||||||
| `references/out-of-scope.md` | Cited when an enhancement is closed `wontfix` and when checking for prior rejections: how the `.out-of-scope/` knowledge base is laid out and what it is for — institutional memory, and deduplication against re-litigated requests |
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# write-docs
|
|
||||||
|
|
||||||
Produce technical documentation derived from code and spec, one section at a time, with a confirmation gate on every section.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Casts the agent as a technical writer with one non-negotiable constraint: **every claim must be traceable to a source file line, a spec section, or an explicit user statement.** Nothing is invented, and behaviour that genuinely cannot be documented from the available sources is marked out-of-scope rather than explained away.
|
|
||||||
|
|
||||||
The process is eight steps — identify scope, read and extract, gap check, draft section by section, confirmation gate, delta summary, reader testing, finalise — and several of them are deliberately gated on the human:
|
|
||||||
|
|
||||||
- Files are read only after the user approves them by name. The skill may propose candidates; it waits.
|
|
||||||
- The **gap check** presents what the code does say and asks the user to fill only what it does not: caller intent, error-handling rationale, non-obvious side effects.
|
|
||||||
- No section is finalised until the full revised text has been shown. The skill never gates on output the user has not seen, and never reprints the whole document — all edits are surgical.
|
|
||||||
- **Reader testing** predicts 5–10 questions a target reader would ask, then spawns a sub-agent that receives only the finished doc and the questions — no source files. If the doc cannot answer them, neither can the sub-agent, and the run loops back to drafting.
|
|
||||||
|
|
||||||
Summary and overview sections are written last, once the detail sections are stable.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/write-docs
|
|
||||||
```
|
|
||||||
|
|
||||||
Name the files or modules to document, the target audience (developer / user / contributor / internal), and the documentation type (reference, guide, README section, inline comment, changelog entry). For a PRD, ADR or decision doc, use `grill-me` or `grill-with-docs` instead — those have dedicated handling.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The whole skill — role, use/do-not-use boundaries, required inputs, constraints, the eight-step process, output format, failure handling, and a nine-item self-check |
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# zoom-out
|
|
||||||
|
|
||||||
Ask the agent to go up a layer of abstraction and map the modules and callers around unfamiliar code.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
A single-purpose prompt for the moment you land in a part of the codebase you do not know. Instead of answering at the level of the file in front of it, the agent climbs one layer and produces a map of the relevant modules and their callers — and names them using the project's own domain glossary vocabulary, so the map lines up with the language the rest of the repo already uses.
|
|
||||||
|
|
||||||
## Hand-invoked only
|
|
||||||
|
|
||||||
`SKILL.md` sets `disable-model-invocation: true`, so the router never selects this skill on its own and no other skill can hand off to it. It runs when the human asks for it. That also means its description is written as one plain human-facing sentence — it carries no trigger phrasing or boundary clause, because nothing routes on it.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/zoom-out
|
|
||||||
```
|
|
||||||
|
|
||||||
Best used with the unfamiliar code already in context — the skill widens the view around what you are looking at rather than picking a starting point for you.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | The whole skill — a single instruction, no supporting files |
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# agentsmd-audit
|
|
||||||
|
|
||||||
Audit a target repo's AGENTS.md file(s) for embedded secrets, structural completeness, and drift.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Runs a single combined pass across every AGENTS.md file in a repo (root and any nested monorepo files): flags embedded secrets/credentials, checks structure against the agents.md common-sections checklist, and resolves referenced commands/paths against the actual repo to catch stale documentation. Outputs a compact findings report — findings only, grouped by dimension, each with Why and Fix. Never inspects provider-specific adapter files (CLAUDE.md, etc.) and never writes or fixes anything.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/agentsmd-audit
|
|
||||||
```
|
|
||||||
|
|
||||||
Provide the path to the repo root to audit when invoking.
|
|
||||||
|
|
||||||
Also invoke it proactively after `agentsmd-author` creates or updates an AGENTS.md, or after a
|
|
||||||
hand-edit made outside `agentsmd-author` — the audit is what confirms the result is safe to commit.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `scripts/validate-secrets.sh` | Scans AGENTS.md files for embedded secrets, API keys, tokens, connection strings |
|
|
||||||
| `scripts/validate-structure.sh` | Checks for empty/placeholder content, common-sections checklist, nested-vs-root duplication |
|
|
||||||
| `scripts/validate-drift.sh` | Resolves referenced npm/make commands and file paths against the repo |
|
|
||||||
| `references/sources.md` | Provenance record — sources that informed this skill and which files each contributed to |
|
|
||||||
| `scripts/README.md` | Directory documentation for `scripts/` |
|
|
||||||
| `tests/README.md` | (source-only) Bats test dependency and run instructions |
|
|
||||||
| `tests/validate-secrets.bats` | (source-only) Bats test suite for `scripts/validate-secrets.sh` |
|
|
||||||
| `tests/validate-structure.bats` | (source-only) Bats test suite for `scripts/validate-structure.sh` |
|
|
||||||
| `tests/validate-drift.bats` | (source-only) Bats test suite for `scripts/validate-drift.sh` |
|
|
||||||
|
|
||||||
Rows marked **(source-only)** exist in the authoring source (`.apm/skills/agentsmd-audit/`) but are
|
|
||||||
not present in an installed plugin: the repo's `scripts/sync-plugin-content.sh` strips
|
|
||||||
`<category>/<name>/tests` when it generates the flat mirror, because these are dev-time fixtures no
|
|
||||||
plugin host needs to discover (ADR-0017). Run them from a repo checkout, not from an install.
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# agentsmd-author
|
|
||||||
|
|
||||||
Create or update a target repo's AGENTS.md file(s) by exploring the repo for real conventions.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Explores a target repo (package manager scripts, Makefile/task runner, CI config, linter config, existing docs) and writes or updates `AGENTS.md` with only verified commands and conventions — never invented ones. Supports nested monorepo placement, following the agents.md standard's nearest-file-wins precedence. Closes every run by invoking `agentsmd-audit` inline, and hands off to `provider-adapter-author` when an existing provider-specific file (CLAUDE.md, etc.) now duplicates content AGENTS.md owns.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
The `agentsmd-audit` skill must be available (co-installed in the `core` plugin) — this skill invokes it as a mandatory closeout step.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/agentsmd-author
|
|
||||||
```
|
|
||||||
|
|
||||||
Provide the target repo root (defaults to the current directory) and, if relevant, which subdirectory should get a nested AGENTS.md.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/content-guide.md` | Section-by-section AGENTS.md content guidance, a worked example, and monorepo/nested-file precedence rules |
|
|
||||||
| `references/sources.md` | Provenance record — sources that informed this skill and which files each contributed to |
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# provider-adapter-author
|
|
||||||
|
|
||||||
Convert a target repo's provider-specific instruction file (CLAUDE.md, .cursor/rules, copilot-instructions.md, etc.) into a thin adapter over AGENTS.md.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Detects a provider-specific AI instruction file in a target repo, diffs it against the repo's `AGENTS.md`, and rewrites it down to a minimal reference — an `@AGENTS.md`-style import for providers that support one, or a text pointer for those that don't — plus only genuinely provider-specific additions. Self-validates its own output with a bundled deterministic script (no LLM judgment, no separate audit skill) before finishing.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
The target repo must already have an `AGENTS.md`. If it doesn't, run `agentsmd-author` first — this skill never creates or edits `AGENTS.md` itself.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/provider-adapter-author
|
|
||||||
```
|
|
||||||
|
|
||||||
Provide the path to the provider-specific file to convert (and the target repo root, if not inferable). Can be invoked directly, or composed into by `agentsmd-author` when it detects an existing provider file with content overlapping AGENTS.md.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/provider-matrix.md` | Loaded at Step 1 before searching, unless the target is already a known root `CLAUDE.md`: known files per provider, which ones resolve a cross-file import, the validator flag each needs, and the rule that a standalone run and a run composed into by `agentsmd-author` behave identically |
|
|
||||||
| `references/sources.md` | Provenance record — the in-repo ADR precedent this skill's design is modeled on |
|
|
||||||
| `scripts/validate-adapter.sh` | Self-check gate: reference to AGENTS.md present, no excessive duplication, adapter stays thin |
|
|
||||||
| `scripts/README.md` | Directory documentation for `scripts/` |
|
|
||||||
| `tests/README.md` | (source-only) Bats test dependency and run instructions |
|
|
||||||
| `tests/validate-adapter.bats` | (source-only) Bats test suite for `scripts/validate-adapter.sh` |
|
|
||||||
|
|
||||||
Rows marked **(source-only)** exist in the authoring source (`.apm/skills/provider-adapter-author/`)
|
|
||||||
but are not present in an installed plugin: the repo's `scripts/sync-plugin-content.sh` strips
|
|
||||||
`<category>/<name>/tests` when it generates the flat mirror, because these are dev-time fixtures no
|
|
||||||
plugin host needs to discover (ADR-0017). Run them from a repo checkout, not from an install.
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# agentsmd-audit
|
|
||||||
|
|
||||||
Audit a target repo's AGENTS.md file(s) for embedded secrets, structural completeness, and drift.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Runs a single combined pass across every AGENTS.md file in a repo (root and any nested monorepo files): flags embedded secrets/credentials, checks structure against the agents.md common-sections checklist, and resolves referenced commands/paths against the actual repo to catch stale documentation. Outputs a compact findings report — findings only, grouped by dimension, each with Why and Fix. Never inspects provider-specific adapter files (CLAUDE.md, etc.) and never writes or fixes anything.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/agentsmd-audit
|
|
||||||
```
|
|
||||||
|
|
||||||
Provide the path to the repo root to audit when invoking.
|
|
||||||
|
|
||||||
Also invoke it proactively after `agentsmd-author` creates or updates an AGENTS.md, or after a
|
|
||||||
hand-edit made outside `agentsmd-author` — the audit is what confirms the result is safe to commit.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `scripts/validate-secrets.sh` | Scans AGENTS.md files for embedded secrets, API keys, tokens, connection strings |
|
|
||||||
| `scripts/validate-structure.sh` | Checks for empty/placeholder content, common-sections checklist, nested-vs-root duplication |
|
|
||||||
| `scripts/validate-drift.sh` | Resolves referenced npm/make commands and file paths against the repo |
|
|
||||||
| `references/sources.md` | Provenance record — sources that informed this skill and which files each contributed to |
|
|
||||||
| `scripts/README.md` | Directory documentation for `scripts/` |
|
|
||||||
| `tests/README.md` | (source-only) Bats test dependency and run instructions |
|
|
||||||
| `tests/validate-secrets.bats` | (source-only) Bats test suite for `scripts/validate-secrets.sh` |
|
|
||||||
| `tests/validate-structure.bats` | (source-only) Bats test suite for `scripts/validate-structure.sh` |
|
|
||||||
| `tests/validate-drift.bats` | (source-only) Bats test suite for `scripts/validate-drift.sh` |
|
|
||||||
|
|
||||||
Rows marked **(source-only)** exist in the authoring source (`.apm/skills/agentsmd-audit/`) but are
|
|
||||||
not present in an installed plugin: the repo's `scripts/sync-plugin-content.sh` strips
|
|
||||||
`<category>/<name>/tests` when it generates the flat mirror, because these are dev-time fixtures no
|
|
||||||
plugin host needs to discover (ADR-0017). Run them from a repo checkout, not from an install.
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# agentsmd-author
|
|
||||||
|
|
||||||
Create or update a target repo's AGENTS.md file(s) by exploring the repo for real conventions.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Explores a target repo (package manager scripts, Makefile/task runner, CI config, linter config, existing docs) and writes or updates `AGENTS.md` with only verified commands and conventions — never invented ones. Supports nested monorepo placement, following the agents.md standard's nearest-file-wins precedence. Closes every run by invoking `agentsmd-audit` inline, and hands off to `provider-adapter-author` when an existing provider-specific file (CLAUDE.md, etc.) now duplicates content AGENTS.md owns.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
The `agentsmd-audit` skill must be available (co-installed in the `core` plugin) — this skill invokes it as a mandatory closeout step.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/agentsmd-author
|
|
||||||
```
|
|
||||||
|
|
||||||
Provide the target repo root (defaults to the current directory) and, if relevant, which subdirectory should get a nested AGENTS.md.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/content-guide.md` | Section-by-section AGENTS.md content guidance, a worked example, and monorepo/nested-file precedence rules |
|
|
||||||
| `references/sources.md` | Provenance record — sources that informed this skill and which files each contributed to |
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# provider-adapter-author
|
|
||||||
|
|
||||||
Convert a target repo's provider-specific instruction file (CLAUDE.md, .cursor/rules, copilot-instructions.md, etc.) into a thin adapter over AGENTS.md.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Detects a provider-specific AI instruction file in a target repo, diffs it against the repo's `AGENTS.md`, and rewrites it down to a minimal reference — an `@AGENTS.md`-style import for providers that support one, or a text pointer for those that don't — plus only genuinely provider-specific additions. Self-validates its own output with a bundled deterministic script (no LLM judgment, no separate audit skill) before finishing.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
The target repo must already have an `AGENTS.md`. If it doesn't, run `agentsmd-author` first — this skill never creates or edits `AGENTS.md` itself.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/provider-adapter-author
|
|
||||||
```
|
|
||||||
|
|
||||||
Provide the path to the provider-specific file to convert (and the target repo root, if not inferable). Can be invoked directly, or composed into by `agentsmd-author` when it detects an existing provider file with content overlapping AGENTS.md.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/provider-matrix.md` | Loaded at Step 1 before searching, unless the target is already a known root `CLAUDE.md`: known files per provider, which ones resolve a cross-file import, the validator flag each needs, and the rule that a standalone run and a run composed into by `agentsmd-author` behave identically |
|
|
||||||
| `references/sources.md` | Provenance record — the in-repo ADR precedent this skill's design is modeled on |
|
|
||||||
| `scripts/validate-adapter.sh` | Self-check gate: reference to AGENTS.md present, no excessive duplication, adapter stays thin |
|
|
||||||
| `scripts/README.md` | Directory documentation for `scripts/` |
|
|
||||||
| `tests/README.md` | (source-only) Bats test dependency and run instructions |
|
|
||||||
| `tests/validate-adapter.bats` | (source-only) Bats test suite for `scripts/validate-adapter.sh` |
|
|
||||||
|
|
||||||
Rows marked **(source-only)** exist in the authoring source (`.apm/skills/provider-adapter-author/`)
|
|
||||||
but are not present in an installed plugin: the repo's `scripts/sync-plugin-content.sh` strips
|
|
||||||
`<category>/<name>/tests` when it generates the flat mirror, because these are dev-time fixtures no
|
|
||||||
plugin host needs to discover (ADR-0017). Run them from a repo checkout, not from an install.
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# git-branches
|
|
||||||
|
|
||||||
Manage the full lifecycle of git branches — create, switch, delete, rename, track, merge, and compare feature/hotfix/release branches under GitHub Flow or Gitflow.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles branch operations within the git workflow suite. It creates branches following GitHub Flow or Gitflow conventions (configurable), switches and tracks branches, handles safe deletion with unmerged-work checks, and retrieves branch intent metadata for use by other skills (e.g., commit message context). It returns structured results suitable for agent composition.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-branches
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your branch task: create a feature/hotfix/release branch, switch, delete, rename, track, merge, or compare two branches. The skill will determine the branching pattern (GitHub Flow or Gitflow) from config or repo state and handle safety checks for destructive operations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/branch-patterns.md` | Loaded when a branch's base, name prefix, or merge rule depends on GitHub Flow vs. Gitflow |
|
|
||||||
| `references/branch-operations.md` | Loaded when running a create/switch/delete/rename/track/list/stash action, or resolving `get-intent` |
|
|
||||||
| `references/merging.md` | Loaded when merging one branch into another or resolving merge conflicts |
|
|
||||||
| `references/comparing-branches.md` | Loaded when comparing two branches or finding where they diverged |
|
|
||||||
| `references/orchestrator-contract.md` | Loaded when `git-orchestrate` or another calling agent supplies a structured request rather than prose |
|
|
||||||
| `references/sources.md` | Research sources backing the branching/gitflow guidance |
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`git-orchestrate` calls this skill for the branch step of a multi-step workflow and parses its
|
|
||||||
structured result. Revert is `git-history`'s; commit authoring, rebase, reset and cherry-pick are
|
|
||||||
`git-commits`'; deleting a remote branch is `git-remotes`'; branch operations against a
|
|
||||||
Gitea-hosted remote are `gitea-branches`'.
|
|
||||||
@@ -9,7 +9,7 @@ description: >
|
|||||||
Not a Gitea remote's branches -> `gitea-branches`.
|
Not a Gitea remote's branches -> `gitea-branches`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- context7-git-htmldocs
|
- context7-git-htmldocs
|
||||||
@@ -21,7 +21,7 @@ metadata:
|
|||||||
## Gotchas
|
## Gotchas
|
||||||
|
|
||||||
- **Uncommitted changes abort a switch.** `git switch` refuses rather than clobbering conflicting local edits. Offer to stash and retry — forcing the checkout past it is how work disappears.
|
- **Uncommitted changes abort a switch.** `git switch` refuses rather than clobbering conflicting local edits. Offer to stash and retry — forcing the checkout past it is how work disappears.
|
||||||
- **A branch and a tag can carry the same name.** Detect it before acting — `git branch --list <name>` (bare, not `rtk`: rtk prints a phantom `* ` line even on no match, which reports every name as ambiguous — ADR-0023) and `rtk git tag --list <name>`; output from both means the name is ambiguous. Prefer `git switch` over `git checkout`, and where a command accepts either ref, disambiguate with `refs/heads/<name>` or `refs/tags/<name>`.
|
- **A branch and a tag can carry the same name.** Detect it before acting — `git branch --list <name>` (bare, not `rtk`: rtk prints a phantom `* ` line even on no match, which reports every name as ambiguous) and `rtk git tag --list <name>`; output from both means the name is ambiguous. Prefer `git switch` over `git checkout`, and where a command accepts either ref, disambiguate with `refs/heads/<name>` or `refs/tags/<name>`.
|
||||||
- **`main` and `master` are a refusal, not a gate.** Force-pushing, force-deleting, or renaming them is rejected even when the caller passes `confirm: true` — no flag makes the remote's history recoverable. Offer a new branch instead.
|
- **`main` and `master` are a refusal, not a gate.** Force-pushing, force-deleting, or renaming them is rejected even when the caller passes `confirm: true` — no flag makes the remote's history recoverable. Offer a new branch instead.
|
||||||
|
|
||||||
## Step 1 — Determine the branching pattern
|
## Step 1 — Determine the branching pattern
|
||||||
|
|||||||
@@ -45,10 +45,10 @@ past it: it shelves the working tree and index so the branch pointer can move.
|
|||||||
reports `No local changes to save` and stashes nothing. Bare `git stash` is `push` with no message.
|
reports `No local changes to save` and stashes nothing. Bare `git stash` is `push` with no message.
|
||||||
- **restore** — `git stash pop` applies the newest entry and deletes it. Bare, not `rtk`: on a
|
- **restore** — `git stash pop` applies the newest entry and deletes it. Bare, not `rtk`: on a
|
||||||
conflict rtk prints only `FAILED: git stash pop` and swallows the conflict report the paragraph
|
conflict rtk prints only `FAILED: git stash pop` and swallows the conflict report the paragraph
|
||||||
below tells you to read (ADR-0023). `rtk git stash apply stash@{n}`
|
below tells you to read. `rtk git stash apply stash@{n}`
|
||||||
applies without deleting, for replaying one shelf onto more than one branch.
|
applies without deleting, for replaying one shelf onto more than one branch.
|
||||||
- **list** — `git stash list` — bare, not `rtk`: rtk prints `No stashes` where git prints nothing,
|
- **list** — `git stash list` — bare, not `rtk`: rtk prints `No stashes` where git prints nothing,
|
||||||
so an empty-output test misfires (ADR-0023). `rtk git stash show -p stash@{n}` prints that entry's diff.
|
so an empty-output test misfires. `rtk git stash show -p stash@{n}` prints that entry's diff.
|
||||||
- **drop** — `rtk git stash drop stash@{n}` deletes one entry. `rtk git stash clear` deletes all of them
|
- **drop** — `rtk git stash drop stash@{n}` deletes one entry. `rtk git stash clear` deletes all of them
|
||||||
and nothing recovers them — confirm before running it.
|
and nothing recovers them — confirm before running it.
|
||||||
- **branch from a stash** — `rtk git stash branch <branch> stash@{n}` creates a branch at the commit the
|
- **branch from a stash** — `rtk git stash branch <branch> stash@{n}` creates a branch at the commit the
|
||||||
|
|||||||
@@ -27,5 +27,5 @@ list the conflicted files, edit each to resolve its markers, then `rtk git add <
|
|||||||
|
|
||||||
- `rtk git merge --abort` restores the pre-merge state.
|
- `rtk git merge --abort` restores the pre-merge state.
|
||||||
- `git mergetool` opens the configured merge tool — bare, not `rtk`: it hands control to an
|
- `git mergetool` opens the configured merge tool — bare, not `rtk`: it hands control to an
|
||||||
interactive child process, and a token filter has nothing to offer there (ADR-0023).
|
interactive child process, and a token filter has nothing to offer there.
|
||||||
- `rtk git diff --diff-filter=U` shows only the still-conflicted files.
|
- `rtk git diff --diff-filter=U` shows only the still-conflicted files.
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
# git-commits
|
|
||||||
|
|
||||||
Create, amend, squash, and cherry-pick commits with Conventional Commits formatting and validation.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles commit operations within the git workflow suite. It generates well-formatted commit messages following the Conventional Commits spec, validates against commitlint config-conventional constraints, and communicates SemVer impact. It enforces confirmation gates for history-altering operations (amend, rebase, squash) and returns structured JSON output for agent consumption.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-commits
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your commit task: create a new commit, amend, squash, or cherry-pick. The skill will guide message formatting and handle confirmation for destructive operations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Loaded when |
|
|
||||||
|------|-------------|
|
|
||||||
| `SKILL.md` | Always — gotchas, the flow dispatch table, the gates common to every flow, and the output shape |
|
|
||||||
| `references/create-commit.md` | Composing a new commit from staged changes |
|
|
||||||
| `references/rewrite-history.md` | Amending, squashing, or folding a `fixup!`/`squash!` commit into an earlier one |
|
|
||||||
| `references/cherry-pick.md` | Replaying an existing commit onto the current branch |
|
|
||||||
| `references/conventional-commits-spec.md` | A type, footer, or breaking-change edge case is not obvious — full spec, 11-type set, commitlint constraint table |
|
|
||||||
| `references/commit-template.md` | Writing a body for a non-trivial commit — Why / Implementation Notes / Impact structure and the full trailer list |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
Part of the git plugin's domain suite. This skill owns commit authoring and history-rewriting operations only; `git-history` inspects history, `git-branches` owns branch lifecycle, and `git-workflow` is the conversational entry point that routes between them.
|
|
||||||
@@ -8,7 +8,7 @@ description: >
|
|||||||
Not branch lifecycle -> `git-branches`.
|
Not branch lifecycle -> `git-branches`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "0.1.4"
|
version: "0.1.5"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- conventional-commits-spec
|
- conventional-commits-spec
|
||||||
@@ -21,7 +21,7 @@ allowed-tools: Bash
|
|||||||
|
|
||||||
## Gotchas
|
## Gotchas
|
||||||
|
|
||||||
- **Run git as `rtk git <subcommand>`, never bare `git`** — org convention, in `&&` chains too. Exceptions: ADR-0023 clause 3.
|
- **Run git as `rtk git <subcommand>`, never bare `git`** — org convention, in `&&` chains too, except where a skill's Gotchas name a specific bare-git case (interactive rebase here).
|
||||||
- **Refuse to force-push `main`/`master`** — a rewrite leaves the branch diverged and the reflex is to force it back; safe only where nobody else has based work on it.
|
- **Refuse to force-push `main`/`master`** — a rewrite leaves the branch diverged and the reflex is to force it back; safe only where nobody else has based work on it.
|
||||||
- **`reset --hard` is a confirmation gate, not a default.** It overwrites the working tree, and uncommitted edits it discards were never in git, so no reflog recovers them. Name what will be lost and offer a stash first.
|
- **`reset --hard` is a confirmation gate, not a default.** It overwrites the working tree, and uncommitted edits it discards were never in git, so no reflog recovers them. Name what will be lost and offer a stash first.
|
||||||
- **Never add `--no-verify`** — using it when a hook fails bypasses the QA gate the pipeline depends on. Only on the user's explicit demand, with a warning.
|
- **Never add `--no-verify`** — using it when a hook fails bypasses the QA gate the pipeline depends on. Only on the user's explicit demand, with a warning.
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Prefer this whenever a commit is written to be folded, because git does the mark
|
|||||||
|
|
||||||
1. `rtk git commit --fixup=<commit>` keeps the target's message; `rtk git commit --squash=<commit>` lets you edit the combined message later. Both prefix the message with `fixup!`/`squash!` and name the target commit.
|
1. `rtk git commit --fixup=<commit>` keeps the target's message; `rtk git commit --squash=<commit>` lets you edit the combined message later. Both prefix the message with `fixup!`/`squash!` and name the target commit.
|
||||||
2. Get explicit approval — the rebase still rewrites history.
|
2. Get explicit approval — the rebase still rewrites history.
|
||||||
3. Run `git rebase -i --autosquash HEAD~N` — bare, not `rtk`: `-i` opens an interactive sequence editor (ADR-0023). Git pre-fills the todo list with the tagged commits already reordered against their targets; save it unchanged to apply.
|
3. Run `git rebase -i --autosquash HEAD~N` — bare, not `rtk`: `-i` opens an interactive sequence editor. Git pre-fills the todo list with the tagged commits already reordered against their targets; save it unchanged to apply.
|
||||||
|
|
||||||
**`-i` is not optional here.** On Git 2.39.5, `git rebase --autosquash HEAD~N` without `-i` prints `Successfully rebased and updated refs/heads/<branch>.` and exits 0 while leaving the `fixup!` commit in place at its original SHA — `--autosquash` is honoured only by the interactive machinery, and the false success is the trap: the fold is reported as done, and the surviving `fixup!` subject then fails the Conventional Commits `commit-msg` hook. Later Git versions taught the non-interactive rebase to honour the flag, but `-i --autosquash` is correct on every version, so always write that.
|
**`-i` is not optional here.** On Git 2.39.5, `git rebase --autosquash HEAD~N` without `-i` prints `Successfully rebased and updated refs/heads/<branch>.` and exits 0 while leaving the `fixup!` commit in place at its original SHA — `--autosquash` is honoured only by the interactive machinery, and the false success is the trap: the fold is reported as done, and the surviving `fixup!` subject then fails the Conventional Commits `commit-msg` hook. Later Git versions taught the non-interactive rebase to honour the flag, but `-i --autosquash` is correct on every version, so always write that.
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
# git-history
|
|
||||||
|
|
||||||
Inspect git history — log queries, bisect, and locating problematic commits.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles history inspection within the git workflow suite. It queries logs with pickaxe/line-range/custom formats, runs bisect to find bug-introducing commits, and locates commits for downstream cherry-picking or reverting. It returns structured results for agent composition. Rebase, squash, fixup, and other history-rewriting operations are owned by git-commits, not this skill.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`git-branches` delegates revert here (see `git-branches`'s `references/merging.md`), which is why this skill carries that operation rather than treating it as out of scope; it is general git knowledge, not drawn from the `history-inspection.md` research corpus. Cherry-pick is **not** this skill's: `git-commits` owns it, and this skill's job ends at locating the SHA to hand over. Server-side commit history on a Gitea-hosted repository belongs to `gitea-branches`; this skill reads the local working copy.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-history
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your history task: search logs, bisect for a regression, or locate a specific commit. The skill will query history and return structured results.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/bisect.md` | Loaded when the entry procedure is bisect: manual and automated flows, exit codes, skip, replay, narrowing, custom terms |
|
|
||||||
| `references/git-log-format.md` | Loaded when a log or diff flag needs looking up: format placeholders, presets, diff-filter letters, `-L` syntax, ancestry filters, pickaxe binary-file behaviour, diff output-control flags |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
| `references/README.md` | Index of the references directory |
|
|
||||||
@@ -8,7 +8,7 @@ description: >
|
|||||||
`git-commits`. Not a Gitea server's history -> `gitea-branches`.
|
`git-commits`. Not a Gitea server's history -> `gitea-branches`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- git-scm-bisect-docs
|
- git-scm-bisect-docs
|
||||||
@@ -38,7 +38,7 @@ allowed-tools: Bash
|
|||||||
Default to `rtk git log --oneline`, then narrow by whatever is known:
|
Default to `rtk git log --oneline`, then narrow by whatever is known:
|
||||||
|
|
||||||
- **Content**: `rtk git log -S"string"`, or `-G"regex"` to match any diff line. `--pickaxe-regex` makes the `-S` argument a POSIX ERE; `--pickaxe-all` shows every file in a matching changeset.
|
- **Content**: `rtk git log -S"string"`, or `-G"regex"` to match any diff line. `--pickaxe-regex` makes the `-S` argument a POSIX ERE; `--pickaxe-all` shows every file in a matching changeset.
|
||||||
- **A line or function**: `git log -L <start>,<end>:<file>` or `git log -L :<function>:<file>` — bare, not `rtk`: rtk truncates each diff line at ~72 characters (ADR-0023). Confirm the range resolves before reporting on it — an off-by-one silently omits the target.
|
- **A line or function**: `git log -L <start>,<end>:<file>` or `git log -L :<function>:<file>` — bare, not `rtk`: rtk truncates each diff line at ~72 characters. Confirm the range resolves before reporting on it — an off-by-one silently omits the target.
|
||||||
- **A file across renames**: `rtk git log --follow -- <file>`. Without `--follow` the history stops at the rename boundary.
|
- **A file across renames**: `rtk git log --follow -- <file>`. Without `--follow` the history stops at the rename boundary.
|
||||||
- **Mainline only**: `--first-parent` follows the integration branch and skips commits merged in from side branches.
|
- **Mainline only**: `--first-parent` follows the integration branch and skips commits merged in from side branches.
|
||||||
- **Structured output**: `rtk git log --format="%h | %s | %an (%ar)"`.
|
- **Structured output**: `rtk git log --format="%h | %s | %an (%ar)"`.
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- git-scm-bisect-docs
|
|
||||||
- git-scm-log-docs
|
|
||||||
- git-scm-diff-docs
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
This directory contains provenance metadata and research sources for the `git-history` skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
- `sources.md` — Extracted research sources and their contributing documents
|
|
||||||
- `bisect.md` — The full `git bisect` procedure: manual and automated flows, exit-code semantics, skip and replay, narrowing options, and custom good/bad terms
|
|
||||||
- `git-log-format.md` — Full `git log` format placeholder catalogue, named format presets, `--diff-filter` letters, `-L` line-range syntax, ancestry filters, pickaxe binary-file behaviour, and `git diff` output-control flags
|
|
||||||
@@ -166,10 +166,10 @@ line at roughly 72 characters with an ellipsis, on the one query whose whole poi
|
|||||||
is showing line content.
|
is showing line content.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git log -L 10,20:file.txt # bare per ADR-0023
|
git log -L 10,20:file.txt # bare (ADR-0023)
|
||||||
git log -L /start_pattern/,/end_pattern/:file.txt # bare per ADR-0023
|
git log -L /start_pattern/,/end_pattern/:file.txt # bare (ADR-0023)
|
||||||
git log -L :myfunction:src/app.c # bare per ADR-0023
|
git log -L :myfunction:src/app.c # bare (ADR-0023)
|
||||||
git log -L /init/,+15:config.py # bare per ADR-0023; 15 lines after first /init/ match
|
git log -L /init/,+15:config.py # bare (ADR-0023); 15 lines after first /init/ match
|
||||||
```
|
```
|
||||||
|
|
||||||
Range formats:
|
Range formats:
|
||||||
@@ -213,8 +213,8 @@ Bare `git`, not `rtk git`: rtk appends a blank line and a `Changes:` trailer, so
|
|||||||
the output is no longer one record per line.
|
the output is no longer one record per line.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git diff --name-only # bare per ADR-0023; only filenames, one per line
|
git diff --name-only # bare (ADR-0023); only filenames, one per line
|
||||||
git diff --name-status # bare per ADR-0023; status letter + filename per line
|
git diff --name-status # bare (ADR-0023); status letter + filename per line
|
||||||
```
|
```
|
||||||
|
|
||||||
`--name-status` uses the same status letters as `--diff-filter`.
|
`--name-status` uses the same status letters as `--diff-filter`.
|
||||||
@@ -225,10 +225,10 @@ Bare `git`, not `rtk git`: rtk replaces the word-diff with its own diffstat
|
|||||||
renderer and emits none of the `[-removed-] {+added+}` markers.
|
renderer and emits none of the `[-removed-] {+added+}` markers.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git diff --word-diff # bare per ADR-0023; inline word-level diff, [-removed-] {+added+} markers
|
git diff --word-diff # bare (ADR-0023); inline word-level diff, [-removed-] {+added+} markers
|
||||||
git diff --word-diff=color # bare per ADR-0023; color only, no markers
|
git diff --word-diff=color # bare (ADR-0023); color only, no markers
|
||||||
git diff --word-diff=porcelain # bare per ADR-0023; machine-readable: +/- prefixed lines, ~ for newlines
|
git diff --word-diff=porcelain # bare (ADR-0023); machine-readable: +/- prefixed lines, ~ for newlines
|
||||||
git diff --word-diff-regex=<re> # bare per ADR-0023; define what counts as a "word"
|
git diff --word-diff-regex=<re> # bare (ADR-0023); define what counts as a "word"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Whitespace Flags
|
### Whitespace Flags
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
# git-remotes
|
|
||||||
|
|
||||||
Manage git remote repositories — add/remove/configure remotes, push/pull with safety checks, fetch with pruning, and multi-remote workflows.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles remote operations within the git workflow suite. It manages remote configuration (add, remove, rename), fetch operations with pruning, push operations with force-push safety (`--force-with-lease --force-if-includes`), and pull strategies (fast-forward, rebase, merge). It returns structured results suitable for agent composition.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-remotes
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your remote operation: add a remote, push, pull, fetch, or configure tracking. The skill will handle the operation with appropriate safety checks and return results.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — force-push gate, dispatch table, return format |
|
|
||||||
| `references/README.md` | Describes the references directory contents |
|
|
||||||
| `references/remote-config.md` | Read when adding, removing, renaming, inspecting or re-pointing a remote, or configuring tracking, mirroring, or `set-url` |
|
|
||||||
| `references/fetch.md` | Read when fetching or pruning remote-tracking refs, or doing a shallow or partial fetch |
|
|
||||||
| `references/push.md` | Read when pushing branches or tags, writing refspecs, or force-pushing |
|
|
||||||
| `references/pull.md` | Read when integrating remote changes into the current branch, including the divergence rule |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
Callers that need submodule initialization after a `--recurse-submodules` pull hand off to
|
|
||||||
`git-submodules`; local-only work (commits, branches, history) belongs to `git-commits`,
|
|
||||||
`git-branches`, and `git-history`. The `git-workflow` skill routes humans here for any
|
|
||||||
remote-touching request.
|
|
||||||
@@ -10,7 +10,7 @@ description: >
|
|||||||
Not submodule pointers -> `git-submodules`.
|
Not submodule pointers -> `git-submodules`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- git-scm-remote-docs
|
- git-scm-remote-docs
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- git-scm-remote-docs
|
|
||||||
- git-scm-fetch-docs
|
|
||||||
- git-scm-push-docs
|
|
||||||
- git-scm-pull-docs
|
|
||||||
- context7-git-htmldocs
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
This directory contains provenance metadata and research sources for the `git-remotes` skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
- `sources.md` — Extracted research sources and their contributing documents
|
|
||||||
- `remote-config.md` — Remote add/remove/rename/inspect, tracking and mirror options, housekeeping, and the full `set-url` form
|
|
||||||
- `fetch.md` — Fetch and prune options, shallow and partial fetch, the default fetch refspec
|
|
||||||
- `push.md` — Push options, refspec syntax, force-push safety in full, server-side deny policies
|
|
||||||
- `pull.md` — Pull strategies, submodule caveat, the divergence rule, and pull config precedence
|
|
||||||
@@ -50,7 +50,7 @@ Two mitigations:
|
|||||||
# poisoned by an unrelated fetch.
|
# poisoned by an unrelated fetch.
|
||||||
# The inner `git config` is bare: its stdout becomes a remote URL, so any
|
# The inner `git config` is bare: its stdout becomes a remote URL, so any
|
||||||
# output rewriting would poison the remote silently.
|
# output rewriting would poison the remote silently.
|
||||||
rtk git remote add origin-push $(git config remote.origin.url) # inner bare per ADR-0023
|
rtk git remote add origin-push $(git config remote.origin.url) # inner bare (ADR-0023)
|
||||||
rtk git push --force-with-lease origin-push
|
rtk git push --force-with-lease origin-push
|
||||||
|
|
||||||
# Option 2 — explicit SHA via a local tag, unaffected by tracking-branch state
|
# Option 2 — explicit SHA via a local tag, unaffected by tracking-branch state
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
# git-submodules
|
|
||||||
|
|
||||||
Add, initialize, update, pin, inspect, and remove git submodules in multi-repository projects.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles submodule operations within the git workflow suite: cloning a superproject with
|
|
||||||
its nested repositories, adding a dependency as a submodule, initializing and updating with
|
|
||||||
pinning or branch tracking, parallel and recursive traversal, rebinding URLs and tracked branches,
|
|
||||||
and the full removal sequence including the `.git/modules/` cleanup git leaves behind. It returns
|
|
||||||
structured results suitable for agent composition.
|
|
||||||
|
|
||||||
It sits alongside the other git skills rather than duplicating them: `git-worktrees` covers
|
|
||||||
multiple checkouts of a single repository, and `git-remotes` covers the superproject's own remotes.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-submodules
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the submodule task. The skill applies the shared working rules, dispatches to the
|
|
||||||
reference for that task, and returns structured results (operation, status, per-submodule details,
|
|
||||||
conflicts, and a recovery `next_step` when applicable).
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — gotchas, shared working rules, and the task dispatch table |
|
|
||||||
| `references/README.md` | Describes contents of references/ |
|
|
||||||
| `references/setup-and-update.md` | Loaded when cloning a superproject, adding a submodule, initializing, updating, or re-pinning one, or running a command across all of them — includes the full `add` and `update` flag tables, the pinning workflows, and the `foreach` shell-variable table |
|
|
||||||
| `references/urls-and-config.md` | Loaded when changing where a submodule points or how it is configured — `.gitmodules` vs `.git/config` anatomy, both key tables, `sync`/`set-url`/`set-branch`, local mirror overrides, relative URLs, the custom-`update` security gate, and `absorbgitdirs` |
|
|
||||||
| `references/removal.md` | Loaded when removing or deinitializing a submodule — why `deinit` is not removal, and the four-step removal sequence |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- git-scm-submodule-docs
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
One file per task branch in SKILL.md's dispatch table. Load only the one that matches the request.
|
|
||||||
|
|
||||||
## setup-and-update.md
|
|
||||||
|
|
||||||
Cloning a superproject that has submodules, adding a dependency as a submodule, initializing
|
|
||||||
without cloning, updating or re-pinning, and running one command across every submodule. Carries
|
|
||||||
the `add` and `update` flag tables, the keep-pinned and move-the-pin-forward workflows, and the
|
|
||||||
`foreach` shell-variable table (`$name`, `$sm_path`, `$displaypath`, `$sha1`, `$toplevel`).
|
|
||||||
|
|
||||||
## urls-and-config.md
|
|
||||||
|
|
||||||
Where a submodule points and how it is configured: the `.gitmodules` vs `.git/config` split, both
|
|
||||||
key tables, `sync` / `set-url` / `set-branch`, local mirror overrides, relative URL resolution, the
|
|
||||||
security gate on custom `update` commands, and `absorbgitdirs`.
|
|
||||||
|
|
||||||
## removal.md
|
|
||||||
|
|
||||||
Removing a submodule, and why `deinit` alone does not remove one. Carries the full four-step
|
|
||||||
removal sequence including the manual `.git/modules/<name>/` cleanup.
|
|
||||||
|
|
||||||
## sources.md
|
|
||||||
|
|
||||||
Research sources that informed this skill — provenance chain for git-scm-submodule-docs reference
|
|
||||||
material.
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# git-workflow
|
|
||||||
|
|
||||||
Human-friendly interface for interactive git workflows with conversational prompts, progress guidance, and safety confirmations.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill wraps the `git-orchestrate` agent to provide an interactive, educational interface for humans performing git workflows. It is the router for the six local-git domain skills — `git-commits`, `git-branches`, `git-history`, `git-remotes`, `git-submodules` and `git-worktrees` — and `SKILL.md` carries a table mapping each of them to the requests it owns, so an ambiguous request resolves to exactly one domain before anything runs. The skill parses user intent, gathers session context, invokes the orchestrator, and presents results in plain language with inline help, progress updates, and explanations of what's happening. It enforces confirmation gates for destructive operations (force-push, branch deletion, rebasing with history loss, force-checkout) and provides best-practices guidance throughout. The org's non-negotiable git rules live in `references/hard-rules.md` and are loaded only when a request could conflict with one.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-workflow
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your git workflow: commit, create a branch, rebase, inspect history, manage submodules, switch worktrees, or manage remotes. The skill will prompt for any missing details and guide you through the workflow.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — the six-domain routing table, the workflow steps, and the interaction style |
|
|
||||||
| `README.md` | This file |
|
|
||||||
| `references/hard-rules.md` | The org's non-negotiable git rules; read when a request creates, amends, or rewrites a commit, pushes, or touches hooks, config, or credentials |
|
|
||||||
| `references/README.md` | Describes the references directory contents |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- nvie-gitflow-post
|
|
||||||
- atlassian-gitflow-tutorial
|
|
||||||
- gitflow-cheatsheet
|
|
||||||
- context7-git-htmldocs
|
|
||||||
- org-git-conventions
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
This directory contains the org git rules and the provenance metadata for the `git-workflow`
|
|
||||||
skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
- `hard-rules.md` — The org's non-negotiable git rules, loaded when a request creates, amends, or
|
|
||||||
rewrites a commit, pushes, or touches hooks, config, or credentials
|
|
||||||
- `sources.md` — Extracted research sources and their contributing documents
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# git-worktrees
|
|
||||||
|
|
||||||
Manage git worktrees to enable multi-branch parallel development across isolated directories.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles worktree operations within the git workflow suite. It creates, lists, locks/unlocks, moves, removes, prunes, and repairs worktrees — letting an agent work on multiple branches simultaneously without stashing. It returns structured results (paths, branches, lock status) suitable for agent composition. For multi-step flows spanning branch strategy plus worktree setup, `git-workflow` handles the broader orchestration and delegates the worktree mechanics here.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-worktrees
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your worktree task: create a worktree for a branch, list existing worktrees, lock one for removable media, move, remove, prune, or repair. The skill will handle the operation with appropriate safety checks and return results.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Dispatch table, per-operation gates, and the report format |
|
|
||||||
| `references/README.md` | Describes the references directory contents |
|
|
||||||
| `references/worktrees.md` | Read when an operation needs more than the dispatch table: shared vs. per-worktree state, the `add` command forms, the full `add` flag table, orphan branches, sparse-checkout, removable-media locking, remote disambiguation, where to run `repair` from, config keys, and the emergency-fix and PR-review patterns |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
@@ -8,7 +8,7 @@ description: >
|
|||||||
Not interactive multi-step git guidance -> `git-workflow`.
|
Not interactive multi-step git guidance -> `git-workflow`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- git-scm-worktree-docs
|
- git-scm-worktree-docs
|
||||||
@@ -32,7 +32,7 @@ metadata:
|
|||||||
| Create a local branch tracking a remote one | `rtk git worktree add --track -b <branch> <path> <remote>/<branch>` — always correct. `git worktree add <path> <branch>` expands to exactly this, but **only** under the conditions in `references/worktrees.md` |
|
| Create a local branch tracking a remote one | `rtk git worktree add --track -b <branch> <path> <remote>/<branch>` — always correct. `git worktree add <path> <branch>` expands to exactly this, but **only** under the conditions in `references/worktrees.md` |
|
||||||
| Throwaway experiment, no branch | `rtk git worktree add -d <path>` — detached HEAD |
|
| Throwaway experiment, no branch | `rtk git worktree add -d <path>` — detached HEAD |
|
||||||
| **Never** `git worktree add <path> <remote>/<branch>` | That ref resolves, so the shortcut never fires and you get **a detached HEAD, no branch, no upstream**. Commits there go unreachable once HEAD moves, and `git push` needs an explicit refspec. Use the tracking row above |
|
| **Never** `git worktree add <path> <remote>/<branch>` | That ref resolves, so the shortcut never fires and you get **a detached HEAD, no branch, no upstream**. Commits there go unreachable once HEAD moves, and `git push` needs an explicit refspec. Use the tracking row above |
|
||||||
| List | `git worktree list -v` to read, or `git worktree list --porcelain -z` to parse — both bare per ADR-0023: rtk re-renders the output and drops the porcelain flags |
|
| List | `git worktree list -v` to read, or `git worktree list --porcelain -z` to parse — both bare (ADR-0023): rtk re-renders the output and drops the porcelain flags |
|
||||||
| Lock or unlock | `rtk git worktree lock [--reason <str>] <path>` / `rtk git worktree unlock <path>` |
|
| Lock or unlock | `rtk git worktree lock [--reason <str>] <path>` / `rtk git worktree unlock <path>` |
|
||||||
| Move | `rtk git worktree move <from> <to>` |
|
| Move | `rtk git worktree move <from> <to>` |
|
||||||
| Remove | `rtk git worktree remove <path>` |
|
| Remove | `rtk git worktree remove <path>` |
|
||||||
@@ -63,6 +63,6 @@ worktrees:
|
|||||||
```
|
```
|
||||||
|
|
||||||
Derive those fields from `git worktree list --porcelain -z` — bare, not `rtk`:
|
Derive those fields from `git worktree list --porcelain -z` — bare, not `rtk`:
|
||||||
rtk drops both flags and never emits `locked`/`lock_reason` (ADR-0023). For a single
|
rtk drops both flags and never emits `locked`/`lock_reason`. For a single
|
||||||
operation, report its outcome instead — `created: true`, `moved: true`,
|
operation, report its outcome instead — `created: true`, `moved: true`,
|
||||||
`removed: true`.
|
`removed: true`.
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- git-scm-worktree-docs
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
This directory contains provenance metadata and research sources for the `git-worktrees` skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
- `sources.md` — Extracted research sources and their contributing documents
|
|
||||||
- `worktrees.md` — Shared vs. per-worktree state, the `add` command forms, the full `add` flag table, orphan branches, sparse-checkout setup, removable-media locking, remote-branch disambiguation, where to run `repair` from, the config key reference, and the emergency-fix and PR-review workflow patterns
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# pc-author
|
|
||||||
|
|
||||||
Create, add, remove, update, and configure `.pre-commit-config.yaml`.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Manages the pre-commit configuration file in any git repo. When invoked, it scans the repo for languages, proposes appropriate hooks with rationale, and writes or modifies `.pre-commit-config.yaml`. It validates every write with `pre-commit validate-config` and flags stale revision pins. It does not run hooks or install them into `.git/hooks/` — use `pc-run` for that.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/pc-author
|
|
||||||
```
|
|
||||||
|
|
||||||
Invoke with no arguments. The skill determines from context whether to create a new config or modify an existing one.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/create-config.md` | Loaded when the repo has no `.pre-commit-config.yaml` — the create-from-scratch flow |
|
|
||||||
| `references/modify-config.md` | Loaded when a `.pre-commit-config.yaml` already exists — add, remove, top-level keys, rev staleness |
|
|
||||||
| `references/hooks-by-language.md` | Hook recommendations by detected language/extension |
|
|
||||||
| `references/README.md` | Index of files in references/ |
|
|
||||||
| `references/sources.md` | Provenance — research sources that informed this skill |
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- context7-pre-commit-com
|
|
||||||
- pre-commit-com
|
|
||||||
- context7-pre-commit-hooks
|
|
||||||
- pre-commit-hooks-github
|
|
||||||
---
|
|
||||||
|
|
||||||
# references/
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|---|---|
|
|
||||||
| `create-config.md` | The create flow — read when the repo has no `.pre-commit-config.yaml` |
|
|
||||||
| `modify-config.md` | The modify flow — read when a `.pre-commit-config.yaml` already exists |
|
|
||||||
| `hooks-by-language.md` | Hook recommendations by language/context — repo, rev, and rationale for adding hooks |
|
|
||||||
| `sources.md` | Provenance: research sources that informed this skill |
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# pc-run
|
|
||||||
|
|
||||||
Runs, installs, updates, and maintains pre-commit hooks in a local git clone.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
`pc-run` handles everything that happens *after* `.pre-commit-config.yaml` exists: wiring hooks into git, running them, bumping their versions, and maintaining the cache. When hooks fail, it identifies the cause and suggests a concrete fix — it does not auto-fix files or edit the config. For creating or editing `.pre-commit-config.yaml`, use `pc-author` instead.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
- `pre-commit` must be installed and available on `PATH`
|
|
||||||
- A `.pre-commit-config.yaml` must exist at the repo root (use `pc-author` to create one)
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Common invocations:
|
|
||||||
- `/pc-run` — run all hooks against all files (default)
|
|
||||||
- `/pc-run install` — wire hooks into `.git/hooks/`
|
|
||||||
- `/pc-run autoupdate` — bump all `rev` values to latest
|
|
||||||
- `/pc-run clean` — wipe the pre-commit cache (requires confirmation)
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/install.md` | The install flow — loaded when the user asks to install or set up hooks |
|
|
||||||
| `references/autoupdate.md` | The autoupdate flow — loaded when the user asks to bump hook revs |
|
|
||||||
| `references/clean.md` | The clean flow — loaded when the user asks to wipe the cache or rebuild environments |
|
|
||||||
| `references/failure-patterns.md` | Hook failure causes and concrete fix suggestions — loaded when a hook fails or never fires |
|
|
||||||
| `references/sources.md` | Provenance: research sources that informed this skill |
|
|
||||||
| `references/README.md` | Directory index for references/ |
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- context7-pre-commit-com
|
|
||||||
- pre-commit-com
|
|
||||||
- context7-pre-commit-hooks
|
|
||||||
- pre-commit-hooks-github
|
|
||||||
---
|
|
||||||
|
|
||||||
# references/
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|---|---|
|
|
||||||
| `install.md` | The install flow — read when the user asks to install or set up hooks |
|
|
||||||
| `autoupdate.md` | The autoupdate flow — read when the user asks to bump hook revs |
|
|
||||||
| `clean.md` | The clean flow — read when the user asks to wipe the cache or rebuild environments |
|
|
||||||
| `failure-patterns.md` | Hook failure causes and concrete fix suggestions — read when a hook fails or never fires |
|
|
||||||
| `sources.md` | Provenance: research sources that informed this skill |
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# git-branches
|
|
||||||
|
|
||||||
Manage the full lifecycle of git branches — create, switch, delete, rename, track, merge, and compare feature/hotfix/release branches under GitHub Flow or Gitflow.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles branch operations within the git workflow suite. It creates branches following GitHub Flow or Gitflow conventions (configurable), switches and tracks branches, handles safe deletion with unmerged-work checks, and retrieves branch intent metadata for use by other skills (e.g., commit message context). It returns structured results suitable for agent composition.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-branches
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your branch task: create a feature/hotfix/release branch, switch, delete, rename, track, merge, or compare two branches. The skill will determine the branching pattern (GitHub Flow or Gitflow) from config or repo state and handle safety checks for destructive operations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/branch-patterns.md` | Loaded when a branch's base, name prefix, or merge rule depends on GitHub Flow vs. Gitflow |
|
|
||||||
| `references/branch-operations.md` | Loaded when running a create/switch/delete/rename/track/list/stash action, or resolving `get-intent` |
|
|
||||||
| `references/merging.md` | Loaded when merging one branch into another or resolving merge conflicts |
|
|
||||||
| `references/comparing-branches.md` | Loaded when comparing two branches or finding where they diverged |
|
|
||||||
| `references/orchestrator-contract.md` | Loaded when `git-orchestrate` or another calling agent supplies a structured request rather than prose |
|
|
||||||
| `references/sources.md` | Research sources backing the branching/gitflow guidance |
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`git-orchestrate` calls this skill for the branch step of a multi-step workflow and parses its
|
|
||||||
structured result. Revert is `git-history`'s; commit authoring, rebase, reset and cherry-pick are
|
|
||||||
`git-commits`'; deleting a remote branch is `git-remotes`'; branch operations against a
|
|
||||||
Gitea-hosted remote are `gitea-branches`'.
|
|
||||||
@@ -9,7 +9,7 @@ description: >
|
|||||||
Not a Gitea remote's branches -> `gitea-branches`.
|
Not a Gitea remote's branches -> `gitea-branches`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- context7-git-htmldocs
|
- context7-git-htmldocs
|
||||||
@@ -21,7 +21,7 @@ metadata:
|
|||||||
## Gotchas
|
## Gotchas
|
||||||
|
|
||||||
- **Uncommitted changes abort a switch.** `git switch` refuses rather than clobbering conflicting local edits. Offer to stash and retry — forcing the checkout past it is how work disappears.
|
- **Uncommitted changes abort a switch.** `git switch` refuses rather than clobbering conflicting local edits. Offer to stash and retry — forcing the checkout past it is how work disappears.
|
||||||
- **A branch and a tag can carry the same name.** Detect it before acting — `git branch --list <name>` (bare, not `rtk`: rtk prints a phantom `* ` line even on no match, which reports every name as ambiguous — ADR-0023) and `rtk git tag --list <name>`; output from both means the name is ambiguous. Prefer `git switch` over `git checkout`, and where a command accepts either ref, disambiguate with `refs/heads/<name>` or `refs/tags/<name>`.
|
- **A branch and a tag can carry the same name.** Detect it before acting — `git branch --list <name>` (bare, not `rtk`: rtk prints a phantom `* ` line even on no match, which reports every name as ambiguous) and `rtk git tag --list <name>`; output from both means the name is ambiguous. Prefer `git switch` over `git checkout`, and where a command accepts either ref, disambiguate with `refs/heads/<name>` or `refs/tags/<name>`.
|
||||||
- **`main` and `master` are a refusal, not a gate.** Force-pushing, force-deleting, or renaming them is rejected even when the caller passes `confirm: true` — no flag makes the remote's history recoverable. Offer a new branch instead.
|
- **`main` and `master` are a refusal, not a gate.** Force-pushing, force-deleting, or renaming them is rejected even when the caller passes `confirm: true` — no flag makes the remote's history recoverable. Offer a new branch instead.
|
||||||
|
|
||||||
## Step 1 — Determine the branching pattern
|
## Step 1 — Determine the branching pattern
|
||||||
|
|||||||
@@ -45,10 +45,10 @@ past it: it shelves the working tree and index so the branch pointer can move.
|
|||||||
reports `No local changes to save` and stashes nothing. Bare `git stash` is `push` with no message.
|
reports `No local changes to save` and stashes nothing. Bare `git stash` is `push` with no message.
|
||||||
- **restore** — `git stash pop` applies the newest entry and deletes it. Bare, not `rtk`: on a
|
- **restore** — `git stash pop` applies the newest entry and deletes it. Bare, not `rtk`: on a
|
||||||
conflict rtk prints only `FAILED: git stash pop` and swallows the conflict report the paragraph
|
conflict rtk prints only `FAILED: git stash pop` and swallows the conflict report the paragraph
|
||||||
below tells you to read (ADR-0023). `rtk git stash apply stash@{n}`
|
below tells you to read. `rtk git stash apply stash@{n}`
|
||||||
applies without deleting, for replaying one shelf onto more than one branch.
|
applies without deleting, for replaying one shelf onto more than one branch.
|
||||||
- **list** — `git stash list` — bare, not `rtk`: rtk prints `No stashes` where git prints nothing,
|
- **list** — `git stash list` — bare, not `rtk`: rtk prints `No stashes` where git prints nothing,
|
||||||
so an empty-output test misfires (ADR-0023). `rtk git stash show -p stash@{n}` prints that entry's diff.
|
so an empty-output test misfires. `rtk git stash show -p stash@{n}` prints that entry's diff.
|
||||||
- **drop** — `rtk git stash drop stash@{n}` deletes one entry. `rtk git stash clear` deletes all of them
|
- **drop** — `rtk git stash drop stash@{n}` deletes one entry. `rtk git stash clear` deletes all of them
|
||||||
and nothing recovers them — confirm before running it.
|
and nothing recovers them — confirm before running it.
|
||||||
- **branch from a stash** — `rtk git stash branch <branch> stash@{n}` creates a branch at the commit the
|
- **branch from a stash** — `rtk git stash branch <branch> stash@{n}` creates a branch at the commit the
|
||||||
|
|||||||
@@ -27,5 +27,5 @@ list the conflicted files, edit each to resolve its markers, then `rtk git add <
|
|||||||
|
|
||||||
- `rtk git merge --abort` restores the pre-merge state.
|
- `rtk git merge --abort` restores the pre-merge state.
|
||||||
- `git mergetool` opens the configured merge tool — bare, not `rtk`: it hands control to an
|
- `git mergetool` opens the configured merge tool — bare, not `rtk`: it hands control to an
|
||||||
interactive child process, and a token filter has nothing to offer there (ADR-0023).
|
interactive child process, and a token filter has nothing to offer there.
|
||||||
- `rtk git diff --diff-filter=U` shows only the still-conflicted files.
|
- `rtk git diff --diff-filter=U` shows only the still-conflicted files.
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
# git-commits
|
|
||||||
|
|
||||||
Create, amend, squash, and cherry-pick commits with Conventional Commits formatting and validation.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles commit operations within the git workflow suite. It generates well-formatted commit messages following the Conventional Commits spec, validates against commitlint config-conventional constraints, and communicates SemVer impact. It enforces confirmation gates for history-altering operations (amend, rebase, squash) and returns structured JSON output for agent consumption.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-commits
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your commit task: create a new commit, amend, squash, or cherry-pick. The skill will guide message formatting and handle confirmation for destructive operations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Loaded when |
|
|
||||||
|------|-------------|
|
|
||||||
| `SKILL.md` | Always — gotchas, the flow dispatch table, the gates common to every flow, and the output shape |
|
|
||||||
| `references/create-commit.md` | Composing a new commit from staged changes |
|
|
||||||
| `references/rewrite-history.md` | Amending, squashing, or folding a `fixup!`/`squash!` commit into an earlier one |
|
|
||||||
| `references/cherry-pick.md` | Replaying an existing commit onto the current branch |
|
|
||||||
| `references/conventional-commits-spec.md` | A type, footer, or breaking-change edge case is not obvious — full spec, 11-type set, commitlint constraint table |
|
|
||||||
| `references/commit-template.md` | Writing a body for a non-trivial commit — Why / Implementation Notes / Impact structure and the full trailer list |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
Part of the git plugin's domain suite. This skill owns commit authoring and history-rewriting operations only; `git-history` inspects history, `git-branches` owns branch lifecycle, and `git-workflow` is the conversational entry point that routes between them.
|
|
||||||
@@ -8,7 +8,7 @@ description: >
|
|||||||
Not branch lifecycle -> `git-branches`.
|
Not branch lifecycle -> `git-branches`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "0.1.4"
|
version: "0.1.5"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- conventional-commits-spec
|
- conventional-commits-spec
|
||||||
@@ -21,7 +21,7 @@ allowed-tools: Bash
|
|||||||
|
|
||||||
## Gotchas
|
## Gotchas
|
||||||
|
|
||||||
- **Run git as `rtk git <subcommand>`, never bare `git`** — org convention, in `&&` chains too. Exceptions: ADR-0023 clause 3.
|
- **Run git as `rtk git <subcommand>`, never bare `git`** — org convention, in `&&` chains too, except where a skill's Gotchas name a specific bare-git case (interactive rebase here).
|
||||||
- **Refuse to force-push `main`/`master`** — a rewrite leaves the branch diverged and the reflex is to force it back; safe only where nobody else has based work on it.
|
- **Refuse to force-push `main`/`master`** — a rewrite leaves the branch diverged and the reflex is to force it back; safe only where nobody else has based work on it.
|
||||||
- **`reset --hard` is a confirmation gate, not a default.** It overwrites the working tree, and uncommitted edits it discards were never in git, so no reflog recovers them. Name what will be lost and offer a stash first.
|
- **`reset --hard` is a confirmation gate, not a default.** It overwrites the working tree, and uncommitted edits it discards were never in git, so no reflog recovers them. Name what will be lost and offer a stash first.
|
||||||
- **Never add `--no-verify`** — using it when a hook fails bypasses the QA gate the pipeline depends on. Only on the user's explicit demand, with a warning.
|
- **Never add `--no-verify`** — using it when a hook fails bypasses the QA gate the pipeline depends on. Only on the user's explicit demand, with a warning.
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Prefer this whenever a commit is written to be folded, because git does the mark
|
|||||||
|
|
||||||
1. `rtk git commit --fixup=<commit>` keeps the target's message; `rtk git commit --squash=<commit>` lets you edit the combined message later. Both prefix the message with `fixup!`/`squash!` and name the target commit.
|
1. `rtk git commit --fixup=<commit>` keeps the target's message; `rtk git commit --squash=<commit>` lets you edit the combined message later. Both prefix the message with `fixup!`/`squash!` and name the target commit.
|
||||||
2. Get explicit approval — the rebase still rewrites history.
|
2. Get explicit approval — the rebase still rewrites history.
|
||||||
3. Run `git rebase -i --autosquash HEAD~N` — bare, not `rtk`: `-i` opens an interactive sequence editor (ADR-0023). Git pre-fills the todo list with the tagged commits already reordered against their targets; save it unchanged to apply.
|
3. Run `git rebase -i --autosquash HEAD~N` — bare, not `rtk`: `-i` opens an interactive sequence editor. Git pre-fills the todo list with the tagged commits already reordered against their targets; save it unchanged to apply.
|
||||||
|
|
||||||
**`-i` is not optional here.** On Git 2.39.5, `git rebase --autosquash HEAD~N` without `-i` prints `Successfully rebased and updated refs/heads/<branch>.` and exits 0 while leaving the `fixup!` commit in place at its original SHA — `--autosquash` is honoured only by the interactive machinery, and the false success is the trap: the fold is reported as done, and the surviving `fixup!` subject then fails the Conventional Commits `commit-msg` hook. Later Git versions taught the non-interactive rebase to honour the flag, but `-i --autosquash` is correct on every version, so always write that.
|
**`-i` is not optional here.** On Git 2.39.5, `git rebase --autosquash HEAD~N` without `-i` prints `Successfully rebased and updated refs/heads/<branch>.` and exits 0 while leaving the `fixup!` commit in place at its original SHA — `--autosquash` is honoured only by the interactive machinery, and the false success is the trap: the fold is reported as done, and the surviving `fixup!` subject then fails the Conventional Commits `commit-msg` hook. Later Git versions taught the non-interactive rebase to honour the flag, but `-i --autosquash` is correct on every version, so always write that.
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
# git-history
|
|
||||||
|
|
||||||
Inspect git history — log queries, bisect, and locating problematic commits.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles history inspection within the git workflow suite. It queries logs with pickaxe/line-range/custom formats, runs bisect to find bug-introducing commits, and locates commits for downstream cherry-picking or reverting. It returns structured results for agent composition. Rebase, squash, fixup, and other history-rewriting operations are owned by git-commits, not this skill.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
`git-branches` delegates revert here (see `git-branches`'s `references/merging.md`), which is why this skill carries that operation rather than treating it as out of scope; it is general git knowledge, not drawn from the `history-inspection.md` research corpus. Cherry-pick is **not** this skill's: `git-commits` owns it, and this skill's job ends at locating the SHA to hand over. Server-side commit history on a Gitea-hosted repository belongs to `gitea-branches`; this skill reads the local working copy.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-history
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your history task: search logs, bisect for a regression, or locate a specific commit. The skill will query history and return structured results.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/bisect.md` | Loaded when the entry procedure is bisect: manual and automated flows, exit codes, skip, replay, narrowing, custom terms |
|
|
||||||
| `references/git-log-format.md` | Loaded when a log or diff flag needs looking up: format placeholders, presets, diff-filter letters, `-L` syntax, ancestry filters, pickaxe binary-file behaviour, diff output-control flags |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
| `references/README.md` | Index of the references directory |
|
|
||||||
@@ -8,7 +8,7 @@ description: >
|
|||||||
`git-commits`. Not a Gitea server's history -> `gitea-branches`.
|
`git-commits`. Not a Gitea server's history -> `gitea-branches`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- git-scm-bisect-docs
|
- git-scm-bisect-docs
|
||||||
@@ -38,7 +38,7 @@ allowed-tools: Bash
|
|||||||
Default to `rtk git log --oneline`, then narrow by whatever is known:
|
Default to `rtk git log --oneline`, then narrow by whatever is known:
|
||||||
|
|
||||||
- **Content**: `rtk git log -S"string"`, or `-G"regex"` to match any diff line. `--pickaxe-regex` makes the `-S` argument a POSIX ERE; `--pickaxe-all` shows every file in a matching changeset.
|
- **Content**: `rtk git log -S"string"`, or `-G"regex"` to match any diff line. `--pickaxe-regex` makes the `-S` argument a POSIX ERE; `--pickaxe-all` shows every file in a matching changeset.
|
||||||
- **A line or function**: `git log -L <start>,<end>:<file>` or `git log -L :<function>:<file>` — bare, not `rtk`: rtk truncates each diff line at ~72 characters (ADR-0023). Confirm the range resolves before reporting on it — an off-by-one silently omits the target.
|
- **A line or function**: `git log -L <start>,<end>:<file>` or `git log -L :<function>:<file>` — bare, not `rtk`: rtk truncates each diff line at ~72 characters. Confirm the range resolves before reporting on it — an off-by-one silently omits the target.
|
||||||
- **A file across renames**: `rtk git log --follow -- <file>`. Without `--follow` the history stops at the rename boundary.
|
- **A file across renames**: `rtk git log --follow -- <file>`. Without `--follow` the history stops at the rename boundary.
|
||||||
- **Mainline only**: `--first-parent` follows the integration branch and skips commits merged in from side branches.
|
- **Mainline only**: `--first-parent` follows the integration branch and skips commits merged in from side branches.
|
||||||
- **Structured output**: `rtk git log --format="%h | %s | %an (%ar)"`.
|
- **Structured output**: `rtk git log --format="%h | %s | %an (%ar)"`.
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- git-scm-bisect-docs
|
|
||||||
- git-scm-log-docs
|
|
||||||
- git-scm-diff-docs
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
This directory contains provenance metadata and research sources for the `git-history` skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
- `sources.md` — Extracted research sources and their contributing documents
|
|
||||||
- `bisect.md` — The full `git bisect` procedure: manual and automated flows, exit-code semantics, skip and replay, narrowing options, and custom good/bad terms
|
|
||||||
- `git-log-format.md` — Full `git log` format placeholder catalogue, named format presets, `--diff-filter` letters, `-L` line-range syntax, ancestry filters, pickaxe binary-file behaviour, and `git diff` output-control flags
|
|
||||||
@@ -166,10 +166,10 @@ line at roughly 72 characters with an ellipsis, on the one query whose whole poi
|
|||||||
is showing line content.
|
is showing line content.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git log -L 10,20:file.txt # bare per ADR-0023
|
git log -L 10,20:file.txt # bare (ADR-0023)
|
||||||
git log -L /start_pattern/,/end_pattern/:file.txt # bare per ADR-0023
|
git log -L /start_pattern/,/end_pattern/:file.txt # bare (ADR-0023)
|
||||||
git log -L :myfunction:src/app.c # bare per ADR-0023
|
git log -L :myfunction:src/app.c # bare (ADR-0023)
|
||||||
git log -L /init/,+15:config.py # bare per ADR-0023; 15 lines after first /init/ match
|
git log -L /init/,+15:config.py # bare (ADR-0023); 15 lines after first /init/ match
|
||||||
```
|
```
|
||||||
|
|
||||||
Range formats:
|
Range formats:
|
||||||
@@ -213,8 +213,8 @@ Bare `git`, not `rtk git`: rtk appends a blank line and a `Changes:` trailer, so
|
|||||||
the output is no longer one record per line.
|
the output is no longer one record per line.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git diff --name-only # bare per ADR-0023; only filenames, one per line
|
git diff --name-only # bare (ADR-0023); only filenames, one per line
|
||||||
git diff --name-status # bare per ADR-0023; status letter + filename per line
|
git diff --name-status # bare (ADR-0023); status letter + filename per line
|
||||||
```
|
```
|
||||||
|
|
||||||
`--name-status` uses the same status letters as `--diff-filter`.
|
`--name-status` uses the same status letters as `--diff-filter`.
|
||||||
@@ -225,10 +225,10 @@ Bare `git`, not `rtk git`: rtk replaces the word-diff with its own diffstat
|
|||||||
renderer and emits none of the `[-removed-] {+added+}` markers.
|
renderer and emits none of the `[-removed-] {+added+}` markers.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git diff --word-diff # bare per ADR-0023; inline word-level diff, [-removed-] {+added+} markers
|
git diff --word-diff # bare (ADR-0023); inline word-level diff, [-removed-] {+added+} markers
|
||||||
git diff --word-diff=color # bare per ADR-0023; color only, no markers
|
git diff --word-diff=color # bare (ADR-0023); color only, no markers
|
||||||
git diff --word-diff=porcelain # bare per ADR-0023; machine-readable: +/- prefixed lines, ~ for newlines
|
git diff --word-diff=porcelain # bare (ADR-0023); machine-readable: +/- prefixed lines, ~ for newlines
|
||||||
git diff --word-diff-regex=<re> # bare per ADR-0023; define what counts as a "word"
|
git diff --word-diff-regex=<re> # bare (ADR-0023); define what counts as a "word"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Whitespace Flags
|
### Whitespace Flags
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
# git-remotes
|
|
||||||
|
|
||||||
Manage git remote repositories — add/remove/configure remotes, push/pull with safety checks, fetch with pruning, and multi-remote workflows.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles remote operations within the git workflow suite. It manages remote configuration (add, remove, rename), fetch operations with pruning, push operations with force-push safety (`--force-with-lease --force-if-includes`), and pull strategies (fast-forward, rebase, merge). It returns structured results suitable for agent composition.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-remotes
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your remote operation: add a remote, push, pull, fetch, or configure tracking. The skill will handle the operation with appropriate safety checks and return results.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — force-push gate, dispatch table, return format |
|
|
||||||
| `references/README.md` | Describes the references directory contents |
|
|
||||||
| `references/remote-config.md` | Read when adding, removing, renaming, inspecting or re-pointing a remote, or configuring tracking, mirroring, or `set-url` |
|
|
||||||
| `references/fetch.md` | Read when fetching or pruning remote-tracking refs, or doing a shallow or partial fetch |
|
|
||||||
| `references/push.md` | Read when pushing branches or tags, writing refspecs, or force-pushing |
|
|
||||||
| `references/pull.md` | Read when integrating remote changes into the current branch, including the divergence rule |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
Callers that need submodule initialization after a `--recurse-submodules` pull hand off to
|
|
||||||
`git-submodules`; local-only work (commits, branches, history) belongs to `git-commits`,
|
|
||||||
`git-branches`, and `git-history`. The `git-workflow` skill routes humans here for any
|
|
||||||
remote-touching request.
|
|
||||||
@@ -10,7 +10,7 @@ description: >
|
|||||||
Not submodule pointers -> `git-submodules`.
|
Not submodule pointers -> `git-submodules`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- git-scm-remote-docs
|
- git-scm-remote-docs
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- git-scm-remote-docs
|
|
||||||
- git-scm-fetch-docs
|
|
||||||
- git-scm-push-docs
|
|
||||||
- git-scm-pull-docs
|
|
||||||
- context7-git-htmldocs
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
This directory contains provenance metadata and research sources for the `git-remotes` skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
- `sources.md` — Extracted research sources and their contributing documents
|
|
||||||
- `remote-config.md` — Remote add/remove/rename/inspect, tracking and mirror options, housekeeping, and the full `set-url` form
|
|
||||||
- `fetch.md` — Fetch and prune options, shallow and partial fetch, the default fetch refspec
|
|
||||||
- `push.md` — Push options, refspec syntax, force-push safety in full, server-side deny policies
|
|
||||||
- `pull.md` — Pull strategies, submodule caveat, the divergence rule, and pull config precedence
|
|
||||||
@@ -50,7 +50,7 @@ Two mitigations:
|
|||||||
# poisoned by an unrelated fetch.
|
# poisoned by an unrelated fetch.
|
||||||
# The inner `git config` is bare: its stdout becomes a remote URL, so any
|
# The inner `git config` is bare: its stdout becomes a remote URL, so any
|
||||||
# output rewriting would poison the remote silently.
|
# output rewriting would poison the remote silently.
|
||||||
rtk git remote add origin-push $(git config remote.origin.url) # inner bare per ADR-0023
|
rtk git remote add origin-push $(git config remote.origin.url) # inner bare (ADR-0023)
|
||||||
rtk git push --force-with-lease origin-push
|
rtk git push --force-with-lease origin-push
|
||||||
|
|
||||||
# Option 2 — explicit SHA via a local tag, unaffected by tracking-branch state
|
# Option 2 — explicit SHA via a local tag, unaffected by tracking-branch state
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
# git-submodules
|
|
||||||
|
|
||||||
Add, initialize, update, pin, inspect, and remove git submodules in multi-repository projects.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles submodule operations within the git workflow suite: cloning a superproject with
|
|
||||||
its nested repositories, adding a dependency as a submodule, initializing and updating with
|
|
||||||
pinning or branch tracking, parallel and recursive traversal, rebinding URLs and tracked branches,
|
|
||||||
and the full removal sequence including the `.git/modules/` cleanup git leaves behind. It returns
|
|
||||||
structured results suitable for agent composition.
|
|
||||||
|
|
||||||
It sits alongside the other git skills rather than duplicating them: `git-worktrees` covers
|
|
||||||
multiple checkouts of a single repository, and `git-remotes` covers the superproject's own remotes.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-submodules
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the submodule task. The skill applies the shared working rules, dispatches to the
|
|
||||||
reference for that task, and returns structured results (operation, status, per-submodule details,
|
|
||||||
conflicts, and a recovery `next_step` when applicable).
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — gotchas, shared working rules, and the task dispatch table |
|
|
||||||
| `references/README.md` | Describes contents of references/ |
|
|
||||||
| `references/setup-and-update.md` | Loaded when cloning a superproject, adding a submodule, initializing, updating, or re-pinning one, or running a command across all of them — includes the full `add` and `update` flag tables, the pinning workflows, and the `foreach` shell-variable table |
|
|
||||||
| `references/urls-and-config.md` | Loaded when changing where a submodule points or how it is configured — `.gitmodules` vs `.git/config` anatomy, both key tables, `sync`/`set-url`/`set-branch`, local mirror overrides, relative URLs, the custom-`update` security gate, and `absorbgitdirs` |
|
|
||||||
| `references/removal.md` | Loaded when removing or deinitializing a submodule — why `deinit` is not removal, and the four-step removal sequence |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- git-scm-submodule-docs
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
One file per task branch in SKILL.md's dispatch table. Load only the one that matches the request.
|
|
||||||
|
|
||||||
## setup-and-update.md
|
|
||||||
|
|
||||||
Cloning a superproject that has submodules, adding a dependency as a submodule, initializing
|
|
||||||
without cloning, updating or re-pinning, and running one command across every submodule. Carries
|
|
||||||
the `add` and `update` flag tables, the keep-pinned and move-the-pin-forward workflows, and the
|
|
||||||
`foreach` shell-variable table (`$name`, `$sm_path`, `$displaypath`, `$sha1`, `$toplevel`).
|
|
||||||
|
|
||||||
## urls-and-config.md
|
|
||||||
|
|
||||||
Where a submodule points and how it is configured: the `.gitmodules` vs `.git/config` split, both
|
|
||||||
key tables, `sync` / `set-url` / `set-branch`, local mirror overrides, relative URL resolution, the
|
|
||||||
security gate on custom `update` commands, and `absorbgitdirs`.
|
|
||||||
|
|
||||||
## removal.md
|
|
||||||
|
|
||||||
Removing a submodule, and why `deinit` alone does not remove one. Carries the full four-step
|
|
||||||
removal sequence including the manual `.git/modules/<name>/` cleanup.
|
|
||||||
|
|
||||||
## sources.md
|
|
||||||
|
|
||||||
Research sources that informed this skill — provenance chain for git-scm-submodule-docs reference
|
|
||||||
material.
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# git-workflow
|
|
||||||
|
|
||||||
Human-friendly interface for interactive git workflows with conversational prompts, progress guidance, and safety confirmations.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill wraps the `git-orchestrate` agent to provide an interactive, educational interface for humans performing git workflows. It is the router for the six local-git domain skills — `git-commits`, `git-branches`, `git-history`, `git-remotes`, `git-submodules` and `git-worktrees` — and `SKILL.md` carries a table mapping each of them to the requests it owns, so an ambiguous request resolves to exactly one domain before anything runs. The skill parses user intent, gathers session context, invokes the orchestrator, and presents results in plain language with inline help, progress updates, and explanations of what's happening. It enforces confirmation gates for destructive operations (force-push, branch deletion, rebasing with history loss, force-checkout) and provides best-practices guidance throughout. The org's non-negotiable git rules live in `references/hard-rules.md` and are loaded only when a request could conflict with one.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-workflow
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your git workflow: commit, create a branch, rebase, inspect history, manage submodules, switch worktrees, or manage remotes. The skill will prompt for any missing details and guide you through the workflow.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — the six-domain routing table, the workflow steps, and the interaction style |
|
|
||||||
| `README.md` | This file |
|
|
||||||
| `references/hard-rules.md` | The org's non-negotiable git rules; read when a request creates, amends, or rewrites a commit, pushes, or touches hooks, config, or credentials |
|
|
||||||
| `references/README.md` | Describes the references directory contents |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- nvie-gitflow-post
|
|
||||||
- atlassian-gitflow-tutorial
|
|
||||||
- gitflow-cheatsheet
|
|
||||||
- context7-git-htmldocs
|
|
||||||
- org-git-conventions
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
This directory contains the org git rules and the provenance metadata for the `git-workflow`
|
|
||||||
skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
- `hard-rules.md` — The org's non-negotiable git rules, loaded when a request creates, amends, or
|
|
||||||
rewrites a commit, pushes, or touches hooks, config, or credentials
|
|
||||||
- `sources.md` — Extracted research sources and their contributing documents
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# git-worktrees
|
|
||||||
|
|
||||||
Manage git worktrees to enable multi-branch parallel development across isolated directories.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles worktree operations within the git workflow suite. It creates, lists, locks/unlocks, moves, removes, prunes, and repairs worktrees — letting an agent work on multiple branches simultaneously without stashing. It returns structured results (paths, branches, lock status) suitable for agent composition. For multi-step flows spanning branch strategy plus worktree setup, `git-workflow` handles the broader orchestration and delegates the worktree mechanics here.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/git-worktrees
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your worktree task: create a worktree for a branch, list existing worktrees, lock one for removable media, move, remove, prune, or repair. The skill will handle the operation with appropriate safety checks and return results.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Dispatch table, per-operation gates, and the report format |
|
|
||||||
| `references/README.md` | Describes the references directory contents |
|
|
||||||
| `references/worktrees.md` | Read when an operation needs more than the dispatch table: shared vs. per-worktree state, the `add` command forms, the full `add` flag table, orphan branches, sparse-checkout, removable-media locking, remote disambiguation, where to run `repair` from, config keys, and the emergency-fix and PR-review patterns |
|
|
||||||
| `references/sources.md` | Research sources and provenance |
|
|
||||||
@@ -8,7 +8,7 @@ description: >
|
|||||||
Not interactive multi-step git guidance -> `git-workflow`.
|
Not interactive multi-step git guidance -> `git-workflow`.
|
||||||
|
|
||||||
metadata:
|
metadata:
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
category: git
|
category: git
|
||||||
source_keys:
|
source_keys:
|
||||||
- git-scm-worktree-docs
|
- git-scm-worktree-docs
|
||||||
@@ -32,7 +32,7 @@ metadata:
|
|||||||
| Create a local branch tracking a remote one | `rtk git worktree add --track -b <branch> <path> <remote>/<branch>` — always correct. `git worktree add <path> <branch>` expands to exactly this, but **only** under the conditions in `references/worktrees.md` |
|
| Create a local branch tracking a remote one | `rtk git worktree add --track -b <branch> <path> <remote>/<branch>` — always correct. `git worktree add <path> <branch>` expands to exactly this, but **only** under the conditions in `references/worktrees.md` |
|
||||||
| Throwaway experiment, no branch | `rtk git worktree add -d <path>` — detached HEAD |
|
| Throwaway experiment, no branch | `rtk git worktree add -d <path>` — detached HEAD |
|
||||||
| **Never** `git worktree add <path> <remote>/<branch>` | That ref resolves, so the shortcut never fires and you get **a detached HEAD, no branch, no upstream**. Commits there go unreachable once HEAD moves, and `git push` needs an explicit refspec. Use the tracking row above |
|
| **Never** `git worktree add <path> <remote>/<branch>` | That ref resolves, so the shortcut never fires and you get **a detached HEAD, no branch, no upstream**. Commits there go unreachable once HEAD moves, and `git push` needs an explicit refspec. Use the tracking row above |
|
||||||
| List | `git worktree list -v` to read, or `git worktree list --porcelain -z` to parse — both bare per ADR-0023: rtk re-renders the output and drops the porcelain flags |
|
| List | `git worktree list -v` to read, or `git worktree list --porcelain -z` to parse — both bare (ADR-0023): rtk re-renders the output and drops the porcelain flags |
|
||||||
| Lock or unlock | `rtk git worktree lock [--reason <str>] <path>` / `rtk git worktree unlock <path>` |
|
| Lock or unlock | `rtk git worktree lock [--reason <str>] <path>` / `rtk git worktree unlock <path>` |
|
||||||
| Move | `rtk git worktree move <from> <to>` |
|
| Move | `rtk git worktree move <from> <to>` |
|
||||||
| Remove | `rtk git worktree remove <path>` |
|
| Remove | `rtk git worktree remove <path>` |
|
||||||
@@ -63,6 +63,6 @@ worktrees:
|
|||||||
```
|
```
|
||||||
|
|
||||||
Derive those fields from `git worktree list --porcelain -z` — bare, not `rtk`:
|
Derive those fields from `git worktree list --porcelain -z` — bare, not `rtk`:
|
||||||
rtk drops both flags and never emits `locked`/`lock_reason` (ADR-0023). For a single
|
rtk drops both flags and never emits `locked`/`lock_reason`. For a single
|
||||||
operation, report its outcome instead — `created: true`, `moved: true`,
|
operation, report its outcome instead — `created: true`, `moved: true`,
|
||||||
`removed: true`.
|
`removed: true`.
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- git-scm-worktree-docs
|
|
||||||
---
|
|
||||||
|
|
||||||
# References
|
|
||||||
|
|
||||||
This directory contains provenance metadata and research sources for the `git-worktrees` skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
- `sources.md` — Extracted research sources and their contributing documents
|
|
||||||
- `worktrees.md` — Shared vs. per-worktree state, the `add` command forms, the full `add` flag table, orphan branches, sparse-checkout setup, removable-media locking, remote-branch disambiguation, where to run `repair` from, the config key reference, and the emergency-fix and PR-review workflow patterns
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# pc-author
|
|
||||||
|
|
||||||
Create, add, remove, update, and configure `.pre-commit-config.yaml`.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
Manages the pre-commit configuration file in any git repo. When invoked, it scans the repo for languages, proposes appropriate hooks with rationale, and writes or modifies `.pre-commit-config.yaml`. It validates every write with `pre-commit validate-config` and flags stale revision pins. It does not run hooks or install them into `.git/hooks/` — use `pc-run` for that.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```
|
|
||||||
/pc-author
|
|
||||||
```
|
|
||||||
|
|
||||||
Invoke with no arguments. The skill determines from context whether to create a new config or modify an existing one.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/create-config.md` | Loaded when the repo has no `.pre-commit-config.yaml` — the create-from-scratch flow |
|
|
||||||
| `references/modify-config.md` | Loaded when a `.pre-commit-config.yaml` already exists — add, remove, top-level keys, rev staleness |
|
|
||||||
| `references/hooks-by-language.md` | Hook recommendations by detected language/extension |
|
|
||||||
| `references/README.md` | Index of files in references/ |
|
|
||||||
| `references/sources.md` | Provenance — research sources that informed this skill |
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- context7-pre-commit-com
|
|
||||||
- pre-commit-com
|
|
||||||
- context7-pre-commit-hooks
|
|
||||||
- pre-commit-hooks-github
|
|
||||||
---
|
|
||||||
|
|
||||||
# references/
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|---|---|
|
|
||||||
| `create-config.md` | The create flow — read when the repo has no `.pre-commit-config.yaml` |
|
|
||||||
| `modify-config.md` | The modify flow — read when a `.pre-commit-config.yaml` already exists |
|
|
||||||
| `hooks-by-language.md` | Hook recommendations by language/context — repo, rev, and rationale for adding hooks |
|
|
||||||
| `sources.md` | Provenance: research sources that informed this skill |
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# pc-run
|
|
||||||
|
|
||||||
Runs, installs, updates, and maintains pre-commit hooks in a local git clone.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
`pc-run` handles everything that happens *after* `.pre-commit-config.yaml` exists: wiring hooks into git, running them, bumping their versions, and maintaining the cache. When hooks fail, it identifies the cause and suggests a concrete fix — it does not auto-fix files or edit the config. For creating or editing `.pre-commit-config.yaml`, use `pc-author` instead.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
- `pre-commit` must be installed and available on `PATH`
|
|
||||||
- A `.pre-commit-config.yaml` must exist at the repo root (use `pc-author` to create one)
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Common invocations:
|
|
||||||
- `/pc-run` — run all hooks against all files (default)
|
|
||||||
- `/pc-run install` — wire hooks into `.git/hooks/`
|
|
||||||
- `/pc-run autoupdate` — bump all `rev` values to latest
|
|
||||||
- `/pc-run clean` — wipe the pre-commit cache (requires confirmation)
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/install.md` | The install flow — loaded when the user asks to install or set up hooks |
|
|
||||||
| `references/autoupdate.md` | The autoupdate flow — loaded when the user asks to bump hook revs |
|
|
||||||
| `references/clean.md` | The clean flow — loaded when the user asks to wipe the cache or rebuild environments |
|
|
||||||
| `references/failure-patterns.md` | Hook failure causes and concrete fix suggestions — loaded when a hook fails or never fires |
|
|
||||||
| `references/sources.md` | Provenance: research sources that informed this skill |
|
|
||||||
| `references/README.md` | Directory index for references/ |
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
source_keys:
|
|
||||||
- context7-pre-commit-com
|
|
||||||
- pre-commit-com
|
|
||||||
- context7-pre-commit-hooks
|
|
||||||
- pre-commit-hooks-github
|
|
||||||
---
|
|
||||||
|
|
||||||
# references/
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|---|---|
|
|
||||||
| `install.md` | The install flow — read when the user asks to install or set up hooks |
|
|
||||||
| `autoupdate.md` | The autoupdate flow — read when the user asks to bump hook revs |
|
|
||||||
| `clean.md` | The clean flow — read when the user asks to wipe the cache or rebuild environments |
|
|
||||||
| `failure-patterns.md` | Hook failure causes and concrete fix suggestions — read when a hook fails or never fires |
|
|
||||||
| `sources.md` | Provenance: research sources that informed this skill |
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# gitea-branches
|
|
||||||
|
|
||||||
Manage Gitea repository branches and inspect commit history via the Gitea MCP server.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles branch lifecycle operations (list, create, rename, delete) and read-only commit
|
|
||||||
history (list commits, get a single commit's full detail) against a Gitea repository. It resolves
|
|
||||||
`owner`/`repo` from the git remote, dispatches to the right MCP tool, and applies safety and
|
|
||||||
pagination conventions specific to Gitea's API (e.g. refusing to delete a protected branch without
|
|
||||||
explicit confirmation, and treating unexpected 404s as possible masked 403s).
|
|
||||||
|
|
||||||
## Boundaries
|
|
||||||
|
|
||||||
This skill operates on the Gitea server via the MCP tools, never on your local checkout. Branch
|
|
||||||
and commit-history work against the working copy belongs to `git-branches` and `git-history`.
|
|
||||||
Branch references that only exist relative to a pull request — a PR's head or base branch, and
|
|
||||||
cross-repo fork PR heads in particular — belong to `gitea-prs`; `list_branches` cannot see a fork's
|
|
||||||
head at all.
|
|
||||||
|
|
||||||
The skill triggers on phrasings like "list branches", "create a branch", "rename a branch", "delete a branch",
|
|
||||||
"what commits are on this branch", "show commit <sha>", and "what changed in that commit", even
|
|
||||||
when the user does not say "Gitea", as long as the repo's remote is a Gitea instance.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
Requires a Gitea MCP server configured with a token that has `write:repository` scope. This is
|
|
||||||
confirmed for `list_branches`, `create_branch`, and `delete_branch` (and inferred for
|
|
||||||
`rename_branch`) (Gitea gates reads behind write
|
|
||||||
scope for repo-scoped operations); `list_commits` and `get_commit` are inferred to need the same
|
|
||||||
scope by analogy, not explicitly confirmed — see `references/commits.md`. Requires a git remote
|
|
||||||
named `origin` pointing at the Gitea instance.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-branches
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your task: list/create/rename/delete a branch, or list/inspect commits. See `SKILL.md`'s
|
|
||||||
dispatch table for the full set of recognized invocations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — dispatch table, gotchas |
|
|
||||||
| `references/branches.md` | Verified call signatures and mechanics for list/create/rename/delete branch |
|
|
||||||
| `references/commits.md` | Verified call signatures and mechanics for list/get commit |
|
|
||||||
| `references/sources.md` | Research sources backing the branch/commit guidance |
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# gitea-files
|
|
||||||
|
|
||||||
Read and write individual files and directory/repository trees in a Gitea repository via the Gitea MCP server.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles file-domain operations within the Gitea integration suite: reading a single file's contents, listing one directory level, walking a full repository tree (optionally recursive), creating or updating a file, and deleting a file. It owns the SHA-based optimistic-concurrency pattern that Gitea requires for file writes — the domain's sharpest gotcha — and defers branch creation, commit history, and pull request mechanics to `gitea-branches` and `gitea-prs`.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-files
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the file task: read a file or directory, walk a tree, create/update a file, or delete a file. Provide `owner`/`repo`/branch (or ask the user if not given) — this skill does not resolve them from a git remote itself.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/reading.md` | Loaded for the read flow: the three read tools, `ref`/`tree_sha` selection, tree pagination, and why a listing is not a SHA source |
|
|
||||||
| `references/writing.md` | Loaded for the write flow: the SHA-first create/update/delete sequences, `new_branch_name`, the worked branch + file + PR sequence, and failed-write triage |
|
|
||||||
| `references/sources.md` | Research sources backing the SHA/concurrency and direct-commit-vs-PR guidance |
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# gitea-issues
|
|
||||||
|
|
||||||
Read and write Gitea issues — list, get, create, comment, close, and search — via the Gitea MCP server.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles the issue lifecycle (`list_issues`, `issue_read`, `issue_write`, `search_issues`):
|
|
||||||
listing repo issues, reading a single issue's details/comments/labels, creating an issue, updating
|
|
||||||
its state, adding/editing comments, applying labels, and searching issues/PRs across repositories.
|
|
||||||
The create flow closes out four enrichments deferred from issue #6 comment #848: label inference
|
|
||||||
and milestone assignment (both by composing `gitea-labels-milestones`), an assignee workaround for
|
|
||||||
the blocked `get_me` scope, and the "Depends on #N" dependency-linking convention. It supersedes the
|
|
||||||
`issue`/`issue <N>`/`issue close <N>`/`issue comment <N>` dispatch this plugin's old single flat
|
|
||||||
Gitea skill carried, retired when the plugin was split into per-domain deep modules.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
Requires a Gitea MCP server configured with a token holding `write:issue` + `write:repository`.
|
|
||||||
Requires a git remote named `origin` pointing at the Gitea instance, unless an orchestrating caller
|
|
||||||
(e.g. `gitea-workflow`) already resolved `owner`/`repo` for you.
|
|
||||||
|
|
||||||
## How it composes
|
|
||||||
|
|
||||||
This skill composes `gitea-labels-milestones` for *all* label inference, label-name-to-ID
|
|
||||||
resolution, and milestone lookup, rather than duplicating that taxonomy or its resolution logic —
|
|
||||||
see `references/enrichments.md` for the call protocol. Managing the label and milestone definitions
|
|
||||||
themselves (create/edit/delete a label, create/close a milestone) is out of scope here and goes to
|
|
||||||
`gitea-labels-milestones` directly.
|
|
||||||
|
|
||||||
One boundary the description does not spend characters on, because it was never going to win an
|
|
||||||
issue request: local git branch or commit work belongs to `gitea-branches` (Gitea-side) or
|
|
||||||
`git-branches` (working copy).
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-issues
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your task: list issues, create one, get/comment/close/label a specific issue number, or
|
|
||||||
search across repos. See `SKILL.md`'s dispatch table for the full set of recognized invocations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — dispatch table, Gotchas |
|
|
||||||
| `references/issues.md` | Verified call signatures and mechanics for `list_issues`/`issue_read`/`issue_write` |
|
|
||||||
| `references/search.md` | Verified call signature and mechanics for `search_issues` |
|
|
||||||
| `references/enrichments.md` | Create-flow enrichments — label inference, milestone assignment, assignee workaround, dependency-linking convention |
|
|
||||||
| `references/sources.md` | Research sources backing the issue guidance |
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# gitea-labels-milestones
|
|
||||||
|
|
||||||
Read and write Gitea labels and milestones, and resolve label/milestone identity for the skills that apply them to issues and PRs.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles label and milestone CRUD (`label_read`/`label_write`, `milestone_read`/`milestone_write`) — listing repo or org labels, creating/editing/deleting a label, resolving a label name to the numeric ID required to apply it to an issue or PR, and listing/creating/updating/closing/deleting a milestone. It also owns label inference: mapping conversation context (bug report, feature request, urgency language) to this repo's `Kind/*`/`Priority/*`/`Status/*` taxonomy.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
This is a cross-cutting shared skill. `gitea-issues` and `gitea-prs` both compose it whenever they need to apply a label or assign a milestone, rather than duplicating label/milestone logic: they call in for name/title → ID resolution, then their own `issue_write`/`pull_request_write` calls apply the resolved IDs. The split is deliberate — identity resolution lives here once, and the write that attaches an ID to a specific issue or PR lives with the skill that owns that object.
|
|
||||||
|
|
||||||
That relationship is documented here rather than in the skill description, which is preloaded into every session and carries routing information only: an agent reaches this skill because the user asked about labels or milestones, not because two other skills call it.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-labels-milestones
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the label or milestone task: list labels, resolve a name to an ID, create/edit/delete a label, or list/create/update/close/delete a milestone. For applying already-resolved labels or a milestone to a specific issue or PR, use `gitea-issues` or `gitea-prs` instead.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — dispatch table and Gotchas |
|
|
||||||
| `references/labels.md` | Execution detail for `label_read`/`label_write` |
|
|
||||||
| `references/milestones.md` | Execution detail for `milestone_read`/`milestone_write` |
|
|
||||||
| `references/label-inference.md` | Context-pattern → `Kind/*`/`Priority/*`/`Status/*` label inference guide |
|
|
||||||
| `references/sources.md` | Research sources backing the label/milestone guidance |
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# gitea-prs
|
|
||||||
|
|
||||||
List, read, create, update, merge, and review Gitea pull requests.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles the pull request lifecycle within the Gitea integration suite — listing and reading PRs (details, diff, changed files, CI status, reviews), creating them (title, body, labels), updating them (title, body, assignees, labels, milestone), adding and removing reviewers, closing/reopening, merging with a chosen strategy and post-merge branch cleanup, and the full code-review flow (create a review with inline comments, submit it, dismiss or delete it, reply to a review comment, and resolve or unresolve a comment thread). It composes `gitea-labels-milestones` for label/milestone ID resolution rather than duplicating that logic — `milestone` applies on an update only, never on create — and defers to `gitea-issues` for anything that turns out to be an issue rather than a PR (they share one number space) and to `gitea-branches`/`gitea-files` for the underlying branch/file operations behind a PR.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-prs
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the PR or review task: list PRs, get a PR's status/diff/reviews, create or update a PR, merge one, or create/submit/dismiss a code review. The skill resolves `owner`/`repo` from the `origin` git remote (or takes them from an orchestrating caller) and resolves any label or milestone names via `gitea-labels-milestones` before writing them.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
Requires a Gitea MCP server configured with a token holding `write:issue` + `write:repository`.
|
|
||||||
Requires a git remote named `origin` pointing at the Gitea instance, unless an orchestrating caller
|
|
||||||
(e.g. `gitea-workflow`) already resolved `owner`/`repo` for you.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — Gotchas, the dispatch table, and label/milestone ID resolution via `gitea-labels-milestones` |
|
|
||||||
| `references/pull-requests.md` | Execution detail for `list_pull_requests`, `pull_request_read` (get/get_diff/get_files/get_status), and `pull_request_write` (create/update/close/reopen/update_branch/add_reviewers/remove_reviewers) |
|
|
||||||
| `references/reviews.md` | Execution detail for `pull_request_review_write` (create/submit/delete/dismiss, plus the comment-thread methods reply_comment/resolve_thread/unresolve_thread) and the review-related `pull_request_read` methods |
|
|
||||||
| `references/merging.md` | The merge workflow — CI vs. review/branch-protection gates, merge styles, branch cleanup, and the post-merge issue-close check |
|
|
||||||
| `references/sources.md` | Research sources backing the PR/review guidance |
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# gitea-releases
|
|
||||||
|
|
||||||
Manage Gitea releases and tags — list, create, and delete releases (with draft/prerelease flags and notes) and their underlying tags.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles release and tag operations for a Gitea repository. It creates releases from a tag/target commitish with title, notes, and draft/prerelease flags; lists and paginates releases and tags; retrieves the latest release; and deletes releases and tags as separate, independent destructive operations. It resolves the numeric release id required for deletion instead of assuming a tag name will work.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
Requires a Gitea MCP server configured with a token holding `write:repository`. Requires a git remote
|
|
||||||
named `origin` pointing at the Gitea instance, unless an orchestrating caller already resolved
|
|
||||||
`owner`/`repo` for you.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-releases
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your release/tag task: list releases, get the latest release, create a release (with a tag, target, and title), or delete a release or tag. The skill handles resolving the numeric release id where required and keeps release/tag deletion as distinct operations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/call-signatures.md` | Tool parameters and response shapes derived from gitea-mcp source (see `references/sources.md`); input params for all nine tools additionally cross-checked live against gitea-mcp v1.7.0 |
|
|
||||||
| `references/conventions.md` | Semver/draft/prerelease practitioner conventions and pagination behavior |
|
|
||||||
| `references/sources.md` | Research sources backing the call signatures and conventions |
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# gitea-workflow
|
|
||||||
|
|
||||||
Human-facing entry point and router for the Gitea integration.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill is the conversational front door to the Gitea suite — it replaces the old flat `/gitea` skill. On its own it never calls a Gitea MCP tool; it composes the six domain skills (`gitea-issues`, `gitea-labels-milestones`, `gitea-prs`, `gitea-branches`, `gitea-files`, `gitea-releases`). It handles the no-args status check-in (open issues + open PRs), which preserves the original flat `/gitea` skill's default behavior; resolves ambiguous issue-or-PR numbers before dispatching (issues and PRs share one number space); and points a user or agent to the right domain skill when it's unclear which one applies.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-workflow
|
|
||||||
```
|
|
||||||
|
|
||||||
Invoke with no arguments for a status check-in, with a bare number to resolve and show issue or PR detail, or with a general request to be routed to the right domain skill.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — Gotchas, the dispatch table keyed on invocation shape, and the common report gate every branch ends in — each branch's own format lives with its reference file |
|
|
||||||
| `references/status-checkin.md` | Loaded when the skill is invoked with no specific request — the two parallel open-issue/open-PR reads and the two-section report |
|
|
||||||
| `references/number-resolution.md` | Loaded when the request carries a bare number that says neither "issue" nor "PR" — the `is_pull` resolution call and the hidden-permission-error 404 |
|
|
||||||
| `references/skill-index.md` | Loaded when the request names a capability but not which skill owns it — the six-skill routing index |
|
|
||||||
| `references/sources.md` | Research sources backing the routing/status guidance |
|
|
||||||
@@ -17,17 +17,5 @@
|
|||||||
"milestones",
|
"milestones",
|
||||||
"releases",
|
"releases",
|
||||||
"branches"
|
"branches"
|
||||||
],
|
]
|
||||||
"mcpServers": {
|
|
||||||
"gitea": {
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"gitea.com/gitea/gitea-mcp@v1.7.0",
|
|
||||||
"-t",
|
|
||||||
"stdio"
|
|
||||||
],
|
|
||||||
"command": "go",
|
|
||||||
"type": "stdio"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
# Environment variables required by the gitea MCP server declared in
|
|
||||||
# plugins/gitea/.mcp.json. apm passes these ${VAR} references through to the
|
|
||||||
# deployed MCP config unexpanded; Claude Code resolves them from the process
|
|
||||||
# environment at server startup. Neither value is ever committed to this repo.
|
|
||||||
#
|
|
||||||
# Nothing in this repo auto-loads a .env file -- apm has no dotenv support.
|
|
||||||
# Copy this file to .env at the repo root, fill in real values, then export it
|
|
||||||
# into your shell before starting Claude Code, e.g.:
|
|
||||||
#
|
|
||||||
# set -a; source .env; set +a
|
|
||||||
#
|
|
||||||
# Or skip the file and export the two variables directly in your shell
|
|
||||||
# profile. Either way, never commit .env -- .gitignore already excludes it.
|
|
||||||
|
|
||||||
# A Gitea access token, scoped to the repositories this agent should reach.
|
|
||||||
# Generate one in Gitea under Settings > Applications.
|
|
||||||
GITEA_ACCESS_TOKEN=<your-gitea-access-token>
|
|
||||||
|
|
||||||
# The base URL of your Gitea instance, including scheme.
|
|
||||||
GITEA_HOST=https://<your-gitea-host>
|
|
||||||
5
plugins/gitea/.github/plugin/plugin.json
vendored
5
plugins/gitea/.github/plugin/plugin.json
vendored
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "gitea",
|
"name": "gitea",
|
||||||
"version": "1.3.8",
|
"version": "1.3.8",
|
||||||
"description": "Skills and agents for working with a Gitea forge through its HTTP API — the forge's own objects, as distinct from the local git clone.",
|
"description": "Skills and agents for working with a Gitea forge through its HTTP API \u2014 the forge's own objects, as distinct from the local git clone.",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Defame1297",
|
"name": "Defame1297",
|
||||||
"email": "defame1297@rkdr.net",
|
"email": "defame1297@rkdr.net",
|
||||||
@@ -17,6 +17,5 @@
|
|||||||
"milestones",
|
"milestones",
|
||||||
"releases",
|
"releases",
|
||||||
"branches"
|
"branches"
|
||||||
],
|
]
|
||||||
"mcpServers": ".mcp.json"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,3 @@
|
|||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {}
|
||||||
"gitea": {
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"gitea.com/gitea/gitea-mcp@v1.7.0",
|
|
||||||
"-t",
|
|
||||||
"stdio"
|
|
||||||
],
|
|
||||||
"command": "go",
|
|
||||||
"env": {
|
|
||||||
"GITEA_ACCESS_TOKEN": "${GITEA_ACCESS_TOKEN}",
|
|
||||||
"GITEA_HOST": "${GITEA_HOST}"
|
|
||||||
},
|
|
||||||
"type": "stdio"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
# gitea-branches
|
|
||||||
|
|
||||||
Manage Gitea repository branches and inspect commit history via the Gitea MCP server.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles branch lifecycle operations (list, create, rename, delete) and read-only commit
|
|
||||||
history (list commits, get a single commit's full detail) against a Gitea repository. It resolves
|
|
||||||
`owner`/`repo` from the git remote, dispatches to the right MCP tool, and applies safety and
|
|
||||||
pagination conventions specific to Gitea's API (e.g. refusing to delete a protected branch without
|
|
||||||
explicit confirmation, and treating unexpected 404s as possible masked 403s).
|
|
||||||
|
|
||||||
## Boundaries
|
|
||||||
|
|
||||||
This skill operates on the Gitea server via the MCP tools, never on your local checkout. Branch
|
|
||||||
and commit-history work against the working copy belongs to `git-branches` and `git-history`.
|
|
||||||
Branch references that only exist relative to a pull request — a PR's head or base branch, and
|
|
||||||
cross-repo fork PR heads in particular — belong to `gitea-prs`; `list_branches` cannot see a fork's
|
|
||||||
head at all.
|
|
||||||
|
|
||||||
The skill triggers on phrasings like "list branches", "create a branch", "rename a branch", "delete a branch",
|
|
||||||
"what commits are on this branch", "show commit <sha>", and "what changed in that commit", even
|
|
||||||
when the user does not say "Gitea", as long as the repo's remote is a Gitea instance.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
Requires a Gitea MCP server configured with a token that has `write:repository` scope. This is
|
|
||||||
confirmed for `list_branches`, `create_branch`, and `delete_branch` (and inferred for
|
|
||||||
`rename_branch`) (Gitea gates reads behind write
|
|
||||||
scope for repo-scoped operations); `list_commits` and `get_commit` are inferred to need the same
|
|
||||||
scope by analogy, not explicitly confirmed — see `references/commits.md`. Requires a git remote
|
|
||||||
named `origin` pointing at the Gitea instance.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-branches
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your task: list/create/rename/delete a branch, or list/inspect commits. See `SKILL.md`'s
|
|
||||||
dispatch table for the full set of recognized invocations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — dispatch table, gotchas |
|
|
||||||
| `references/branches.md` | Verified call signatures and mechanics for list/create/rename/delete branch |
|
|
||||||
| `references/commits.md` | Verified call signatures and mechanics for list/get commit |
|
|
||||||
| `references/sources.md` | Research sources backing the branch/commit guidance |
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# gitea-files
|
|
||||||
|
|
||||||
Read and write individual files and directory/repository trees in a Gitea repository via the Gitea MCP server.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles file-domain operations within the Gitea integration suite: reading a single file's contents, listing one directory level, walking a full repository tree (optionally recursive), creating or updating a file, and deleting a file. It owns the SHA-based optimistic-concurrency pattern that Gitea requires for file writes — the domain's sharpest gotcha — and defers branch creation, commit history, and pull request mechanics to `gitea-branches` and `gitea-prs`.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-files
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the file task: read a file or directory, walk a tree, create/update a file, or delete a file. Provide `owner`/`repo`/branch (or ask the user if not given) — this skill does not resolve them from a git remote itself.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents |
|
|
||||||
| `references/reading.md` | Loaded for the read flow: the three read tools, `ref`/`tree_sha` selection, tree pagination, and why a listing is not a SHA source |
|
|
||||||
| `references/writing.md` | Loaded for the write flow: the SHA-first create/update/delete sequences, `new_branch_name`, the worked branch + file + PR sequence, and failed-write triage |
|
|
||||||
| `references/sources.md` | Research sources backing the SHA/concurrency and direct-commit-vs-PR guidance |
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# gitea-issues
|
|
||||||
|
|
||||||
Read and write Gitea issues — list, get, create, comment, close, and search — via the Gitea MCP server.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles the issue lifecycle (`list_issues`, `issue_read`, `issue_write`, `search_issues`):
|
|
||||||
listing repo issues, reading a single issue's details/comments/labels, creating an issue, updating
|
|
||||||
its state, adding/editing comments, applying labels, and searching issues/PRs across repositories.
|
|
||||||
The create flow closes out four enrichments deferred from issue #6 comment #848: label inference
|
|
||||||
and milestone assignment (both by composing `gitea-labels-milestones`), an assignee workaround for
|
|
||||||
the blocked `get_me` scope, and the "Depends on #N" dependency-linking convention. It supersedes the
|
|
||||||
`issue`/`issue <N>`/`issue close <N>`/`issue comment <N>` dispatch this plugin's old single flat
|
|
||||||
Gitea skill carried, retired when the plugin was split into per-domain deep modules.
|
|
||||||
|
|
||||||
## Before you start
|
|
||||||
|
|
||||||
Requires a Gitea MCP server configured with a token holding `write:issue` + `write:repository`.
|
|
||||||
Requires a git remote named `origin` pointing at the Gitea instance, unless an orchestrating caller
|
|
||||||
(e.g. `gitea-workflow`) already resolved `owner`/`repo` for you.
|
|
||||||
|
|
||||||
## How it composes
|
|
||||||
|
|
||||||
This skill composes `gitea-labels-milestones` for *all* label inference, label-name-to-ID
|
|
||||||
resolution, and milestone lookup, rather than duplicating that taxonomy or its resolution logic —
|
|
||||||
see `references/enrichments.md` for the call protocol. Managing the label and milestone definitions
|
|
||||||
themselves (create/edit/delete a label, create/close a milestone) is out of scope here and goes to
|
|
||||||
`gitea-labels-milestones` directly.
|
|
||||||
|
|
||||||
One boundary the description does not spend characters on, because it was never going to win an
|
|
||||||
issue request: local git branch or commit work belongs to `gitea-branches` (Gitea-side) or
|
|
||||||
`git-branches` (working copy).
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-issues
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe your task: list issues, create one, get/comment/close/label a specific issue number, or
|
|
||||||
search across repos. See `SKILL.md`'s dispatch table for the full set of recognized invocations.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — dispatch table, Gotchas |
|
|
||||||
| `references/issues.md` | Verified call signatures and mechanics for `list_issues`/`issue_read`/`issue_write` |
|
|
||||||
| `references/search.md` | Verified call signature and mechanics for `search_issues` |
|
|
||||||
| `references/enrichments.md` | Create-flow enrichments — label inference, milestone assignment, assignee workaround, dependency-linking convention |
|
|
||||||
| `references/sources.md` | Research sources backing the issue guidance |
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# gitea-labels-milestones
|
|
||||||
|
|
||||||
Read and write Gitea labels and milestones, and resolve label/milestone identity for the skills that apply them to issues and PRs.
|
|
||||||
|
|
||||||
## What it does
|
|
||||||
|
|
||||||
This skill handles label and milestone CRUD (`label_read`/`label_write`, `milestone_read`/`milestone_write`) — listing repo or org labels, creating/editing/deleting a label, resolving a label name to the numeric ID required to apply it to an issue or PR, and listing/creating/updating/closing/deleting a milestone. It also owns label inference: mapping conversation context (bug report, feature request, urgency language) to this repo's `Kind/*`/`Priority/*`/`Status/*` taxonomy.
|
|
||||||
|
|
||||||
## Composition
|
|
||||||
|
|
||||||
This is a cross-cutting shared skill. `gitea-issues` and `gitea-prs` both compose it whenever they need to apply a label or assign a milestone, rather than duplicating label/milestone logic: they call in for name/title → ID resolution, then their own `issue_write`/`pull_request_write` calls apply the resolved IDs. The split is deliberate — identity resolution lives here once, and the write that attaches an ID to a specific issue or PR lives with the skill that owns that object.
|
|
||||||
|
|
||||||
That relationship is documented here rather than in the skill description, which is preloaded into every session and carries routing information only: an agent reaches this skill because the user asked about labels or milestones, not because two other skills call it.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```text
|
|
||||||
/gitea-labels-milestones
|
|
||||||
```
|
|
||||||
|
|
||||||
Describe the label or milestone task: list labels, resolve a name to an ID, create/edit/delete a label, or list/create/update/close/delete a milestone. For applying already-resolved labels or a milestone to a specific issue or PR, use `gitea-issues` or `gitea-prs` instead.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
|------|---------|
|
|
||||||
| `SKILL.md` | Skill instructions for agents — dispatch table and Gotchas |
|
|
||||||
| `references/labels.md` | Execution detail for `label_read`/`label_write` |
|
|
||||||
| `references/milestones.md` | Execution detail for `milestone_read`/`milestone_write` |
|
|
||||||
| `references/label-inference.md` | Context-pattern → `Kind/*`/`Priority/*`/`Status/*` label inference guide |
|
|
||||||
| `references/sources.md` | Research sources backing the label/milestone guidance |
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user