docs: truth up the README against the tree and axskills #11

Merged
jercik merged 7 commits from docs/truth-up-readme into main 2026-08-02 05:27:56 +00:00
Owner

The README described a repository that no longer exists. Several claims were
stale; this brings the file back into agreement with the tree and with what
axskills and axrun actually do. Every external claim below was verified
against the axkit checkout, not against docs.

The rules/<category>/<rule>.md layout block is gone. There is no rules/
directory here — skills/ is the only one. The block is replaced by prose that
states the real boundary: axskills reads a source's rules/ tree recursively
and concatenates the selection into the agent's global or user rule file for
the run (appended to Claude's system prompt via --append-system-prompt-file,
reconciled into Codex's leased AGENTS.md), and it never overrides a
repository's committed AGENTS.md — that file stays owned by j4k-align
(packages/axskills/CONTEXT.md). This repository ships skills only, and the
source layout for one that does serve rules is documented in the axskills
README rather than paraphrased here.

The intro now states this repository's place in the estate — the shareable
skills live here, personal ones in j4k/setup-atlas, and a skill that only makes
sense inside one project belongs in that project — instead of describing this as
a source of "skills and rules". No skill count: nothing in .githooks/ or
.forgejo/workflows/ verifies one, so it would go stale on the next merge.
axskills list is the live census.

The throwaway-overlay sentence is retired. axskills no longer spawns a
per-run config overlay (axkit ADR 0004, superseded by 0008/0011). Replaced with
what actually happens: Claude is scoped in place against the real ~/.claude
(sync copying every skill here, skipping names that collide with your own),
Codex is reconciled into its leased config home, and those two are the only
wired interactive lanes. Headless delivery via axexec is universal rather than
a fallback — run-agent.ts calls installSelectionInto on every invocation
regardless of agent — except Cursor, which resolves skills only from the
workspace, so a selection for it is dropped.

The launch command is corrected and runnable. axskills run claude did not
exist — axskills has no run verb (select, list, show, fetch, sync)
and deliberately does not launch agents. A bare axrun -i claude does not work
either: interactive mode requires exactly one of --profile or
--vault-credential and otherwise exits 2
(packages/axrun/src/validate-interactive-options.ts:129-134). The usage block
now shows axrun -i claude --profile <id>.

Two smaller corrections found while verifying the above. The clone
paragraph was accurate about the effect but silent about an inconsistency:
axskills v0.6.0 still hard-codes j4k/agent-skills.git as its built-in
default source (fetch-source.ts:11), which the forge 301-redirects here — now
stated, and version-dated so it degrades into a historical note rather than
becoming wrong when the default is corrected upstream. And "Adding a skill"
claimed any run with --refresh picks up a new skill, which is wrong for
fetch (it always re-fetches and takes no such flag) and for axrun (the flag
is --refresh-skills); both corrected.

Docs only. This repository has no package.json gate; the pre-commit hook ran
clean on every commit.

The README described a repository that no longer exists. Several claims were stale; this brings the file back into agreement with the tree and with what `axskills` and `axrun` actually do. Every external claim below was verified against the axkit checkout, not against docs. **The `rules/<category>/<rule>.md` layout block is gone.** There is no `rules/` directory here — `skills/` is the only one. The block is replaced by prose that states the real boundary: `axskills` reads a source's `rules/` tree recursively and concatenates the selection into the agent's *global or user* rule file for the run (appended to Claude's system prompt via `--append-system-prompt-file`, reconciled into Codex's leased `AGENTS.md`), and it never overrides a repository's committed `AGENTS.md` — that file stays owned by `j4k-align` (`packages/axskills/CONTEXT.md`). This repository ships skills only, and the source layout for one that does serve rules is documented in the `axskills` README rather than paraphrased here. **The intro now states this repository's place in the estate** — the shareable skills live here, personal ones in `j4k/setup-atlas`, and a skill that only makes sense inside one project belongs in that project — instead of describing this as a source of "skills and rules". No skill count: nothing in `.githooks/` or `.forgejo/workflows/` verifies one, so it would go stale on the next merge. `axskills list` is the live census. **The throwaway-overlay sentence is retired.** axskills no longer spawns a per-run config overlay (axkit ADR 0004, superseded by 0008/0011). Replaced with what actually happens: Claude is scoped in place against the real `~/.claude` (`sync` copying every skill here, skipping names that collide with your own), Codex is reconciled into its leased config home, and those two are the only wired interactive lanes. Headless delivery via `axexec` is universal rather than a fallback — `run-agent.ts` calls `installSelectionInto` on every invocation regardless of agent — except Cursor, which resolves skills only from the workspace, so a selection for it is dropped. **The launch command is corrected and runnable.** `axskills run claude` did not exist — axskills has no `run` verb (`select`, `list`, `show`, `fetch`, `sync`) and deliberately does not launch agents. A bare `axrun -i claude` does not work either: interactive mode requires exactly one of `--profile` or `--vault-credential` and otherwise exits 2 (`packages/axrun/src/validate-interactive-options.ts:129-134`). The usage block now shows `axrun -i claude --profile <id>`. **Two smaller corrections found while verifying the above.** The clone paragraph was accurate about the effect but silent about an inconsistency: `axskills` v0.6.0 still hard-codes `j4k/agent-skills.git` as its built-in default source (`fetch-source.ts:11`), which the forge 301-redirects here — now stated, and version-dated so it degrades into a historical note rather than becoming wrong when the default is corrected upstream. And "Adding a skill" claimed any run with `--refresh` picks up a new skill, which is wrong for `fetch` (it always re-fetches and takes no such flag) and for `axrun` (the flag is `--refresh-skills`); both corrected. Docs only. This repository has no `package.json` gate; the pre-commit hook ran clean on every commit.
docs: drop the unimplemented rules layout from the README
All checks were successful
Node tests / node:test (pull_request) Successful in 18s
commit-msg / commitlint (pull_request) Successful in 28s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m54s
PR Review / forgejo-review-approach-3 generator (pull_request_target) Successful in 2m24s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Successful in 2m25s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 2m40s
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Successful in 2m43s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 4m29s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 4m51s
8119c50e84
The layout section documented a `rules/<category>/*.md` tree this repository
does not have. Per-run rule injection from a skill source is a planned axskills
channel, so the README now says so instead of describing it as present.

Also states the repository's place in the skill estate (30 shareable skills;
personal ones in j4k/setup-atlas), replaces the retired per-launch overlay
claim with the Codex leased-home scoping that replaced it, and corrects the
nonexistent `axskills run` command to `axrun -i`.
forgejo-actions left a comment

Approach review: The approach is sound. This is a focused docs-only correction that brings the README into agreement with the actual repository and the documented axkit decisions, and there's no materially better way to do it.

Verified against the working tree: the repository does contain exactly 30 skill directories under skills/ and no rules/ directory, so dropping the rules/<category>/<rule>.md block from the Layout section is factually correct rather than cosmetic. The added sentence noting rule injection is a planned channel (owned by j4k-align) keeps the removal honest instead of silently erasing the feature from the docs.

The three adjacent fixes are appropriate to bundle: they all concern the same README describing axskills' current behavior. Correcting axskills run claudeaxrun -i claude is necessary (axskills' own verbs are select/list/show/fetch/sync and it deliberately does not launch agents), and replacing the throwaway-overlay narrative for non-Claude agents with the real Codex lease flow matches ADR 0008. Adding the j4k/setup-atlas / repo-local-skill context makes the intro's "shareable half of the skill estate" framing accurate.

No alternative approach is warranted — these are accurate text corrections with no project utility or standard facility that would do this better, and no scaling or maintenance concern in the chosen design.

Approach review by Approach Review 3 (OpenCode Wafer) (GLM-5.2)

**Approach review:** The approach is sound. This is a focused docs-only correction that brings the README into agreement with the actual repository and the documented axkit decisions, and there's no materially better way to do it. Verified against the working tree: the repository does contain exactly 30 skill directories under `skills/` and no `rules/` directory, so dropping the `rules/<category>/<rule>.md` block from the Layout section is factually correct rather than cosmetic. The added sentence noting rule injection is a planned channel (owned by `j4k-align`) keeps the removal honest instead of silently erasing the feature from the docs. The three adjacent fixes are appropriate to bundle: they all concern the same README describing axskills' current behavior. Correcting `axskills run claude` → `axrun -i claude` is necessary (axskills' own verbs are `select`/`list`/`show`/`fetch`/`sync` and it deliberately does not launch agents), and replacing the throwaway-overlay narrative for non-Claude agents with the real Codex lease flow matches ADR 0008. Adding the `j4k/setup-atlas` / repo-local-skill context makes the intro's "shareable half of the skill estate" framing accurate. No alternative approach is warranted — these are accurate text corrections with no project utility or standard facility that would do this better, and no scaling or maintenance concern in the chosen design. _Approach review by Approach Review 3 (OpenCode Wafer) (GLM-5.2)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjgxMTljNTBlODQ5MmU4M2M0ZGE3MjExNzBjYjc4YjQwMjYzNjBlMmUiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtMyIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMjU0NiIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiJmY2M5NzI3Ni0zNTgyLTRiZDEtYTRkZS1jMjQ4NTQ4YjJiNjUifQ== -->
forgejo-actions left a comment

Approach review: Docs-only, and the approach is right. Deleting the rules/<category>/<rule>.md block rather than leaving it as aspirational documentation matches the tree (skills/ is the only directory here), and replacing it with one prose sentence marking per-run rule injection as a planned axskills channel keeps the recorded decision visible without implying a layout that a contributor could try to populate today. The other three corrections — the overlay sentence, axskills run claude -> axrun -i claude, and the estate framing — all move prose toward what the tooling actually does, which is the durable direction for a README that mirrors an external package's surface.

Spot-checked against the working tree: skills/ holds 30 entries, there is no rules/ directory, and the repo ships no run verb of its own to contradict the usage block.

One small maintenance note inline: this PR fixes README drift but introduces a new drift-prone fact.

Approach review by Claude Code Opus (opus)

**Approach review:** Docs-only, and the approach is right. Deleting the `rules/<category>/<rule>.md` block rather than leaving it as aspirational documentation matches the tree (`skills/` is the only directory here), and replacing it with one prose sentence marking per-run rule injection as a planned axskills channel keeps the recorded decision visible without implying a layout that a contributor could try to populate today. The other three corrections — the overlay sentence, `axskills run claude` -> `axrun -i claude`, and the estate framing — all move prose toward what the tooling actually does, which is the durable direction for a README that mirrors an external package's surface. Spot-checked against the working tree: `skills/` holds 30 entries, there is no `rules/` directory, and the repo ships no `run` verb of its own to contradict the usage block. One small maintenance note inline: this PR fixes README drift but introduces a new drift-prone fact. _Approach review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjgxMTljNTBlODQ5MmU4M2M0ZGE3MjExNzBjYjc4YjQwMjYzNjBlMmUiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMjU0NiIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiI3ZWM2OWJmZC0zYmJjLTRjOTgtOWFiYS1jNjRkMDEyZTYxMjQifQ== -->
README.md Outdated
@ -1,15 +1,18 @@
# agent-skills
Source of skills and rules delivered per-run into AI coding agents by
The shareable half of the skill estate: 30 skills delivered per-run into AI

Optional: the hardcoded 30 skills is the same class of drift this PR is removing — the immediately preceding commit added a skill, so the count is stale on the next merge and nothing in CI checks it. Since the sentence's actual job is to say what kind of skills live here versus j4k/setup-atlas, the number carries no weight: "The shareable half of the skill estate: skills delivered per-run into AI coding agents by ..." reads the same and never goes out of date. Keep the count only if you intend to generate or verify it.

Optional: the hardcoded `30 skills` is the same class of drift this PR is removing — the immediately preceding commit added a skill, so the count is stale on the next merge and nothing in CI checks it. Since the sentence's actual job is to say *what kind* of skills live here versus `j4k/setup-atlas`, the number carries no weight: "The shareable half of the skill estate: skills delivered per-run into AI coding agents by ..." reads the same and never goes out of date. Keep the count only if you intend to generate or verify it.
Author
Owner

Agreed, and fixed in acfc01d. The count was accurate (30 directories under skills/, each with a SKILL.md) but nothing enforces it — neither .githooks/pre-commit, .githooks/commit-msg, nor any workflow under .forgejo/workflows/ reads the README — so the next skill added silently falsifies it, which is exactly the drift class this PR exists to remove. Took the suggested wording verbatim: the intro now reads "The shareable half of the skill estate: skills delivered per-run into AI coding agents by …". No pre-commit census check added: the sentence's job is to place this repo in the estate, not to report one, and axskills list is already the live source of truth the README points at.

<!-- gh-feedback:reply-to:33076 --> Agreed, and fixed in acfc01d. The count was accurate (30 directories under `skills/`, each with a `SKILL.md`) but nothing enforces it — neither `.githooks/pre-commit`, `.githooks/commit-msg`, nor any workflow under `.forgejo/workflows/` reads the README — so the next skill added silently falsifies it, which is exactly the drift class this PR exists to remove. Took the suggested wording verbatim: the intro now reads "The shareable half of the skill estate: skills delivered per-run into AI coding agents by …". No pre-commit census check added: the sentence's job is to place this repo in the estate, not to report one, and `axskills list` is already the live source of truth the README points at.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Docs-only README correction. Verified the claims against the working tree: skills/ holds exactly 30 directories, each with a SKILL.md; there is no rules/ directory; and no other file in the repo still references the removed rules/<category>/<rule>.md layout. Nothing under .forgejo/, .githooks/, or scripts/ reads the README, so removing the block breaks no automation. The axskills/axrun command claims live in another repository and could not be verified here.

Found 1 low issue: the newly introduced hardcoded skill count will drift.

Code review by Claude Code Opus (opus)

**Summary:** Docs-only README correction. Verified the claims against the working tree: `skills/` holds exactly 30 directories, each with a `SKILL.md`; there is no `rules/` directory; and no other file in the repo still references the removed `rules/<category>/<rule>.md` layout. Nothing under `.forgejo/`, `.githooks/`, or `scripts/` reads the README, so removing the block breaks no automation. The `axskills`/`axrun` command claims live in another repository and could not be verified here. Found 1 low issue: the newly introduced hardcoded skill count will drift. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjgxMTljNTBlODQ5MmU4M2M0ZGE3MjExNzBjYjc4YjQwMjYzNjBlMmUiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0yIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNTQ2Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImU1YWNjYWU3LTU2ODktNDRjMi1hNmE3LTExZTgzNTM1ZGZiNyJ9 -->
README.md Outdated
@ -1,15 +1,18 @@
# agent-skills
Source of skills and rules delivered per-run into AI coding agents by
The shareable half of the skill estate: 30 skills delivered per-run into AI

🟢 Low: The hardcoded 30 skills is accurate right now (skills/ has exactly 30 directories, each with a SKILL.md), but it is a fact that goes stale on the very next merge — this same README's "Adding a skill" section invites contributors to add one, and nothing in .forgejo/, .githooks/, or scripts/ checks the number, so the drift will pass CI silently.

Since the sentence's real job is to place this repo within the estate rather than to report a census, dropping the count keeps it correct indefinitely:

The shareable half of the skill estate: skills delivered per-run into AI
coding agents by ...

If the count is deliberate signal, consider a README check in the pre-commit hook that recomputes it from skills/*/SKILL.md.

🟢 **Low:** The hardcoded `30 skills` is accurate right now (`skills/` has exactly 30 directories, each with a `SKILL.md`), but it is a fact that goes stale on the very next merge — this same README's "Adding a skill" section invites contributors to add one, and nothing in `.forgejo/`, `.githooks/`, or `scripts/` checks the number, so the drift will pass CI silently. Since the sentence's real job is to place this repo within the estate rather than to report a census, dropping the count keeps it correct indefinitely: ``` The shareable half of the skill estate: skills delivered per-run into AI coding agents by ... ``` If the count is deliberate signal, consider a `README` check in the pre-commit hook that recomputes it from `skills/*/SKILL.md`.
Author
Owner

Agreed, and fixed in acfc01d. The count was accurate (30 directories under skills/, each with a SKILL.md) but nothing enforces it — neither .githooks/pre-commit, .githooks/commit-msg, nor any workflow under .forgejo/workflows/ reads the README — so the next skill added silently falsifies it, which is exactly the drift class this PR exists to remove. Took the suggested wording verbatim: the intro now reads "The shareable half of the skill estate: skills delivered per-run into AI coding agents by …". No pre-commit census check added: the sentence's job is to place this repo in the estate, not to report one, and axskills list is already the live source of truth the README points at.

<!-- gh-feedback:reply-to:33078 --> Agreed, and fixed in acfc01d. The count was accurate (30 directories under `skills/`, each with a `SKILL.md`) but nothing enforces it — neither `.githooks/pre-commit`, `.githooks/commit-msg`, nor any workflow under `.forgejo/workflows/` reads the README — so the next skill added silently falsifies it, which is exactly the drift class this PR exists to remove. Took the suggested wording verbatim: the intro now reads "The shareable half of the skill estate: skills delivered per-run into AI coding agents by …". No pre-commit census check added: the sentence's job is to place this repo in the estate, not to report one, and `axskills list` is already the live source of truth the README points at.
jercik marked this conversation as resolved
forgejo-actions left a comment

Approach review: The approach is sound. This is a documentation-drift repair confined to README.md, and the framing choice is the right one: rather than silently deleting the rules/ block, it replaces the layout tree with reality (skills/ only) and keeps one sentence marking per-run rule injection as a planned axskills channel. That preserves the recorded decision without documenting a directory that does not exist. I confirmed against the working tree that there is no rules/ directory and that the only surviving rules/ references are skill-local paths inside skills/fastify-zod-reference/SKILL.md, which are unrelated to the repository-level layout and correctly left alone. Splitting the ownership boundary (shareable here, personal in j4k/setup-atlas, project-specific in the project) into the intro is also the correct place for it — it is the question a reader has before the layout section, not after.

One maintenance note, attached inline: the new intro hardcodes a skill count that nothing enforces, in a repository whose contents grow by design. That is the same class of drift this PR exists to fix.

No other material alternative. Corrections to the agent-lane description and the axskills run claudeaxrun -i claude fix are factual claims about an external package that I cannot verify from this repository, but they are not approach decisions.

Approach review by Claude Code Opus (opus)

**Approach review:** The approach is sound. This is a documentation-drift repair confined to `README.md`, and the framing choice is the right one: rather than silently deleting the `rules/` block, it replaces the layout tree with reality (`skills/` only) and keeps one sentence marking per-run rule injection as a planned axskills channel. That preserves the recorded decision without documenting a directory that does not exist. I confirmed against the working tree that there is no `rules/` directory and that the only surviving `rules/` references are skill-local paths inside `skills/fastify-zod-reference/SKILL.md`, which are unrelated to the repository-level layout and correctly left alone. Splitting the ownership boundary (shareable here, personal in `j4k/setup-atlas`, project-specific in the project) into the intro is also the correct place for it — it is the question a reader has before the layout section, not after. One maintenance note, attached inline: the new intro hardcodes a skill count that nothing enforces, in a repository whose contents grow by design. That is the same class of drift this PR exists to fix. No other material alternative. Corrections to the agent-lane description and the `axskills run claude` → `axrun -i claude` fix are factual claims about an external package that I cannot verify from this repository, but they are not approach decisions. _Approach review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjgxMTljNTBlODQ5MmU4M2M0ZGE3MjExNzBjYjc4YjQwMjYzNjBlMmUiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtc21hcnQtMiIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMjU0NiIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiI4ZmVmZjRhZi00OTU2LTRlZjctYTFiYS0xNDllY2JhN2YyNDYifQ== -->
README.md Outdated
@ -1,15 +1,18 @@
# agent-skills
Source of skills and rules delivered per-run into AI coding agents by
The shareable half of the skill estate: 30 skills delivered per-run into AI

The hardcoded 30 skills will drift. skills/ currently holds exactly 30 entries so the number is right today, but the count is not checked by anything — the workflows under .forgejo/workflows/ and the .githooks/pre-commit hook do not verify it, and history shows the drift already happening (feat: seed agent-skills source with 28 skills, then a skill added one commit before this PR). Every future skill addition silently falsifies the README line, which is the same failure mode this PR is repairing elsewhere in the file.

Consider dropping the number and letting axskills list be the source of truth ("The shareable half of the skill estate: skills delivered per-run…"), since the intro already points readers at that command. If the count is worth stating, it needs a check that fails when ls skills | wc -l disagrees with the README; otherwise the unenforced number is a liability rather than information.

The hardcoded `30 skills` will drift. `skills/` currently holds exactly 30 entries so the number is right today, but the count is not checked by anything — the workflows under `.forgejo/workflows/` and the `.githooks/pre-commit` hook do not verify it, and history shows the drift already happening (`feat: seed agent-skills source with 28 skills`, then a skill added one commit before this PR). Every future skill addition silently falsifies the README line, which is the same failure mode this PR is repairing elsewhere in the file. Consider dropping the number and letting `axskills list` be the source of truth ("The shareable half of the skill estate: skills delivered per-run…"), since the intro already points readers at that command. If the count is worth stating, it needs a check that fails when `ls skills | wc -l` disagrees with the README; otherwise the unenforced number is a liability rather than information.
Author
Owner

Agreed, and fixed in acfc01d. The count was accurate (30 directories under skills/, each with a SKILL.md) but nothing enforces it — neither .githooks/pre-commit, .githooks/commit-msg, nor any workflow under .forgejo/workflows/ reads the README — so the next skill added silently falsifies it, which is exactly the drift class this PR exists to remove. Took the suggested wording verbatim: the intro now reads "The shareable half of the skill estate: skills delivered per-run into AI coding agents by …". No pre-commit census check added: the sentence's job is to place this repo in the estate, not to report one, and axskills list is already the live source of truth the README points at.

<!-- gh-feedback:reply-to:33084 --> Agreed, and fixed in acfc01d. The count was accurate (30 directories under `skills/`, each with a `SKILL.md`) but nothing enforces it — neither `.githooks/pre-commit`, `.githooks/commit-msg`, nor any workflow under `.forgejo/workflows/` reads the README — so the next skill added silently falsifies it, which is exactly the drift class this PR exists to remove. Took the suggested wording verbatim: the intro now reads "The shareable half of the skill estate: skills delivered per-run into AI coding agents by …". No pre-commit census check added: the sentence's job is to place this repo in the estate, not to report one, and `axskills list` is already the live source of truth the README points at.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Docs-only change. Most of the drift fixes check out, but one newly added claim is inaccurate.

Verified against the working tree and the shipped @j4k/axskills v0.6.0 / axrun v6.0.0 CLIs:

  • No top-level rules/ directory exists here — removing it from the layout block reflects the actual tree.
  • axskills really has no run verb (it exposes select, list, show, fetch, sync), and axrun -i claude is valid (-i, --interactive runs claude or codex), so the usage correction is right.
  • skills/ holds exactly 30 directories, each with a SKILL.md.
  • The new "planned axskills channel" sentence is wrong: axskills already reads and delivers rules/ from a skill source.

Findings: 1 medium, 2 low.

Code review by Claude Code Opus (opus)

**Summary:** Docs-only change. Most of the drift fixes check out, but one newly added claim is inaccurate. Verified against the working tree and the shipped `@j4k/axskills` v0.6.0 / `axrun` v6.0.0 CLIs: - ✅ No top-level `rules/` directory exists here — removing it from the layout block reflects the actual tree. - ✅ `axskills` really has no `run` verb (it exposes `select`, `list`, `show`, `fetch`, `sync`), and `axrun -i claude` is valid (`-i, --interactive` runs claude or codex), so the usage correction is right. - ✅ `skills/` holds exactly 30 directories, each with a `SKILL.md`. - ❌ The new "planned axskills channel" sentence is wrong: axskills already reads and delivers `rules/` from a skill source. Findings: 1 medium, 2 low. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjgxMTljNTBlODQ5MmU4M2M0ZGE3MjExNzBjYjc4YjQwMjYzNjBlMmUiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNTQ2Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImIyNjc0MGNjLTJlOTEtNGE4Mi1hZGI1LTUxMWQzZDdkODZiMyJ9 -->
@ -18,23 +21,26 @@ skills/
<skill-name>/
SKILL.md # YAML frontmatter with `name` + `description`, then the skill body
<supporting files> # optional references, scripts, assets — copied verbatim
rules/

🟢 Low: The layout being deleted here was accurate, not aspirational. readRules walks rules/ recursively and keys each rule by its path relative to rules/, so <category>/<rule>.md is exactly the shape axskills consumes, and the concatenated into the agent's rules file comment matches what concatenate-rules.js does.

Given axskills would consume a rules/ tree here as-is (see the note on the new paragraph), dropping this leaves a contributor who wants to add one with no documented layout to follow. Keeping the block — marked as unused in this repository rather than removed — would preserve that guidance.

🟢 **Low:** The layout being deleted here was accurate, not aspirational. `readRules` walks `rules/` recursively and keys each rule by its path relative to `rules/`, so `<category>/<rule>.md` is exactly the shape axskills consumes, and the `concatenated into the agent's rules file` comment matches what `concatenate-rules.js` does. Given axskills would consume a `rules/` tree here as-is (see the note on the new paragraph), dropping this leaves a contributor who wants to add one with no documented layout to follow. Keeping the block — marked as unused in this repository rather than removed — would preserve that guidance.
Author
Owner

Your premise checks out — readRules really would consume a rules/ tree dropped in here — but I am keeping the block deleted, for three reasons.

  1. The Layout section describes this repository's tree, and this repository ships no rules by decision, not by omission. Shareable skills live here; committed agent instructions are j4k-align's (packages/axskills/CONTEXT.md:140-141: "the committed project file is j4k-align agents' job"). A block marked "unused here" still reads as an invitation, which is the outcome the split exists to prevent.

  2. The source format already has a documented owner, so nothing is lost. packages/axskills/README.md:124 states it directly: "expected layout per source is rules/<category>/*.md". Duplicating an external package's format spec into a consumer repo is the drift class this PR is removing — the copy here would go stale the moment axskills changed the shape.

  3. The deleted block slightly overstated the contract anyway. There is no category-level semantics in axskills: read-source.ts:87-88 keys a rule by path.relative(rulesDirectory, absolutePath) and selection is plain glob matching over that string (resolve-selection.ts:68, glob-match.ts). <category>/ is a convention the axskills README recommends, not a level the reader models — so the authoritative wording belongs there, not in a paraphrase here.

Clarification added rather than left implicit: the rewritten paragraph in 479a2f1 now links the axskills README as the place the layout is documented, so a contributor who wants to add a rules source is pointed at the spec instead of finding nothing. That was the real gap your note identified, and it is closed without re-documenting a directory this repository has decided not to have.

<!-- gh-feedback:reply-to:33092 --> Your premise checks out — `readRules` really would consume a `rules/` tree dropped in here — but I am keeping the block deleted, for three reasons. 1. The Layout section describes *this repository's* tree, and this repository ships no rules by decision, not by omission. Shareable skills live here; committed agent instructions are `j4k-align`'s (`packages/axskills/CONTEXT.md:140-141`: "the committed project file is `j4k-align agents`' job"). A block marked "unused here" still reads as an invitation, which is the outcome the split exists to prevent. 2. The source format already has a documented owner, so nothing is lost. `packages/axskills/README.md:124` states it directly: "expected layout per source is `rules/<category>/*.md`". Duplicating an external package's format spec into a consumer repo is the drift class this PR is removing — the copy here would go stale the moment axskills changed the shape. 3. The deleted block slightly overstated the contract anyway. There is no category-level semantics in axskills: `read-source.ts:87-88` keys a rule by `path.relative(rulesDirectory, absolutePath)` and selection is plain glob matching over that string (`resolve-selection.ts:68`, `glob-match.ts`). `<category>/` is a convention the axskills README recommends, not a level the reader models — so the authoritative wording belongs there, not in a paraphrase here. Clarification added rather than left implicit: the rewritten paragraph in 479a2f1 now links the `axskills` README as the place the layout is documented, so a contributor who wants to add a rules source is pointed at the spec instead of finding nothing. That was the real gap your note identified, and it is closed without re-documenting a directory this repository has decided not to have.
README.md Outdated
@ -1,15 +1,18 @@
# agent-skills
Source of skills and rules delivered per-run into AI coding agents by
The shareable half of the skill estate: 30 skills delivered per-run into AI

🟢 Low: 30 skills is a hardcoded count that will drift. It is correct right now (skills/ holds 30 directories, each with a SKILL.md), but the immediately preceding commit feat: add usage limit estimator skill is what made it 30, and the ## Adding a skill section actively invites more.

In a README whose stated purpose in this PR is removing stale claims, an exact count re-introduces the same class of drift. Omitting the number ("the shareable skills") keeps the sentence true without needing a follow-up edit each time a skill lands.

🟢 **Low:** `30 skills` is a hardcoded count that will drift. It is correct right now (`skills/` holds 30 directories, each with a `SKILL.md`), but the immediately preceding commit `feat: add usage limit estimator skill` is what made it 30, and the `## Adding a skill` section actively invites more. In a README whose stated purpose in this PR is removing stale claims, an exact count re-introduces the same class of drift. Omitting the number ("the shareable skills") keeps the sentence true without needing a follow-up edit each time a skill lands.
Author
Owner

Agreed, and fixed in acfc01d. The count was accurate (30 directories under skills/, each with a SKILL.md) but nothing enforces it — neither .githooks/pre-commit, .githooks/commit-msg, nor any workflow under .forgejo/workflows/ reads the README — so the next skill added silently falsifies it, which is exactly the drift class this PR exists to remove. Took the suggested wording verbatim: the intro now reads "The shareable half of the skill estate: skills delivered per-run into AI coding agents by …". No pre-commit census check added: the sentence's job is to place this repo in the estate, not to report one, and axskills list is already the live source of truth the README points at.

<!-- gh-feedback:reply-to:33093 --> Agreed, and fixed in acfc01d. The count was accurate (30 directories under `skills/`, each with a `SKILL.md`) but nothing enforces it — neither `.githooks/pre-commit`, `.githooks/commit-msg`, nor any workflow under `.forgejo/workflows/` reads the README — so the next skill added silently falsifies it, which is exactly the drift class this PR exists to remove. Took the suggested wording verbatim: the intro now reads "The shareable half of the skill estate: skills delivered per-run into AI coding agents by …". No pre-commit census check added: the sentence's job is to place this repo in the estate, not to report one, and `axskills list` is already the live source of truth the README points at.
jercik marked this conversation as resolved
README.md Outdated
@ -27,2 +27,4 @@
from the frontmatter is what the picker shows.
Per-run rule injection — rules served from a skill source to override a
repository's committed `AGENTS.md` for a single run — is a planned axskills

🟡 Medium: This says the rules channel is planned, but axskills already implements it.

In the shipped @j4k/axskills v0.6.0, read-source.js calls readRules(path.join(root, "rules")), walking rules/ recursively for .md files; concatenate-rules.js joins them into the agent's rules file; and assertSourceShape explicitly treats a source holding only a rules/ directory as valid. The CLI surfaces it too: axskills list --rules-only and axrun --rule <path> are both real, documented flags.

The accurate fact is narrower. axskills list --source . --rules-only against this checkout returns nothing — so this repository ships no rules yet, which is not the same as the channel being unimplemented. As written, the sentence would tell a contributor not to add a rules/ tree here, when axskills would in fact pick one up immediately.

The AGENTS.md-override semantics may well still be planned — axrun --help describes --rule as a "Global/user rule file", not a repo-AGENTS.md override — but the sentence conflates that open question with the delivery mechanism and lands on "planned" for both. Consider splitting them: rule delivery from a skill source is implemented; this repository just contributes no rules today; overriding a committed AGENTS.md is the part still to come.

🟡 **Medium:** This says the rules channel is *planned*, but axskills already implements it. In the shipped `@j4k/axskills` v0.6.0, `read-source.js` calls `readRules(path.join(root, "rules"))`, walking `rules/` recursively for `.md` files; `concatenate-rules.js` joins them into the agent's rules file; and `assertSourceShape` explicitly treats a source holding **only** a `rules/` directory as valid. The CLI surfaces it too: `axskills list --rules-only` and `axrun --rule <path>` are both real, documented flags. The accurate fact is narrower. `axskills list --source . --rules-only` against this checkout returns nothing — so *this repository ships no rules yet*, which is not the same as the channel being unimplemented. As written, the sentence would tell a contributor not to add a `rules/` tree here, when axskills would in fact pick one up immediately. The AGENTS.md-override *semantics* may well still be planned — `axrun --help` describes `--rule` as a "Global/user rule file", not a repo-AGENTS.md override — but the sentence conflates that open question with the delivery mechanism and lands on "planned" for both. Consider splitting them: rule delivery from a skill source is implemented; this repository just contributes no rules today; overriding a committed `AGENTS.md` is the part still to come.
Author
Owner

Agreed, and fixed in 479a2f1 — you are right that the sentence conflated the delivery mechanism with the override semantics, and that "planned" is wrong for the mechanism.

Verified against the axkit checkout (@j4k/axskills v0.6.0 source):

  • packages/axskills/src/read-source.ts:75-91readRules does readdir(rulesDirectory, { recursive: true, withFileTypes: true }) and keys each .md file by its POSIX path relative to rules/.
  • packages/axskills/src/fetch-source.ts:80-92assertSourceShape returns as soon as either skills/ or rules/ is a directory, so a rules-only source is valid exactly as you said.
  • src/concatenate-rules.ts joins the selected contents, and src/install-selection.ts + src/agent-install-targets.ts:14-45 deliver them to the agent's rule file.
  • src/cli.ts:52 has --rules-only; packages/axrun/src/cli.ts:49-54 has --rule <path>.

So the delivery channel ships, and the README no longer claims otherwise.

On the second half you flagged, the evidence goes further than "still to come" — it is deliberately out of scope. Every rules destination is joined to a config directory, never a repo: agent-install-targets.ts names CLAUDE.md/AGENTS.md/GEMINI.md relative to the agent config home; the Claude lane writes a temp file and passes --append-system-prompt-file (build-claude-args.ts:15-17), touching no repo file at all; the Codex lane writes $CODEX_HOME/AGENTS.md inside the leased home, which is Codex's user-global instructions file and does not shadow the working tree's. axskills' own CONTEXT.md:140-141 states the boundary: "the committed project file is j4k-align agents' job."

The paragraph now reads: the channel is implemented, it delivers into the agent's global/user rule file per run, it never overrides a repository's committed AGENTS.md, and that file stays owned by j4k-align. Your suggested three-way split, with the third part sharpened from "planned" to "owned elsewhere".

<!-- gh-feedback:reply-to:33091 --> Agreed, and fixed in 479a2f1 — you are right that the sentence conflated the delivery mechanism with the override semantics, and that "planned" is wrong for the mechanism. Verified against the axkit checkout (`@j4k/axskills` v0.6.0 source): - `packages/axskills/src/read-source.ts:75-91` — `readRules` does `readdir(rulesDirectory, { recursive: true, withFileTypes: true })` and keys each `.md` file by its POSIX path relative to `rules/`. - `packages/axskills/src/fetch-source.ts:80-92` — `assertSourceShape` returns as soon as *either* `skills/` or `rules/` is a directory, so a rules-only source is valid exactly as you said. - `src/concatenate-rules.ts` joins the selected contents, and `src/install-selection.ts` + `src/agent-install-targets.ts:14-45` deliver them to the agent's rule file. - `src/cli.ts:52` has `--rules-only`; `packages/axrun/src/cli.ts:49-54` has `--rule <path>`. So the delivery channel ships, and the README no longer claims otherwise. On the second half you flagged, the evidence goes further than "still to come" — it is deliberately out of scope. Every rules destination is joined to a *config* directory, never a repo: `agent-install-targets.ts` names `CLAUDE.md`/`AGENTS.md`/`GEMINI.md` relative to the agent config home; the Claude lane writes a temp file and passes `--append-system-prompt-file` (`build-claude-args.ts:15-17`), touching no repo file at all; the Codex lane writes `$CODEX_HOME/AGENTS.md` inside the leased home, which is Codex's user-global instructions file and does not shadow the working tree's. axskills' own `CONTEXT.md:140-141` states the boundary: "the committed project file is `j4k-align agents`' job." The paragraph now reads: the channel is implemented, it delivers into the agent's global/user rule file per run, it never overrides a repository's committed `AGENTS.md`, and that file stays owned by `j4k-align`. Your suggested three-way split, with the third part sharpened from "planned" to "owned elsewhere".
jercik marked this conversation as resolved
docs: drop the unenforced skill count from the intro
Some checks failed
Node tests / node:test (pull_request) Successful in 9s
commit-msg / commitlint (pull_request) Successful in 18s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m29s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / Dispatch and observe exact review writers (pull_request_target) Has been cancelled
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Has been cancelled
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Has been cancelled
acfc01dc3a
docs: state what the axskills rules channel actually does
All checks were successful
Node tests / node:test (pull_request) Successful in 14s
commit-msg / commitlint (pull_request) Successful in 28s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m58s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m24s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 6m51s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 7m17s
479a2f1eec
jercik changed title from docs: drop the unimplemented rules layout from the README to docs: truth up the README against the tree and axskills 2026-08-01 15:46:13 +00:00
Author
Owner

Replying to review #8215

Approach acknowledged — approach looks good, no alternative proposed, nothing to decide.

One correction from the code-review lane that lands on your reasoning: the "planned axskills channel" sentence you read as keeping the removal honest turned out to be inaccurate. axskills v0.6.0 already implements rules delivery (read-source.ts:75-91 walks rules/ recursively; fetch-source.ts:80-92 accepts a rules-only source). What is not implemented — and is in fact out of scope by design — is overriding a repository's committed AGENTS.md; every rules destination is joined to an agent config directory, never a repo. Rewritten in 479a2f1. The rest of your read stands, and the count you did not flag was dropped in acfc01d on four other reviewers' notes.

(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)

> Replying to review #8215 Approach acknowledged — approach looks good, no alternative proposed, nothing to decide. One correction from the code-review lane that lands on your reasoning: the "planned axskills channel" sentence you read as keeping the removal honest turned out to be inaccurate. `axskills` v0.6.0 already implements rules delivery (`read-source.ts:75-91` walks `rules/` recursively; `fetch-source.ts:80-92` accepts a rules-only source). What is not implemented — and is in fact out of scope by design — is overriding a repository's committed `AGENTS.md`; every rules destination is joined to an agent *config* directory, never a repo. Rewritten in 479a2f1. The rest of your read stands, and the count you did not flag was dropped in acfc01d on four other reviewers' notes. _(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)_
Author
Owner

Replying to review #8216

Approach acknowledged — approach looks good, no alternative proposed.

Your inline maintenance note was right and is fixed in acfc01d: the hardcoded count is gone, since nothing in .githooks/ or .forgejo/workflows/ verifies it and axskills list is already the live census.

One thing your spot-check could not see: the replacement sentence about rule injection being "planned" was itself wrong. axskills already reads and delivers a source's rules/ tree; only the committed-AGENTS.md override is out of scope, and it is owned by j4k-align rather than pending. Corrected in 479a2f1.

(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)

> Replying to review #8216 Approach acknowledged — approach looks good, no alternative proposed. Your inline maintenance note was right and is fixed in acfc01d: the hardcoded count is gone, since nothing in `.githooks/` or `.forgejo/workflows/` verifies it and `axskills list` is already the live census. One thing your spot-check could not see: the replacement sentence about rule injection being "planned" was itself wrong. axskills already reads and delivers a source's `rules/` tree; only the committed-`AGENTS.md` override is out of scope, and it is owned by `j4k-align` rather than pending. Corrected in 479a2f1. _(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)_
Author
Owner

Replying to review #8217

Summary acknowledged. Your one low finding is fixed in acfc01d — the count is dropped rather than checked, for the reasons in the inline reply.

Noting for the record that the claims you flagged as unverifiable from this repository ("The axskills/axrun command claims live in another repository") were verified against the axkit checkout while processing review #8221: the axskills verb set is exactly select/list/show/fetch/sync with no run verb (packages/axskills/src/cli.ts), and axrun -i claude is valid (packages/axrun/src/cli.ts:27-30). Both corrections in this PR hold.

(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)

> Replying to review #8217 Summary acknowledged. Your one low finding is fixed in acfc01d — the count is dropped rather than checked, for the reasons in the inline reply. Noting for the record that the claims you flagged as unverifiable from this repository ("The `axskills`/`axrun` command claims live in another repository") were verified against the axkit checkout while processing review #8221: the `axskills` verb set is exactly `select`/`list`/`show`/`fetch`/`sync` with no `run` verb (`packages/axskills/src/cli.ts`), and `axrun -i claude` is valid (`packages/axrun/src/cli.ts:27-30`). Both corrections in this PR hold. _(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)_
Author
Owner

Replying to review #8219

Approach acknowledged — approach looks good, no alternative proposed.

Your inline maintenance note is fixed in acfc01d: the unenforced count is gone.

Correction to one shared premise: the sentence marking per-run rule injection as a planned channel was inaccurate, which the code-review lane caught. axskills implements the delivery today; what it deliberately does not do is override a repository's committed AGENTS.md. Rewritten in 479a2f1, so the "preserves the recorded decision" framing you endorsed now rests on an accurate statement of it.

(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)

> Replying to review #8219 Approach acknowledged — approach looks good, no alternative proposed. Your inline maintenance note is fixed in acfc01d: the unenforced count is gone. Correction to one shared premise: the sentence marking per-run rule injection as a *planned* channel was inaccurate, which the code-review lane caught. axskills implements the delivery today; what it deliberately does not do is override a repository's committed `AGENTS.md`. Rewritten in 479a2f1, so the "preserves the recorded decision" framing you endorsed now rests on an accurate statement of it. _(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)_
Author
Owner

Replying to review #8221

Summary acknowledged, and the was the most valuable finding on this PR.

Disposition of the three findings:

  • Medium (rules channel "planned") — agreed, fixed in 479a2f1. Verified your evidence against the axkit checkout and it holds; the paragraph now separates the implemented delivery from the committed-AGENTS.md boundary, which is owned by j4k-align rather than pending.
  • Low (keep the layout block) — disagreed, with reasoning and a clarifying link added in 479a2f1.
  • Low (skill count) — agreed, fixed in acfc01d.

Your three verifications were independently confirmed and all hold.

(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)

> Replying to review #8221 Summary acknowledged, and the ❌ was the most valuable finding on this PR. Disposition of the three findings: - **Medium (rules channel "planned")** — agreed, fixed in 479a2f1. Verified your evidence against the axkit checkout and it holds; the paragraph now separates the implemented delivery from the committed-`AGENTS.md` boundary, which is owned by `j4k-align` rather than pending. - **Low (keep the layout block)** — disagreed, with reasoning and a clarifying link added in 479a2f1. - **Low (skill count)** — agreed, fixed in acfc01d. Your three ✅ verifications were independently confirmed and all hold. _(Reposted: the first attempt at this comment posted a literal file path because of a malformed API call. Same content, corrected.)_
forgejo-actions left a comment

Summary: No actionable issues found.

Docs-only change to README.md. I verified each corrected claim against the tree and against the installed @j4k/axskills (v0.6.0) / axrun (v6.0.0) CLIs rather than taking the PR description at face value:

  • No rules/ directory here — the working tree contains only skills/ (30 skill directories, each with a SKILL.md carrying name + description frontmatter), so dropping the rules/<category>/<rule>.md layout block matches reality.
  • Rules channel prose is accurateread-source.js reads a source's rules/ tree with readdir(..., { recursive: true }); prepare-claude-scoping.js concatenates the selection into a temp rules.md that build-claude-args.js passes via --append-system-prompt-file (system prompt, as stated); prepare-codex-scoping.js writes the target's AGENTS.md under the leased codexHome, so the "never overrides a repository's committed AGENTS.md" boundary holds.
  • axskills run claudeaxrun -i claudeaxskills --help lists exactly select, list, show, fetch, sync with no run verb, and axrun -i/--interactive documents itself as claude-or-codex only, which supports "Claude and Codex are the wired lanes".
  • Remaining commands still resolveaxskills list --source . is valid (--source exists on list), and the untouched "Adding a skill" line is still correct (sync/list accept --refresh).

No markdown lint or docs gate exists in .githooks/ or .forgejo/workflows/, so the "docs only, no package gate" note in the PR description also checks out.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. Docs-only change to `README.md`. I verified each corrected claim against the tree and against the installed `@j4k/axskills` (v0.6.0) / `axrun` (v6.0.0) CLIs rather than taking the PR description at face value: - **No `rules/` directory here** — the working tree contains only `skills/` (30 skill directories, each with a `SKILL.md` carrying `name` + `description` frontmatter), so dropping the `rules/<category>/<rule>.md` layout block matches reality. - **Rules channel prose is accurate** — `read-source.js` reads a source's `rules/` tree with `readdir(..., { recursive: true })`; `prepare-claude-scoping.js` concatenates the selection into a temp `rules.md` that `build-claude-args.js` passes via `--append-system-prompt-file` (system prompt, as stated); `prepare-codex-scoping.js` writes the target's `AGENTS.md` under the leased `codexHome`, so the "never overrides a repository's committed `AGENTS.md`" boundary holds. - **`axskills run claude` → `axrun -i claude`** — `axskills --help` lists exactly `select`, `list`, `show`, `fetch`, `sync` with no `run` verb, and `axrun -i/--interactive` documents itself as claude-or-codex only, which supports "Claude and Codex are the wired lanes". - **Remaining commands still resolve** — `axskills list --source .` is valid (`--source` exists on `list`), and the untouched "Adding a skill" line is still correct (`sync`/`list` accept `--refresh`). No markdown lint or docs gate exists in `.githooks/` or `.forgejo/workflows/`, so the "docs only, no package gate" note in the PR description also checks out. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjQ3OWEyZjFlZWM3YWFjOGIxNDcwMzEwYWU2MjExNzAzZmI1MjdhN2QiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNTk2Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImRjMGQ0YTY1LWYyMGUtNDc4My05YWNlLWM3OWIwNTk4MmYzZCJ9 -->
forgejo-actions left a comment

Summary: Found 1 medium and 1 low issue.

Code review by Codex GPT-5.6 SOL (gpt-5.6-sol)

**Summary:** Found 1 medium and 1 low issue. _Code review by Codex GPT-5.6 SOL (gpt-5.6-sol)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjQ3OWEyZjFlZWM3YWFjOGIxNDcwMzEwYWU2MjExNzAzZmI1MjdhN2QiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0yIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNTk2Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImZiZDFmOTVkLTNmZTEtNDM0ZS04ZDM0LTRhYWQ0N2ZmY2FhYyJ9 -->
README.md Outdated
@ -13,0 +12,4 @@
axskills-managed directories (tagged with an `.axskills-managed` marker, toggled
per run, pruned or updated by later syncs). For Codex, the selection is
reconciled into the leased config home that `axrun -i codex` launches against.
Claude and Codex are the wired lanes; the other agents are future work.

🟢 Low: Only the other interactive lanes are future work. Headless axexec already calls installSelectionInto for Gemini, OpenCode, and Copilot, with agent-specific skill and rule targets, so this unqualified sentence incorrectly says those integrations are unwired. Qualify the statement as interactive support, or mention the existing headless delivery path.

🟢 **Low:** Only the other *interactive* lanes are future work. Headless `axexec` already calls `installSelectionInto` for Gemini, OpenCode, and Copilot, with agent-specific skill and rule targets, so this unqualified sentence incorrectly says those integrations are unwired. Qualify the statement as interactive support, or mention the existing headless delivery path.
Author
Owner

Agreed, and fixed in a3ec02d. You are right that "future work" was unqualified and therefore wrong.

Confirmed the headless path exists and is wired for those agents:

  • packages/axexec/src/run-agent.ts:2,108 imports and calls installSelectionInto from @j4k/axskills.
  • packages/axskills/src/index.ts:4 documents that entry point as "The headless / Library path: axexec calls installSelectionInto to write the selection into a caller-isolated config directory".
  • packages/axskills/src/agent-install-targets.ts:14-45 gives gemini, opencode, and copilot real targets (skills subdir plus GEMINI.md / AGENTS.md / copilot-instructions.md); only cursor has neither, and its selection is dropped with a warning (install-selection.ts:61-78).

What is actually absent for those agents is the interactive lane — validate-interactive-options.ts:15 caps INTERACTIVE_AGENTS at ["claude", "codex"]. The sentence now reads: "Claude and Codex are the wired interactive lanes; the other agents are reached through axexec's headless delivery rather than an interactive launch." Took your first option (qualify as interactive) and your second (name the headless path) together, since the paragraph's subject is delivery.

<!-- gh-feedback:reply-to:33256 --> Agreed, and fixed in a3ec02d. You are right that "future work" was unqualified and therefore wrong. Confirmed the headless path exists and is wired for those agents: - `packages/axexec/src/run-agent.ts:2,108` imports and calls `installSelectionInto` from `@j4k/axskills`. - `packages/axskills/src/index.ts:4` documents that entry point as "The headless / Library path: axexec calls `installSelectionInto` to write the selection into a caller-isolated config directory". - `packages/axskills/src/agent-install-targets.ts:14-45` gives gemini, opencode, and copilot real targets (`skills` subdir plus `GEMINI.md` / `AGENTS.md` / `copilot-instructions.md`); only cursor has neither, and its selection is dropped with a warning (`install-selection.ts:61-78`). What is actually absent for those agents is the *interactive* lane — `validate-interactive-options.ts:15` caps `INTERACTIVE_AGENTS` at `["claude", "codex"]`. The sentence now reads: "Claude and Codex are the wired interactive lanes; the other agents are reached through `axexec`'s headless delivery rather than an interactive launch." Took your first option (qualify as interactive) and your second (name the headless path) together, since the paragraph's subject is delivery.
jercik marked this conversation as resolved
README.md Outdated
@ -36,2 +45,3 @@
# (axskills selects and delivers; axrun launches)
axskills select
axskills run claude
axrun -i claude

🟡 Medium: This launch command exits with status 2 on the current axrun CLI because interactive mode requires exactly one of --profile or --vault-credential. Readers therefore still cannot complete the documented workflow after the invalid axskills run command was removed. Show a runnable form such as axrun -i claude --profile <id>, and optionally document the vault-credential alternative.

🟡 **Medium:** This launch command exits with status 2 on the current `axrun` CLI because interactive mode requires exactly one of `--profile` or `--vault-credential`. Readers therefore still cannot complete the documented workflow after the invalid `axskills run` command was removed. Show a runnable form such as `axrun -i claude --profile <id>`, and optionally document the vault-credential alternative.
Author
Owner

Agreed, and fixed in a3ec02d. Verified against the axrun source rather than the help text:

packages/axrun/src/validate-interactive-options.ts:129-134

if (credential === undefined) {
  return {
    ok: false,
    message: "Error: interactive mode requires exactly one of --profile or --vault-credential.",
  };
}

The module doc-comment (line 3) confirms these are exit-2 errors, and the missing-agent branch at line 57 already spells the working form: Usage: axrun -i claude --profile <id>. So a bare axrun -i claude never launches — the usage block traded an invalid command for an incomplete one, which is worse than what the PR set out to fix.

The block now reads axrun -i claude --profile <id> with the alternative noted inline, since --profile and --vault-credential are mutually exclusive and exactly one is required (validate-interactive-options.ts:108-113).

<!-- gh-feedback:reply-to:33255 --> Agreed, and fixed in a3ec02d. Verified against the axrun source rather than the help text: `packages/axrun/src/validate-interactive-options.ts:129-134` ```ts if (credential === undefined) { return { ok: false, message: "Error: interactive mode requires exactly one of --profile or --vault-credential.", }; } ``` The module doc-comment (line 3) confirms these are exit-2 errors, and the missing-agent branch at line 57 already spells the working form: `Usage: axrun -i claude --profile <id>`. So a bare `axrun -i claude` never launches — the usage block traded an invalid command for an incomplete one, which is worse than what the PR set out to fix. The block now reads `axrun -i claude --profile <id>` with the alternative noted inline, since `--profile` and `--vault-credential` are mutually exclusive and exactly one is required (`validate-interactive-options.ts:108-113`).
jercik marked this conversation as resolved
docs: make the launch command runnable and scope the agent lanes
All checks were successful
Node tests / node:test (pull_request) Successful in 9s
commit-msg / commitlint (pull_request) Successful in 18s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m26s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m35s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 4m5s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 4m37s
a3ec02daee
Author
Owner

Replying to review #8242

Summary acknowledged — no actionable issues, and thank you for re-verifying each claim against the CLIs instead of the PR description. Your independent confirmation of the rewritten rules paragraph (read-source.js recursive read, --append-system-prompt-file for Claude, the leased codexHome AGENTS.md for Codex, and the "never overrides a repository's committed AGENTS.md" boundary) matches what I verified while processing review #8221.

Two things the parallel Codex lane caught that this pass did not, both fixed in a3ec02d:

  • axrun -i claude as written exits 2 — interactive mode requires exactly one of --profile or --vault-credential (validate-interactive-options.ts:129-134). Now axrun -i claude --profile <id>.
  • "the other agents are future work" was unqualified; axexec already delivers the same selection headlessly to Gemini, OpenCode, and Copilot. Now scoped to the interactive lanes.
> Replying to review #8242 Summary acknowledged — no actionable issues, and thank you for re-verifying each claim against the CLIs instead of the PR description. Your independent confirmation of the rewritten rules paragraph (`read-source.js` recursive read, `--append-system-prompt-file` for Claude, the leased `codexHome` `AGENTS.md` for Codex, and the "never overrides a repository's committed `AGENTS.md`" boundary) matches what I verified while processing review #8221. Two things the parallel Codex lane caught that this pass did not, both fixed in a3ec02d: - `axrun -i claude` as written exits 2 — interactive mode requires exactly one of `--profile` or `--vault-credential` (`validate-interactive-options.ts:129-134`). Now `axrun -i claude --profile <id>`. - "the other agents are future work" was unqualified; `axexec` already delivers the same selection headlessly to Gemini, OpenCode, and Copilot. Now scoped to the interactive lanes.
Author
Owner

Replying to review #8246

Summary acknowledged. Both findings were valid and both are fixed in a3ec02d — this was the most useful pass on the PR, since it caught that the corrected launch command still would not run.

  • Medium (launch command exits 2) — agreed and fixed; verified against validate-interactive-options.ts:129-134.
  • Low (other agents "future work") — agreed and fixed; verified against axexec/src/run-agent.ts:108 and agent-install-targets.ts:14-45.

Details in the inline replies.

> Replying to review #8246 Summary acknowledged. Both findings were valid and both are fixed in a3ec02d — this was the most useful pass on the PR, since it caught that the corrected launch command still would not run. - **Medium (launch command exits 2)** — agreed and fixed; verified against `validate-interactive-options.ts:129-134`. - **Low (other agents "future work")** — agreed and fixed; verified against `axexec/src/run-agent.ts:108` and `agent-install-targets.ts:14-45`. Details in the inline replies.
forgejo-actions left a comment

Summary: Docs-only change to README.md; no correctness, security, or integration defects found. One low-severity accuracy nit.

I verified each rewritten claim against the installed axkit packages rather than trusting the PR description:

  • No rules/ directory exists in the tree (skills/ only), so dropping the rules/<category>/<rule>.md layout block is correct.
  • axskills --help lists select, list, show, fetch, sync — there is no run verb, so replacing axskills run claude was necessary.
  • axrun -i interactive mode is limited to claude/codex (INTERACTIVE_AGENTS in validate-interactive-options.js) and exits with "interactive mode requires exactly one of --profile or --vault-credential", matching the new usage block and its inline comment.
  • Rules really are read recursively (readdir(rulesDirectory, { recursive: true })) and concatenated, delivered to Claude via --append-system-prompt-file and to Codex by reconciling the leased config home's AGENTS.md — the repo's committed AGENTS.md is untouched.
  • The axskills README does document the source layout (rules/<category>/*.md + skills/<name>/SKILL.md), so the pointer resolves to real content.
  • The built-in default source is https://code.j4k.dev/j4k/agent-skills.git, which 301-redirects to code.j4k.dev/j4k-oss/agent-skills (this repo's origin), so the retained "clones this repository" sentence still holds.

Code review by Claude Code Opus (opus)

**Summary:** Docs-only change to `README.md`; no correctness, security, or integration defects found. One low-severity accuracy nit. I verified each rewritten claim against the installed axkit packages rather than trusting the PR description: - No `rules/` directory exists in the tree (`skills/` only), so dropping the `rules/<category>/<rule>.md` layout block is correct. - `axskills --help` lists `select`, `list`, `show`, `fetch`, `sync` — there is no `run` verb, so replacing `axskills run claude` was necessary. - `axrun -i` interactive mode is limited to claude/codex (`INTERACTIVE_AGENTS` in `validate-interactive-options.js`) and exits with "interactive mode requires exactly one of --profile or --vault-credential", matching the new usage block and its inline comment. - Rules really are read recursively (`readdir(rulesDirectory, { recursive: true })`) and concatenated, delivered to Claude via `--append-system-prompt-file` and to Codex by reconciling the leased config home's `AGENTS.md` — the repo's committed `AGENTS.md` is untouched. - The `axskills` README does document the source layout (`rules/<category>/*.md` + `skills/<name>/SKILL.md`), so the pointer resolves to real content. - The built-in default source is `https://code.j4k.dev/j4k/agent-skills.git`, which 301-redirects to `code.j4k.dev/j4k-oss/agent-skills` (this repo's `origin`), so the retained "clones this repository" sentence still holds. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6ImEzZWMwMmRhZWVlZGUyYTZkNzhhZjkwODRiMThkNWY0OThkYjAxZDAiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNjI1Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjkzNWI0MzY2LTg0YmMtNGQyZC1hNzk4LTBjOTc5NDA3OTAzZSJ9 -->
README.md Outdated
@ -13,0 +12,4 @@
axskills-managed directories (tagged with an `.axskills-managed` marker, toggled
per run, pruned or updated by later syncs). For Codex, the selection is
reconciled into the leased config home that `axrun -i codex` launches against.
Claude and Codex are the wired interactive lanes; the other agents are reached

🟢 Low: "the other agents are reached through axexec's headless delivery" over-generalizes for cursor. In agent-install-targets.js cursor's skillsSubdir and rulesFile are both undefined, and the axskills README states cursor resolves skills and rules only from the workspace, so a cursor selection is dropped rather than installed — headless included. Gemini, opencode, and copilot do get headless delivery as described. Consider narrowing to something like "gemini, opencode, and copilot are reached through axexec's headless delivery; cursor resolves skills only from the workspace, so a selection for it is dropped."

🟢 **Low:** "the other agents are reached through `axexec`'s headless delivery" over-generalizes for cursor. In `agent-install-targets.js` cursor's `skillsSubdir` and `rulesFile` are both `undefined`, and the `axskills` README states cursor resolves skills and rules only from the workspace, so a cursor selection is dropped rather than installed — headless included. Gemini, opencode, and copilot do get headless delivery as described. Consider narrowing to something like "gemini, opencode, and copilot are reached through `axexec`'s headless delivery; cursor resolves skills only from the workspace, so a selection for it is dropped."
Author
Owner

Agreed, and fixed in a95488c. You are right that "the other agents" swept cursor in wrongly — I chose the shorter phrasing knowing cursor was an exception, and you correctly called that over-generalization.

Confirmed in packages/axskills/src/agent-install-targets.ts:47-52: cursor's skillsSubdir and rulesFile are both undefined, and install-selection.ts:61-78 drops the selection with a warning when both are absent — headless included, exactly as you say. Gemini, OpenCode, and Copilot do carry real targets (agent-install-targets.ts:26-45).

Took your suggested wording nearly verbatim: "Gemini, OpenCode, and Copilot are reached through axexec's headless delivery instead, and Cursor resolves skills only from the workspace, so a selection for it is dropped."

<!-- gh-feedback:reply-to:33311 --> Agreed, and fixed in a95488c. You are right that "the other agents" swept cursor in wrongly — I chose the shorter phrasing knowing cursor was an exception, and you correctly called that over-generalization. Confirmed in `packages/axskills/src/agent-install-targets.ts:47-52`: cursor's `skillsSubdir` and `rulesFile` are both `undefined`, and `install-selection.ts:61-78` drops the selection with a warning when both are absent — headless included, exactly as you say. Gemini, OpenCode, and Copilot do carry real targets (`agent-install-targets.ts:26-45`). Took your suggested wording nearly verbatim: "Gemini, OpenCode, and Copilot are reached through `axexec`'s headless delivery instead, and Cursor resolves skills only from the workspace, so a selection for it is dropped."
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Docs-only README change; no actionable defects found. I verified each external claim against the axkit packages installed in this environment (@j4k/axskills 0.6.0, @j4k/axrun 6.0.0, @j4k/axexec 13.0.1) rather than against docs:

  • axskills really has no run verb — select, list, show, fetch, sync are the whole surface, so replacing axskills run claude was a genuine fix.
  • Interactive mode really does require exactly one credential source: validate-interactive-options.js rejects both-set and neither-set with "interactive mode requires exactly one of --profile or --vault-credential", so axrun -i claude --profile <id> is the runnable form.
  • read-source.js reads rules/ with readdir(..., { recursive: true }) and filters to *.md, matching the new "reads a rules/ tree recursively" prose.
  • Claude rules are injected via --append-system-prompt-file (build-claude-args.js); Codex rules are reconciled into the leased CODEX_HOME's AGENTS.md (prepare-codex-scoping.js) — neither path touches a repo's committed AGENTS.md.
  • axrun --help states interactive mode is Claude/Codex only, and axexec's run-agent.js calls installSelectionInto on every headless invocation for all agents, matching the new lane sentence.
  • The tree has no rules/ directory, so dropping that layout block is correct.

git diff --check against origin/main is clean, and the removed fenced block left the code fence balanced.

Code review by Claude Code Opus (opus)

**Summary:** Docs-only README change; no actionable defects found. I verified each external claim against the axkit packages installed in this environment (`@j4k/axskills` 0.6.0, `@j4k/axrun` 6.0.0, `@j4k/axexec` 13.0.1) rather than against docs: - `axskills` really has no `run` verb — `select`, `list`, `show`, `fetch`, `sync` are the whole surface, so replacing `axskills run claude` was a genuine fix. - Interactive mode really does require exactly one credential source: `validate-interactive-options.js` rejects both-set and neither-set with "interactive mode requires exactly one of --profile or --vault-credential", so `axrun -i claude --profile <id>` is the runnable form. - `read-source.js` reads `rules/` with `readdir(..., { recursive: true })` and filters to `*.md`, matching the new "reads a `rules/` tree recursively" prose. - Claude rules are injected via `--append-system-prompt-file` (`build-claude-args.js`); Codex rules are reconciled into the leased `CODEX_HOME`'s `AGENTS.md` (`prepare-codex-scoping.js`) — neither path touches a repo's committed `AGENTS.md`. - `axrun --help` states interactive mode is Claude/Codex only, and `axexec`'s `run-agent.js` calls `installSelectionInto` on every headless invocation for all agents, matching the new lane sentence. - The tree has no `rules/` directory, so dropping that layout block is correct. `git diff --check` against `origin/main` is clean, and the removed fenced block left the code fence balanced. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6ImEzZWMwMmRhZWVlZGUyYTZkNzhhZjkwODRiMThkNWY0OThkYjAxZDAiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0yIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNjI1Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjI2MzBiZjM5LTBkZDYtNGNiOC04NTcyLTlkZjc5MzFiOTcwMCJ9 -->
@ -11,2 +10,2 @@
the other agents get a throwaway config overlay that exists only for the single
launch.
with git, caches it, and delivers the skills you select per agent launch. For
Claude, `axskills sync` copies every skill here into `~/.claude/skills` as

ℹ️ Info: "copies every skill here" is true of the common case but slightly overstates sync. plan-skill-sync.js routes a source skill whose name collides (case-insensitively) with one of the user's own unmanaged skills to conflict instead of write, and excludes managed skills that were hand-edited on disk from both write and remove. Since this PR is specifically about the README agreeing with what the tools do, "copies every skill here (skipping name collisions with your own skills)" would hold in those cases too. No change required if you consider the exception too narrow for the intro.

ℹ️ **Info:** "copies every skill here" is true of the common case but slightly overstates `sync`. `plan-skill-sync.js` routes a source skill whose name collides (case-insensitively) with one of the user's own unmanaged skills to `conflict` instead of `write`, and excludes managed skills that were hand-edited on disk from both `write` and `remove`. Since this PR is specifically about the README agreeing with what the tools do, "copies every skill here (skipping name collisions with your own skills)" would hold in those cases too. No change required if you consider the exception too narrow for the intro.
Author
Owner

Agreed, and fixed in a95488c — not too narrow for the intro, given that "the README agreeing with what the tools do" is this PR's entire premise. An exception the reader hits the first time they have a same-named skill of their own is worth six words.

Verified in packages/axskills/src/plan-skill-sync.ts:

  • line 42 — const conflict = sourceNames.filter((name) => unmanagedFolded.has(name.toLowerCase())).toSorted(); then line 43 puts those names in the skip set, so a source skill colliding with an unmanaged one is never written.
  • lines 40 and 36 — both the user-collision and hand-edited sets are case-folded, so the collision is case-insensitive as you described.
  • lines 46 and 49 — hand-edited managed skills are excluded from write and remove alike.

The sentence now ends "…, skipping any name that collides with one of your own skills." I left the hand-edited-managed carve-out out: it is a property of skills the reader themselves modified after a sync, not of what sync copies from here, and naming it in the intro would cost more than it explains.

<!-- gh-feedback:reply-to:33315 --> Agreed, and fixed in a95488c — not too narrow for the intro, given that "the README agreeing with what the tools do" is this PR's entire premise. An exception the reader hits the first time they have a same-named skill of their own is worth six words. Verified in `packages/axskills/src/plan-skill-sync.ts`: - line 42 — `const conflict = sourceNames.filter((name) => unmanagedFolded.has(name.toLowerCase())).toSorted();` then line 43 puts those names in the `skip` set, so a source skill colliding with an unmanaged one is never written. - lines 40 and 36 — both the user-collision and hand-edited sets are case-folded, so the collision is case-insensitive as you described. - lines 46 and 49 — hand-edited managed skills are excluded from `write` and `remove` alike. The sentence now ends "…, skipping any name that collides with one of your own skills." I left the hand-edited-managed carve-out out: it is a property of skills the reader themselves modified after a sync, not of what `sync` copies from here, and naming it in the intro would cost more than it explains.
jercik marked this conversation as resolved
docs: name the agent lanes precisely and note the sync collision skip
All checks were successful
Node tests / node:test (pull_request) Successful in 44s
commit-msg / commitlint (pull_request) Successful in 1m3s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m50s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 3m24s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 4m45s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 5m8s
a95488c5c9
Author
Owner

Replying to review #8253

Summary acknowledged. Your low nit was valid and is fixed in a95488c — cursor really is dropped rather than installed, and my shorter phrasing swept it in wrongly. Details in the inline reply.

Noting your extra verification of the default source redirect (code.j4k.dev/j4k/agent-skills.gitj4k-oss/agent-skills): that sentence was untouched by this PR, and confirming it still holds is exactly the check that keeps a truth-up pass from leaving a stale claim behind.

> Replying to review #8253 Summary acknowledged. Your low nit was valid and is fixed in a95488c — cursor really is dropped rather than installed, and my shorter phrasing swept it in wrongly. Details in the inline reply. Noting your extra verification of the default source redirect (`code.j4k.dev/j4k/agent-skills.git` → `j4k-oss/agent-skills`): that sentence was untouched by this PR, and confirming it still holds is exactly the check that keeps a truth-up pass from leaving a stale claim behind.
Author
Owner

Replying to review #8255

Summary acknowledged. Your info-level nit was worth acting on and is fixed in a95488c: plan-skill-sync.ts:42-43 does route a name colliding with an unmanaged skill to conflict rather than write, so "copies every skill here" overstated it. The intro now says "skipping any name that collides with one of your own skills". Details in the inline reply.

Thank you for verifying against the installed packages and for the git diff --check / fence-balance check on the removed block.

> Replying to review #8255 Summary acknowledged. Your info-level nit was worth acting on and is fixed in a95488c: `plan-skill-sync.ts:42-43` does route a name colliding with an unmanaged skill to `conflict` rather than `write`, so "copies every skill here" overstated it. The intro now says "skipping any name that collides with one of your own skills". Details in the inline reply. Thank you for verifying against the installed packages and for the `git diff --check` / fence-balance check on the removed block.
forgejo-actions left a comment

Summary: No actionable defects. 1 info note.

Docs-only change to README.md. I verified each new claim against the axkit packages installed in this environment (@j4k/axskills v0.6.0, @j4k/axrun v6.0.0) rather than against prose:

  • No rules/ directory exists in the tree (skills/ only), so dropping the rules/<category>/<rule>.md layout block is correct.
  • axskills has exactly the verbs select, list, show, fetch, sync — no run, so the old axskills run claude was unrunnable.
  • axrun -i requires exactly one of --profile / --vault-credential (dist/validate-interactive-options.js: "interactive mode requires exactly one of --profile or --vault-credential"), so the corrected usage line is right.
  • The sync collision skip is real: plan-skill-sync.js routes a source name that already exists unmanaged on disk to conflict, never write.
  • Cursor genuinely has no user-global target (agent-install-targets.js gives it skillsSubdir: undefined, rulesFile: undefined) and install-selection.js warns and delivers nothing for it.
  • Rules are read recursively (read-source.js uses readdir(..., { recursive: true })), appended to Claude's system prompt via --append-system-prompt-file (build-claude-args.js), and written into the agent's config directory — never the repository's committed AGENTS.md.
  • axrun -i is documented and implemented for claude and codex only; codex uses a leased config home (@j4k/axexec/dist/leased-codex-home.js).

One stale claim survives outside the diff, so I could not attach a line comment: the unchanged "Adding a skill" section (README.md:59) says "The next axskills fetch (or any run with --refresh) picks it up". axskills fetch accepts only --source and --config (it always re-fetches; --refresh exists on sync/list/select, not fetch), and the axrun flag is --refresh-skills, not --refresh. Worth folding into this pass since accuracy is its whole purpose.

Code review by Claude Code Opus (opus)

**Summary:** No actionable defects. 1 info note. Docs-only change to `README.md`. I verified each new claim against the axkit packages installed in this environment (`@j4k/axskills` v0.6.0, `@j4k/axrun` v6.0.0) rather than against prose: - No `rules/` directory exists in the tree (`skills/` only), so dropping the `rules/<category>/<rule>.md` layout block is correct. - `axskills` has exactly the verbs `select`, `list`, `show`, `fetch`, `sync` — no `run`, so the old `axskills run claude` was unrunnable. - `axrun -i` requires exactly one of `--profile` / `--vault-credential` (`dist/validate-interactive-options.js`: "interactive mode requires exactly one of --profile or --vault-credential"), so the corrected usage line is right. - The sync collision skip is real: `plan-skill-sync.js` routes a source name that already exists unmanaged on disk to `conflict`, never `write`. - Cursor genuinely has no user-global target (`agent-install-targets.js` gives it `skillsSubdir: undefined, rulesFile: undefined`) and `install-selection.js` warns and delivers nothing for it. - Rules are read recursively (`read-source.js` uses `readdir(..., { recursive: true })`), appended to Claude's system prompt via `--append-system-prompt-file` (`build-claude-args.js`), and written into the agent's *config* directory — never the repository's committed `AGENTS.md`. - `axrun -i` is documented and implemented for claude and codex only; codex uses a leased config home (`@j4k/axexec/dist/leased-codex-home.js`). One stale claim survives outside the diff, so I could not attach a line comment: the unchanged "Adding a skill" section (README.md:59) says "The next `axskills fetch` (or any run with `--refresh`) picks it up". `axskills fetch` accepts only `--source` and `--config` (it always re-fetches; `--refresh` exists on `sync`/`list`/`select`, not `fetch`), and the axrun flag is `--refresh-skills`, not `--refresh`. Worth folding into this pass since accuracy is its whole purpose. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6ImE5NTQ4OGM1YzllYTc2OWNjMDAxNWJlMmM5OWE3YzFkMWE4ZjM0YjkiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0yIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNjQzIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjVhYjBmYjlhLWY4MTctNDQzZi04ZTE4LTNhZjMwNTM1NzcyNSJ9 -->
README.md Outdated
@ -13,0 +13,4 @@
per run, pruned or updated by later syncs), skipping any name that collides with
one of your own skills. For Codex, the selection is reconciled into the leased
config home that `axrun -i codex` launches against. Claude and Codex are the
wired interactive lanes; Gemini, OpenCode, and Copilot are reached through

ℹ️ Info: "Gemini, OpenCode, and Copilot are reached through axexec's headless delivery instead" is accurate for those three, but "instead" can read as if Claude and Codex bypass that path. axexec's run-agent.js calls installSelectionInto on every headless invocation regardless of agent, so Claude and Codex use the same headless delivery too — they just additionally have a wired interactive lane. No change required.

ℹ️ **Info:** "Gemini, OpenCode, and Copilot are reached through `axexec`'s headless delivery instead" is accurate for those three, but "instead" can read as if Claude and Codex bypass that path. `axexec`'s `run-agent.js` calls `installSelectionInto` on every headless invocation regardless of agent, so Claude and Codex use the same headless delivery too — they just additionally have a wired interactive lane. No change required.
Author
Owner

Agreed and fixed in 19d8041, even though you marked it "no change required" — the ambiguity is real and the sentence is the one place a reader learns which lane serves which agent.

Confirmed your reading: packages/axexec/src/run-agent.ts:108 calls installSelectionInto on every headless invocation with no agent branch, so Claude and Codex ride the same headless path; what they have on top is the interactive lane (validate-interactive-options.ts:15, INTERACTIVE_AGENTS = ["claude", "codex"]).

Now reads: "Claude and Codex are the only wired interactive lanes; every agent is also served by axexec's headless delivery, except Cursor, which resolves skills only from the workspace, so a selection for it is dropped." That drops "instead", makes the headless path universal rather than a fallback, and keeps the Cursor carve-out you and the previous pass both asked for.

<!-- gh-feedback:reply-to:33346 --> Agreed and fixed in 19d8041, even though you marked it "no change required" — the ambiguity is real and the sentence is the one place a reader learns which lane serves which agent. Confirmed your reading: `packages/axexec/src/run-agent.ts:108` calls `installSelectionInto` on every headless invocation with no agent branch, so Claude and Codex ride the same headless path; what they have on top is the interactive lane (`validate-interactive-options.ts:15`, `INTERACTIVE_AGENTS = ["claude", "codex"]`). Now reads: "Claude and Codex are the only wired interactive lanes; every agent is also served by `axexec`'s headless delivery, except Cursor, which resolves skills only from the workspace, so a selection for it is dropped." That drops "instead", makes the headless path universal rather than a fallback, and keeps the Cursor carve-out you and the previous pass both asked for.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Docs-only change; found 1 low issue.

I verified each rewritten claim against the installed @j4k/axskills 0.6.0 and @j4k/axrun 6.0.0 packages rather than against docs:

  • No rules/ directory exists in the tree (skills/ only), so dropping the layout block is correct; readRules does read a source's rules/ tree recursively (readdir(..., { recursive: true })).
  • Rules delivery matches: Claude gets --append-system-prompt-file (build-claude-args.js), Codex gets AGENTS.md written into the leased config home (prepare-codex-scoping.js), and writeSelection only ever writes under the agent config directory — never a repository's committed AGENTS.md.
  • syncManagedSkills does skip names that already exist as your own skill (plan.conflict warning), matching the new collision-skip sentence.
  • Interactive mode is exactly claude and codex (INTERACTIVE_AGENTS), Cursor's install target has neither skillsSubdir nor rulesFile so its selection is dropped with a warning, and the other agents are reached through axexec's installSelectionInto.
  • The corrected usage line is runnable: axskills has no run verb (select, list, show, fetch, sync), axrun -i takes the agent as the positional, and validateInteractiveOptions rejects an invocation without exactly one of --profile / --vault-credential.

Code review by Claude Code Opus (opus)

**Summary:** Docs-only change; found 1 low issue. I verified each rewritten claim against the installed `@j4k/axskills` 0.6.0 and `@j4k/axrun` 6.0.0 packages rather than against docs: - No `rules/` directory exists in the tree (`skills/` only), so dropping the layout block is correct; `readRules` does read a source's `rules/` tree recursively (`readdir(..., { recursive: true })`). - Rules delivery matches: Claude gets `--append-system-prompt-file` (`build-claude-args.js`), Codex gets `AGENTS.md` written into the leased config home (`prepare-codex-scoping.js`), and `writeSelection` only ever writes under the agent config directory — never a repository's committed `AGENTS.md`. - `syncManagedSkills` does skip names that already exist as your own skill (`plan.conflict` warning), matching the new collision-skip sentence. - Interactive mode is exactly `claude` and `codex` (`INTERACTIVE_AGENTS`), Cursor's install target has neither `skillsSubdir` nor `rulesFile` so its selection is dropped with a warning, and the other agents are reached through `axexec`'s `installSelectionInto`. - The corrected usage line is runnable: `axskills` has no `run` verb (`select`, `list`, `show`, `fetch`, `sync`), `axrun -i` takes the agent as the positional, and `validateInteractiveOptions` rejects an invocation without exactly one of `--profile` / `--vault-credential`. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6ImE5NTQ4OGM1YzllYTc2OWNjMDAxNWJlMmM5OWE3YzFkMWE4ZjM0YjkiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNjQzIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjZjNWI0ZGRkLWFiMDktNGM5MS1hOTkwLWU2ODVhZTM4YzA2MCJ9 -->
README.md Outdated
@ -10,3 +10,1 @@
`.axskills-managed` marker, toggled per run, pruned or updated by later syncs);
the other agents get a throwaway config overlay that exists only for the single
launch.
with git, caches it, and delivers the skills you select per agent launch. For

🟢 Low: This sentence ("axskills clones this repository (j4k-oss/agent-skills on code.j4k.dev, main)") is the one remaining claim in the paragraph I could not confirm. axskills 0.6.0 hard-codes a different owner as its built-in default:

// dist/fetch-source.js
const DEFAULT_REMOTE = { url: "https://code.j4k.dev/j4k/agent-skills.git", ref: "main" };

and its own README repeats it: "When no sources are configured, the default is the public https://code.j4k.dev/j4k/agent-skills.git." This checkout's origin is https://code.j4k.dev/j4k-oss/agent-skills, so the built-in default points at j4k/agent-skills, not j4k-oss/agent-skills, and the clone only lands here for a user whose config.json lists this URL (or if the forge redirects the old path after a transfer).

Since the PR's stated goal is truthing the README against what axskills actually does, it's worth resolving: either correct the path here, note that the built-in default is j4k/agent-skills, or fix DEFAULT_REMOTE upstream if the repository moved.

🟢 **Low:** This sentence ("`axskills` clones this repository (`j4k-oss/agent-skills` on `code.j4k.dev`, `main`)") is the one remaining claim in the paragraph I could not confirm. `axskills` 0.6.0 hard-codes a different owner as its built-in default: ```js // dist/fetch-source.js const DEFAULT_REMOTE = { url: "https://code.j4k.dev/j4k/agent-skills.git", ref: "main" }; ``` and its own README repeats it: "When no sources are configured, the default is the public `https://code.j4k.dev/j4k/agent-skills.git`." This checkout's origin is `https://code.j4k.dev/j4k-oss/agent-skills`, so the built-in default points at `j4k/agent-skills`, not `j4k-oss/agent-skills`, and the clone only lands here for a user whose `config.json` lists this URL (or if the forge redirects the old path after a transfer). Since the PR's stated goal is truthing the README against what `axskills` actually does, it's worth resolving: either correct the path here, note that the built-in default is `j4k/agent-skills`, or fix `DEFAULT_REMOTE` upstream if the repository moved.
Author
Owner

Agreed, and fixed in 19d8041 — good catch, and the best kind for this PR: the README was accurate about the effect and silent about a real inconsistency.

Both halves verified:

  • packages/axskills/src/fetch-source.ts:11const DEFAULT_REMOTE = { url: "https://code.j4k.dev/j4k/agent-skills.git", ref: "main" };, used at line 30 when no source is configured. So the built-in default does name j4k/agent-skills, exactly as you quote.

  • The forge does resolve it here. Both the web path and the smart-HTTP path answer 301:

    • GET /j4k/agent-skills301https://code.j4k.dev/j4k-oss/agent-skills
    • GET /j4k/agent-skills.git/info/refs?service=git-upload-pack301https://code.j4k.dev/j4k-oss/agent-skills/info/refs?service=git-upload-pack

    git follows the redirect on the ref-discovery request, so a default-source clone does land in this repository — the previous pass's note that "clones this repository" still holds is right.

Took your second option (note the default) rather than the first or third: correcting the path here would make the README disagree with the shipped DEFAULT_REMOTE, and changing DEFAULT_REMOTE belongs in a j4k/axkit PR, not this docs pass. The paragraph now says the built-in default still names the pre-transfer j4k/agent-skills.git and that the forge 301-redirects it here, so the redirect is documented rather than load-bearing-but-invisible.

Also folded in the related staleness review #8258 raised outside the diff: the "Adding a skill" section claimed "any run with --refresh", which is wrong for fetch (only --source/--config; it always re-fetches) and for axrun (the flag is --refresh-skills). Both corrected in the same commit.

<!-- gh-feedback:reply-to:33353 --> Agreed, and fixed in 19d8041 — good catch, and the best kind for this PR: the README was accurate about the *effect* and silent about a real inconsistency. Both halves verified: - `packages/axskills/src/fetch-source.ts:11` — `const DEFAULT_REMOTE = { url: "https://code.j4k.dev/j4k/agent-skills.git", ref: "main" };`, used at line 30 when no source is configured. So the built-in default does name `j4k/agent-skills`, exactly as you quote. - The forge does resolve it here. Both the web path and the smart-HTTP path answer `301`: - `GET /j4k/agent-skills` → `301` → `https://code.j4k.dev/j4k-oss/agent-skills` - `GET /j4k/agent-skills.git/info/refs?service=git-upload-pack` → `301` → `https://code.j4k.dev/j4k-oss/agent-skills/info/refs?service=git-upload-pack` git follows the redirect on the ref-discovery request, so a default-source clone does land in this repository — the previous pass's note that "clones this repository" still holds is right. Took your second option (note the default) rather than the first or third: correcting the path here would make the README disagree with the shipped `DEFAULT_REMOTE`, and changing `DEFAULT_REMOTE` belongs in a j4k/axkit PR, not this docs pass. The paragraph now says the built-in default still names the pre-transfer `j4k/agent-skills.git` and that the forge 301-redirects it here, so the redirect is documented rather than load-bearing-but-invisible. Also folded in the related staleness review #8258 raised outside the diff: the "Adding a skill" section claimed "any run with `--refresh`", which is wrong for `fetch` (only `--source`/`--config`; it always re-fetches) and for `axrun` (the flag is `--refresh-skills`). Both corrected in the same commit.
jercik marked this conversation as resolved
docs: correct the default source, headless scope, and refresh flags
All checks were successful
Node tests / node:test (pull_request) Successful in 40s
commit-msg / commitlint (pull_request) Successful in 51s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m38s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 2m47s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 3m33s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 3m53s
19d8041aaa
Author
Owner

Replying to review #8258

Summary acknowledged. Both points are fixed in 19d8041.

Your inline info note about "instead" is addressed (details in the inline reply) — I made the change despite your "no change required", since the sentence is where a reader learns which lane serves which agent.

The out-of-diff staleness you could not attach a comment to was the more valuable find, and it is fixed too. Verified in packages/axskills/src/cli.ts: fetch declares only --source and --config, while --refresh is declared on select, list, show, and sync; packages/axrun/src/cli.ts:59 declares --refresh-skills. The "Adding a skill" section now names each accurately instead of saying "any run with --refresh". Thank you for folding it in rather than deferring it as out of scope — that is the right call for a pass whose whole purpose is accuracy.

> Replying to review #8258 Summary acknowledged. Both points are fixed in 19d8041. Your inline info note about "instead" is addressed (details in the inline reply) — I made the change despite your "no change required", since the sentence is where a reader learns which lane serves which agent. The out-of-diff staleness you could not attach a comment to was the more valuable find, and it is fixed too. Verified in `packages/axskills/src/cli.ts`: `fetch` declares only `--source` and `--config`, while `--refresh` is declared on `select`, `list`, `show`, and `sync`; `packages/axrun/src/cli.ts:59` declares `--refresh-skills`. The "Adding a skill" section now names each accurately instead of saying "any run with `--refresh`". Thank you for folding it in rather than deferring it as out of scope — that is the right call for a pass whose whole purpose is accuracy.
Author
Owner

Replying to review #8260

Summary acknowledged. Your low finding was the sharpest one on this PR and is fixed in 19d8041.

DEFAULT_REMOTE really does still name https://code.j4k.dev/j4k/agent-skills.git (packages/axskills/src/fetch-source.ts:11), and I confirmed the forge answers 301 on both the web path and the smart-HTTP ref-discovery path, redirecting to j4k-oss/agent-skills — so the clone does land here, but only via a redirect the README never mentioned. It now does. Details in the inline reply.

> Replying to review #8260 Summary acknowledged. Your low finding was the sharpest one on this PR and is fixed in 19d8041. `DEFAULT_REMOTE` really does still name `https://code.j4k.dev/j4k/agent-skills.git` (`packages/axskills/src/fetch-source.ts:11`), and I confirmed the forge answers `301` on both the web path and the smart-HTTP ref-discovery path, redirecting to `j4k-oss/agent-skills` — so the clone does land here, but only via a redirect the README never mentioned. It now does. Details in the inline reply.
forgejo-actions left a comment

Summary: No actionable issues found.

Docs-only change to README.md. I verified each factual claim against the installed axkit packages (@j4k/axskills 0.6.0, @j4k/axrun 6.0.0, @j4k/axexec) and this tree rather than trusting the PR description:

  • No run verb in axskills (select, list, show, fetch, sync) — the old axskills run claude line was indeed wrong.
  • axrun -i is claude/codex only, and interactive mode requires exactly one of --profile / --vault-credential (validate-interactive-options.js), so the corrected usage line is runnable.
  • Default remote is https://code.j4k.dev/j4k/agent-skills.git (fetch-source.js), and code.j4k.dev returns 301 to j4k-oss/agent-skills for both the web and info/refs paths — the redirect sentence holds.
  • fetch always passes refresh: true; --refresh exists on select, list, show, and sync; axrun exposes --refresh-skills.
  • sync skips names that collide with unmanaged (your own) skills and hand-edited managed ones (sync-managed-skills.js).
  • Cursor has no user-global skills/rules target and its selection is dropped (agent-install-targets.js, install-selection.js); rules are written into the run's config directory, never a repository AGENTS.md (write-selection.js).
  • rules/ is read recursively (read-source.js readdir({recursive:true})), and this repository has no rules/ directory, so removing the layout block matches the tree.
  • axskills list --source . runs clean here and lists the 30 skills under skills/.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. Docs-only change to `README.md`. I verified each factual claim against the installed axkit packages (`@j4k/axskills` 0.6.0, `@j4k/axrun` 6.0.0, `@j4k/axexec`) and this tree rather than trusting the PR description: - No `run` verb in `axskills` (`select`, `list`, `show`, `fetch`, `sync`) — the old `axskills run claude` line was indeed wrong. - `axrun -i` is claude/codex only, and interactive mode requires exactly one of `--profile` / `--vault-credential` (`validate-interactive-options.js`), so the corrected usage line is runnable. - Default remote is `https://code.j4k.dev/j4k/agent-skills.git` (`fetch-source.js`), and `code.j4k.dev` returns `301` to `j4k-oss/agent-skills` for both the web and `info/refs` paths — the redirect sentence holds. - `fetch` always passes `refresh: true`; `--refresh` exists on `select`, `list`, `show`, and `sync`; `axrun` exposes `--refresh-skills`. - `sync` skips names that collide with unmanaged (your own) skills and hand-edited managed ones (`sync-managed-skills.js`). - Cursor has no user-global skills/rules target and its selection is dropped (`agent-install-targets.js`, `install-selection.js`); rules are written into the run's config directory, never a repository `AGENTS.md` (`write-selection.js`). - `rules/` is read recursively (`read-source.js` `readdir({recursive:true})`), and this repository has no `rules/` directory, so removing the layout block matches the tree. - `axskills list --source .` runs clean here and lists the 30 skills under `skills/`. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjE5ZDgwNDFhYWFjZDhiZDg4NTRhMzYwY2VmNTFhN2M4NzNhYjVmYjUiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNjU0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjQ5YWI3ZDIxLTBhNmQtNGI1Ni1hY2RiLTY3OWVlNmI0OGFlMSJ9 -->
forgejo-actions left a comment

Summary: No actionable defects. Docs-only change to README.md; every external claim it makes was verified against the axkit CLIs available in this environment (@j4k/axskills v0.6.0, @j4k/axrun v6.0.0, @j4k/axexec), not against prose.

Verified:

  • No top-level rules/ tree exists — skills/ is the only source directory, so removing the rules/<category>/<rule>.md layout block is correct. (skills/verify-tests/rules/ and skills/typescript-magician/rules/ are per-skill supporting files, not a source rules tree, so "ships skills only" still holds.)
  • axskills has no run verb: select, list, show, fetch, sync only. --refresh exists on select, list, show, and sync but not on fetch, and commands/fetch.js calls resolveSource(spec, { refresh: true }) — so "it always re-fetches" is accurate. axrun --refresh-skills exists.
  • axrun -i claude --profile <id> is runnable: in interactive mode the positional argument is the agent (resolveAgent in validate-interactive-options.js), interactive agents are exactly claude and codex, and the code rejects both zero and two credential flags ("interactive mode requires exactly one of --profile or --vault-credential"). axrun's own error copy suggests this exact command.
  • Default remote is https://code.j4k.dev/j4k/agent-skills.git; a request to that URL returns 301 to https://code.j4k.dev/j4k-oss/agent-skills.
  • sync-managed-skills.js warns and skips a name that already exists as the user's own skill; agent-install-targets.js gives cursor skillsSubdir: undefined / rulesFile: undefined and install-selection.js drops its selection; axexec's run-agent.js calls installSelectionInto on every headless run for any agent; Claude rules go through --append-system-prompt-file and Codex's are a leased-config-home AGENTS.md, matching "global or user rule file".
  • axskills list --source . runs clean in this checkout and lists skills only.

Code review by Claude Code Opus (opus)

**Summary:** No actionable defects. Docs-only change to `README.md`; every external claim it makes was verified against the axkit CLIs available in this environment (`@j4k/axskills` v0.6.0, `@j4k/axrun` v6.0.0, `@j4k/axexec`), not against prose. Verified: - No top-level `rules/` tree exists — `skills/` is the only source directory, so removing the `rules/<category>/<rule>.md` layout block is correct. (`skills/verify-tests/rules/` and `skills/typescript-magician/rules/` are per-skill supporting files, not a source rules tree, so "ships skills only" still holds.) - `axskills` has no `run` verb: `select`, `list`, `show`, `fetch`, `sync` only. `--refresh` exists on `select`, `list`, `show`, and `sync` but not on `fetch`, and `commands/fetch.js` calls `resolveSource(spec, { refresh: true })` — so "it always re-fetches" is accurate. `axrun --refresh-skills` exists. - `axrun -i claude --profile <id>` is runnable: in interactive mode the positional argument is the agent (`resolveAgent` in `validate-interactive-options.js`), interactive agents are exactly claude and codex, and the code rejects both zero and two credential flags ("interactive mode requires exactly one of --profile or --vault-credential"). axrun's own error copy suggests this exact command. - Default remote is `https://code.j4k.dev/j4k/agent-skills.git`; a request to that URL returns `301` to `https://code.j4k.dev/j4k-oss/agent-skills`. - `sync-managed-skills.js` warns and skips a name that already exists as the user's own skill; `agent-install-targets.js` gives cursor `skillsSubdir: undefined` / `rulesFile: undefined` and `install-selection.js` drops its selection; `axexec`'s `run-agent.js` calls `installSelectionInto` on every headless run for any agent; Claude rules go through `--append-system-prompt-file` and Codex's are a leased-config-home `AGENTS.md`, matching "global or user rule file". - `axskills list --source .` runs clean in this checkout and lists skills only. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjE5ZDgwNDFhYWFjZDhiZDg4NTRhMzYwY2VmNTFhN2M4NzNhYjVmYjUiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0yIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNjU0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImE4NjhiZjUzLWJhZjYtNDkxMy05M2ZlLTM5ZGE1MDNhMjkwOSJ9 -->
README.md Outdated
@ -11,2 +10,2 @@
the other agents get a throwaway config overlay that exists only for the single
launch.
with git, caches it, and delivers the skills you select per agent launch. Its
built-in default source still names the pre-transfer `j4k/agent-skills.git`,

ℹ️ Info: No action needed — this is accurate today (fetch-source.js has DEFAULT_REMOTE = { url: "https://code.j4k.dev/j4k/agent-skills.git", ref: "main" } in axskills v0.6.0, and that URL returns 301 to /j4k-oss/agent-skills). Worth noting only that it pins a version-specific internal of another package, so it becomes wrong the moment axskills updates its default source — the same staleness class the PR body cites for omitting a skill count. The redirect note that follows keeps it harmless either way.

ℹ️ **Info:** No action needed — this is accurate today (`fetch-source.js` has `DEFAULT_REMOTE = { url: "https://code.j4k.dev/j4k/agent-skills.git", ref: "main" }` in axskills v0.6.0, and that URL returns `301` to `/j4k-oss/agent-skills`). Worth noting only that it pins a version-specific internal of another package, so it becomes wrong the moment axskills updates its default source — the same staleness class the PR body cites for omitting a skill count. The redirect note that follows keeps it harmless either way.
Author
Owner

Agreed on the reasoning, and acted on it in 6d71fb6 despite the "no action needed" — the staleness parallel you draw to the dropped skill count is exact, and it deserves the same treatment rather than a pass.

The two cases differ in one way that decides the remedy, though. The skill count was unenforced and unattributed: nothing owned it, so the only durable fix was deletion. This claim has an owner and a version — it is a statement about axskills, not about this repository — so it can be made durable by dating it instead of dropping it. Deleting it would cost a reader the explanation for why "clones this repository" is true when the default URL names a different path, which is exactly the kind of silent gap this PR exists to close.

So the sentence now reads "As of axskills v0.6.0 its built-in default source still names the pre-transfer j4k/agent-skills.git, which the forge 301-redirects here." If DEFAULT_REMOTE is corrected upstream, that stays a true statement about v0.6.0 and becomes prunable rather than wrong — and as you note, the redirect clause keeps the behaviour correct either way.

<!-- gh-feedback:reply-to:33390 --> Agreed on the reasoning, and acted on it in 6d71fb6 despite the "no action needed" — the staleness parallel you draw to the dropped skill count is exact, and it deserves the same treatment rather than a pass. The two cases differ in one way that decides the remedy, though. The skill count was *unenforced and unattributed*: nothing owned it, so the only durable fix was deletion. This claim has an owner and a version — it is a statement about `axskills`, not about this repository — so it can be made durable by dating it instead of dropping it. Deleting it would cost a reader the explanation for why "clones this repository" is true when the default URL names a different path, which is exactly the kind of silent gap this PR exists to close. So the sentence now reads "As of `axskills` v0.6.0 its built-in default source still names the pre-transfer `j4k/agent-skills.git`, which the forge 301-redirects here." If `DEFAULT_REMOTE` is corrected upstream, that stays a true statement about v0.6.0 and becomes prunable rather than wrong — and as you note, the redirect clause keeps the behaviour correct either way.
jercik marked this conversation as resolved
docs: date the default-source claim to the axskills version observed
All checks were successful
Node tests / node:test (pull_request) Successful in 20s
commit-msg / commitlint (pull_request) Successful in 27s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m29s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 3m28s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m52s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 4m9s
6d71fb6b35
Author
Owner

Replying to review #8264

Summary acknowledged — no actionable issues, and the independent re-verification of all eight claim families against the installed packages is exactly the check this PR needed. Nothing to change from this review.

Your confirmations that fetch always passes refresh: true, that --refresh lives on select/list/show/sync, and that axrun exposes --refresh-skills match what I verified while fixing the "Adding a skill" section in 19d8041.

> Replying to review #8264 Summary acknowledged — no actionable issues, and the independent re-verification of all eight claim families against the installed packages is exactly the check this PR needed. Nothing to change from this review. Your confirmations that `fetch` always passes `refresh: true`, that `--refresh` lives on `select`/`list`/`show`/`sync`, and that `axrun` exposes `--refresh-skills` match what I verified while fixing the "Adding a skill" section in 19d8041.
Author
Owner

Replying to review #8265

Summary acknowledged — no actionable defects. Your inline info note was worth acting on anyway and is addressed in 6d71fb6; reasoning in the inline reply.

Two of your checks are worth recording because they close gaps earlier passes left open: that skills/verify-tests/rules/ and skills/typescript-magician/rules/ are per-skill supporting files rather than a source rules tree (so "ships skills only" holds), and that axskills list --source . runs clean in this checkout listing skills only. Neither was verified in the earlier rounds.

> Replying to review #8265 Summary acknowledged — no actionable defects. Your inline info note was worth acting on anyway and is addressed in 6d71fb6; reasoning in the inline reply. Two of your checks are worth recording because they close gaps earlier passes left open: that `skills/verify-tests/rules/` and `skills/typescript-magician/rules/` are per-skill supporting files rather than a source rules tree (so "ships skills only" holds), and that `axskills list --source .` runs clean in this checkout listing skills only. Neither was verified in the earlier rounds.
forgejo-actions left a comment

Summary: No actionable issues found.

Docs-only change to README.md. I verified every rewritten claim against the axskills v0.6.0 / axrun v6.0.0 packages available in this environment and against the tree, rather than accepting the PR description:

  • No rules/ directory exists here; skills/ is the only content tree, so removing the rules/<category>/<rule>.md layout block is correct.
  • axskills has no run verb--help lists exactly select, list, show, fetch, sync. Replacing axskills run claude was a real correction.
  • axrun -i claude --profile <id> is runnable: validate-interactive-options.js rejects interactive mode without exactly one of --profile/--vault-credential, and INTERACTIVE_AGENTS is ["claude", "codex"], matching the "only wired interactive lanes" claim.
  • Refresh semantics hold: --refresh is present on select, list, show, and sync but not fetch, whose handler always calls resolveSource(spec, { refresh: true }) — so "it always re-fetches" is accurate. axrun --refresh-skills exists.
  • Default source claim holds: fetch-source.js still hardcodes https://code.j4k.dev/j4k/agent-skills.git, and a live request to that path returns 301 to /j4k-oss/agent-skills, so the version-dated sentence is correct as written.
  • Agent lanes hold: cursor is the one agent with neither skillsSubdir nor rulesFile in agent-install-targets.js, and install-selection.js drops its selection; axexec's run-agent.js installs the selection on every headless invocation for the rest.
  • Sync collision skip holds: sync-managed-skills.js skips directories lacking the .axskills-managed marker instead of clobbering them.
  • Rules boundary holds: rules land in configDirectory (write-selection.js), reaching Claude via --append-system-prompt-file and Codex via its leased AGENTS.md — never the repository's committed AGENTS.md.

One observation requiring no action: the "As of axskills v0.6.0" sentence is explicitly version-pinned, so it degrades into a dated historical note rather than becoming wrong once the default source is updated upstream.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. Docs-only change to `README.md`. I verified every rewritten claim against the axskills v0.6.0 / axrun v6.0.0 packages available in this environment and against the tree, rather than accepting the PR description: - **No `rules/` directory** exists here; `skills/` is the only content tree, so removing the `rules/<category>/<rule>.md` layout block is correct. - **`axskills` has no `run` verb** — `--help` lists exactly `select`, `list`, `show`, `fetch`, `sync`. Replacing `axskills run claude` was a real correction. - **`axrun -i claude --profile <id>` is runnable**: `validate-interactive-options.js` rejects interactive mode without exactly one of `--profile`/`--vault-credential`, and `INTERACTIVE_AGENTS` is `["claude", "codex"]`, matching the "only wired interactive lanes" claim. - **Refresh semantics hold**: `--refresh` is present on `select`, `list`, `show`, and `sync` but not `fetch`, whose handler always calls `resolveSource(spec, { refresh: true })` — so "it always re-fetches" is accurate. `axrun --refresh-skills` exists. - **Default source claim holds**: `fetch-source.js` still hardcodes `https://code.j4k.dev/j4k/agent-skills.git`, and a live request to that path returns `301` to `/j4k-oss/agent-skills`, so the version-dated sentence is correct as written. - **Agent lanes hold**: `cursor` is the one agent with neither `skillsSubdir` nor `rulesFile` in `agent-install-targets.js`, and `install-selection.js` drops its selection; `axexec`'s `run-agent.js` installs the selection on every headless invocation for the rest. - **Sync collision skip holds**: `sync-managed-skills.js` skips directories lacking the `.axskills-managed` marker instead of clobbering them. - **Rules boundary holds**: rules land in `configDirectory` (`write-selection.js`), reaching Claude via `--append-system-prompt-file` and Codex via its leased `AGENTS.md` — never the repository's committed `AGENTS.md`. One observation requiring no action: the "As of `axskills` v0.6.0" sentence is explicitly version-pinned, so it degrades into a dated historical note rather than becoming wrong once the default source is updated upstream. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjZkNzFmYjZiMzVjNjgyODdiN2U4YWYyNTM4NTllODEyOWI5NmVkZDgiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0yIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNjcxIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjM2YjUyYjM5LTM4YjYtNGY5NS1hZjJjLWRmYmZlNmY4YWE2YSJ9 -->
forgejo-actions left a comment

Summary: No actionable issues found.

Docs-only change to README.md. I verified every checkable claim against the working tree and the installed @j4k/axskills, @j4k/axrun, and @j4k/axexec v0.6.0 packages rather than against prose:

  • No rules/ directory exists in the tree (skills/ is the only source directory), so dropping the rules/<category>/<rule>.md layout block is correct.
  • axskills has no run verb — the commands are select, list, show, fetch, sync (dist/cli.js, dist/commands/), so replacing axskills run claude was a real fix.
  • axrun -i claude --profile <id> parses correctly: interactive mode takes the agent as the positional argument (resolveAgent(positional, agentFlag)), and validate-interactive-options.js rejects a missing credential with "interactive mode requires exactly one of --profile or --vault-credential" — matching axrun's own usage string.
  • INTERACTIVE_AGENTS = ["claude", "codex"] confirms the two wired interactive lanes; prepare-interactive-material.js shows Codex reconciled into the leased CODEX_HOME.
  • Cursor: install-selection.js skips the source fetch and drops the selection for an agent with no user-global skills/rules target, and the axskills README documents cursor as workspace-only — the README wording matches.
  • Sync details hold: .axskills-managed marker (managed-skills.js), and the collision skip warning ("already exists ... as your own skill; skipping") in sync-managed-skills.js.
  • Refresh semantics hold: commands/fetch.js always passes refresh: true, and --refresh is defined on exactly select, list, show, sync; axrun has --refresh-skills.
  • Rules channel: build-claude-args.js uses --append-system-prompt-file for Claude, agent-install-targets.js maps Codex to AGENTS.md, and write-selection.js writes only under the config directory — never into the repository, supporting the "never overrides a committed AGENTS.md" claim.
  • The default-source note is accurate: fetch-source.js still hardcodes https://code.j4k.dev/j4k/agent-skills.git. Pinning it to v0.6.0 is the right way to date a claim that will change upstream.

The only claims I could not verify from this environment are the j4k/setup-atlas placement convention, the forge's 301 redirect, and j4k-align's ownership of committed AGENTS.md files — all internal-convention statements, none contradicted by anything observable here.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. Docs-only change to `README.md`. I verified every checkable claim against the working tree and the installed `@j4k/axskills`, `@j4k/axrun`, and `@j4k/axexec` v0.6.0 packages rather than against prose: - No `rules/` directory exists in the tree (`skills/` is the only source directory), so dropping the `rules/<category>/<rule>.md` layout block is correct. - `axskills` has no `run` verb — the commands are `select`, `list`, `show`, `fetch`, `sync` (`dist/cli.js`, `dist/commands/`), so replacing `axskills run claude` was a real fix. - `axrun -i claude --profile <id>` parses correctly: interactive mode takes the agent as the positional argument (`resolveAgent(positional, agentFlag)`), and `validate-interactive-options.js` rejects a missing credential with "interactive mode requires exactly one of --profile or --vault-credential" — matching axrun's own usage string. - `INTERACTIVE_AGENTS = ["claude", "codex"]` confirms the two wired interactive lanes; `prepare-interactive-material.js` shows Codex reconciled into the leased `CODEX_HOME`. - Cursor: `install-selection.js` skips the source fetch and drops the selection for an agent with no user-global skills/rules target, and the axskills README documents cursor as workspace-only — the README wording matches. - Sync details hold: `.axskills-managed` marker (`managed-skills.js`), and the collision skip warning ("already exists ... as your own skill; skipping") in `sync-managed-skills.js`. - Refresh semantics hold: `commands/fetch.js` always passes `refresh: true`, and `--refresh` is defined on exactly `select`, `list`, `show`, `sync`; `axrun` has `--refresh-skills`. - Rules channel: `build-claude-args.js` uses `--append-system-prompt-file` for Claude, `agent-install-targets.js` maps Codex to `AGENTS.md`, and `write-selection.js` writes only under the config directory — never into the repository, supporting the "never overrides a committed `AGENTS.md`" claim. - The default-source note is accurate: `fetch-source.js` still hardcodes `https://code.j4k.dev/j4k/agent-skills.git`. Pinning it to v0.6.0 is the right way to date a claim that will change upstream. The only claims I could not verify from this environment are the `j4k/setup-atlas` placement convention, the forge's 301 redirect, and `j4k-align`'s ownership of committed `AGENTS.md` files — all internal-convention statements, none contradicted by anything observable here. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjExIiwiaGVhZFNoYSI6IjZkNzFmYjZiMzVjNjgyODdiN2U4YWYyNTM4NTllODEyOWI5NmVkZDgiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjEyNjcxIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjcxNmIzNGQ4LTdmMGMtNDlhNS05Mjg2LWMyMmQzYWI2ZDc5OSJ9 -->
Author
Owner

Replying to review #8272

Summary acknowledged — no actionable issues, and nothing to change. This is the clean round: every claim in the file has now been independently re-verified against the packages by two reviewers with no finding.

Your closing observation matches the intent of 6d71fb6 exactly: the version-pinned sentence is meant to degrade into a dated historical note rather than into a false claim, which is why it was dated rather than deleted.

> Replying to review #8272 Summary acknowledged — no actionable issues, and nothing to change. This is the clean round: every claim in the file has now been independently re-verified against the packages by two reviewers with no finding. Your closing observation matches the intent of 6d71fb6 exactly: the version-pinned sentence is meant to degrade into a dated historical note rather than into a false claim, which is why it was dated rather than deleted.
Author
Owner

Replying to review #8273

Summary acknowledged — no actionable issues, nothing to change.

On the three claims you could not verify from your environment: the 301 redirect is confirmed, and I checked it directly while fixing the default-source sentence. Both the web path and the smart-HTTP ref-discovery path answer 301:

  • GET /j4k/agent-skillshttps://code.j4k.dev/j4k-oss/agent-skills
  • GET /j4k/agent-skills.git/info/refs?service=git-upload-packhttps://code.j4k.dev/j4k-oss/agent-skills/info/refs?service=git-upload-pack

git follows the redirect on ref discovery, so a default-source clone does land in this repository. The other two — the j4k/setup-atlas placement convention and j4k-align's ownership of committed AGENTS.md files — are internal conventions; the second is stated in axskills' own CONTEXT.md ("the committed project file is j4k-align agents' job"), which is the source the rewritten rules paragraph is drawn from.

> Replying to review #8273 Summary acknowledged — no actionable issues, nothing to change. On the three claims you could not verify from your environment: the 301 redirect is confirmed, and I checked it directly while fixing the default-source sentence. Both the web path and the smart-HTTP ref-discovery path answer `301`: - `GET /j4k/agent-skills` → `https://code.j4k.dev/j4k-oss/agent-skills` - `GET /j4k/agent-skills.git/info/refs?service=git-upload-pack` → `https://code.j4k.dev/j4k-oss/agent-skills/info/refs?service=git-upload-pack` git follows the redirect on ref discovery, so a default-source clone does land in this repository. The other two — the `j4k/setup-atlas` placement convention and `j4k-align`'s ownership of committed `AGENTS.md` files — are internal conventions; the second is stated in axskills' own `CONTEXT.md` ("the committed project file is `j4k-align agents`' job"), which is the source the rewritten rules paragraph is drawn from.
jercik merged commit 8334a0efbc into main 2026-08-02 05:27:56 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
j4k-oss/agent-skills!11
No description provided.