5 Commits

Author SHA1 Message Date
f30fbacf14 Merge pull request 'chore: migrate git host from git.dev.rkdr.net to git.rkdr.net' (#142) from chore/git-host-migration into main
Reviewed-on: #142
2026-09-25 14:23:16 +00:00
f22836ff7e chore: merge main (bats build/ exclusion fix) into chore/git-host-migration 2026-09-25 14:15:22 +00:00
4357da5b4d Merge pull request 'fix(tests): exclude build/ from bats test discovery' (#141) from fix/bats-repo-root-resolution into main
Reviewed-on: #141
2026-09-25 14:13:20 +00:00
b6a5915520 fix(tests): exclude build/ from bats test discovery
Why
tests/run-bats.sh's discovery walk already excludes apm_modules/ and
.claude/skills/ because those hold apm-installed copies of the same
*.bats files one directory level shallower than their plugins/*/.apm/
source, which overshoots the hardcoded six-levels-up REPO_ROOT walk
each test's setup() does and fails to find the bats-support helper.
build/ was missing the same exclusion: apm pack stages an identical
copy under build/<package>-<version>/ before archiving, hitting the
exact same failure mode from a different apm subcommand. A stray
local `apm pack` run leaves that directory on disk (gitignored,
regenerable) and silently doubles the suite (846 tests instead of
423) with 423 of them failing.

Implementation Notes
Added `-not -path "*/build/*"` to the find walk and the matching
git ls-files grep exclusion, mirroring the existing apm_modules/ and
.claude/skills/ entries. Extended tests/test-run-bats.sh with a case
following the same pattern as the existing exclusion-bug fixtures.

Impact
Unblocks the run-tests pre-commit/pre-push hook for any checkout that
has ever run a bare `apm pack` locally.
2026-09-25 13:45:25 +00:00
025ad4a5af chore: migrate git host from git.dev.rkdr.net to git.rkdr.net
Why
The repo's git host moved from git.dev.rkdr.net to git.rkdr.net. The
`origin` remote was already repointed; this commit brings every
in-repo reference in line so cloning, submodule init, and apm install
all resolve against the new host.

Implementation Notes
- .gitmodules: docs/wiki submodule URL repointed (tests/* submodules
  stay on github.com, untouched).
- Root apm.yml: 7 dependency entries and marketplace.owner.url
  repointed; executables.allow key updated to kyberforge#2.0.1 to
  match kyberforge's bump below (scripts/check-executables-allow-sync.sh
  enforces this pairing).
- Each plugin's apm.yml (bin, core, git, gitea, kyberforge, lint,
  onedev): author.url/homepage/repository repointed. Per this repo's
  apm versioning policy, these fields compile verbatim into
  plugin.json, so each package took a patch version bump alongside
  the URL change.
- Root apm.yml version and marketplace.version bumped 0.5.0 -> 0.5.1
  to match (a marketplace-block field and every listed package's
  version moved).
- apm.lock.yaml regenerated via `apm install`; .claude-plugin/marketplace.json
  regenerated via `apm pack --marketplace=claude` so compiled output
  stays in sync with the manifests.

Impact
docs/adr/0015, 0017, and 0018 intentionally keep the old host in their
issue links and examples — they are historical decision records, not
live config. Verified clean: apm pack --check-clean, apm audit --ci,
check-executables-allow-sync.sh, and pre-commit --all-files all pass.
2026-09-25 13:15:25 +00:00
17 changed files with 731 additions and 685 deletions

View File

@@ -1,59 +1,59 @@
{
"name": "holocron",
"description": "AI development skills for Claude Code, and for GitHub Copilot through apm — factory, design, implement, review, and cross-cutting workflows.",
"version": "0.5.0",
"version": "0.5.1",
"owner": {
"name": "Defame1297",
"email": "defame1297@rkdr.net",
"url": "https://git.dev.rkdr.net/Defame1297/"
"url": "https://git.rkdr.net/Defame1297/"
},
"plugins": [
{
"name": "kyberforge",
"description": "Skills and agents for creating, maintaining, and managing an apm plugin marketplace for Claude Code and GitHub Copilot.",
"version": "2.0.0",
"version": "2.0.1",
"category": "Developer Tools",
"source": "./plugins/kyberforge"
},
{
"name": "bin",
"description": "Skills for everyday AI-assisted development work that is not tied to a single tool, forge or language, and has not yet been split into a focused plugin.",
"version": "1.1.8",
"version": "1.1.9",
"category": "Utilities",
"source": "./plugins/bin"
},
{
"name": "git",
"description": "Skills and agents for working with a local Git clone over the git wire protocol, and for authoring and running the pre-commit hooks that guard it.",
"version": "1.3.8",
"version": "1.3.9",
"category": "Version Control",
"source": "./plugins/git"
},
{
"name": "gitea",
"description": "Skills and agents for working with a Gitea forge through its HTTP API — the forge's own objects, as distinct from the local git clone.",
"version": "1.3.9",
"version": "1.3.10",
"category": "Version Control",
"source": "./plugins/gitea"
},
{
"name": "onedev",
"description": "Skills and agents for working with a OneDev forge through the TOD CLI — the forge's own objects, as distinct from the local git clone.",
"version": "0.1.0",
"version": "0.1.1",
"category": "Version Control",
"source": "./plugins/onedev"
},
{
"name": "core",
"description": "Skills for authoring and auditing a repo's AGENTS.md and the provider adapter files that defer to it.",
"version": "1.1.3",
"version": "1.1.4",
"category": "Productivity",
"source": "./plugins/core"
},
{
"name": "lint",
"description": "Skills and agents for configuring and running linters.",
"version": "1.1.8",
"version": "1.1.9",
"category": "Developer Tools",
"source": "./plugins/lint"
}

2
.gitmodules vendored
View File

@@ -12,4 +12,4 @@
ignore = dirty
[submodule "docs/wiki"]
path = docs/wiki
url = git@git.dev.rkdr.net:Defame1297/holocron.wiki.git
url = git@git.rkdr.net:Defame1297/holocron.wiki.git

File diff suppressed because it is too large Load Diff

22
apm.yml
View File

@@ -1,5 +1,5 @@
name: holocron
version: 0.5.0
version: 0.5.1
description: AI development skills for Claude Code, and for GitHub Copilot through apm — factory, design, implement, review, and cross-cutting workflows.
license: MIT
@@ -16,17 +16,17 @@ targets:
- claude
dependencies:
apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/bin
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/core
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/git
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/gitea
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/kyberforge
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/lint
# TOD's skills arrive transitively through this wrapper rather than as a
# direct entry, so the marketplace and this repo consume onedev by the same
@@ -38,7 +38,7 @@ dependencies:
# `apm install` fails, which includes the copy kyberforge's SessionStart
# hook runs on launch. Accepted deliberately: this branch is merging
# immediately.
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/onedev
mcp: []
@@ -61,7 +61,7 @@ dependencies:
# an apm mechanic.
executables:
allow:
kyberforge#2.0.0:
kyberforge#2.0.1:
hooks: true
bin: true
@@ -71,11 +71,11 @@ marketplace:
# top-level apm.yml description:/version: above are NOT inherited into the
# compiled output despite being used elsewhere (e.g. by `apm audit`).
description: AI development skills for Claude Code, and for GitHub Copilot through apm — factory, design, implement, review, and cross-cutting workflows.
version: 0.5.0
version: 0.5.1
owner:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
url: https://git.rkdr.net/Defame1297/
# Default tag pattern used to resolve version ranges for each package.
build:

View File

@@ -9,7 +9,7 @@ apm is the only supported install path (ADR-0024). Declare this package in the c
```yaml
dependencies:
apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/bin
```
@@ -19,7 +19,7 @@ Then:
apm install
```
The entry above is unpinned and tracks the remote's default branch — add `ref: <tag>` to pin a release. Registering the catalogue instead (`apm marketplace add git@git.dev.rkdr.net:Defame1297/holocron.git --name holocron`) gets you the `bin@holocron` short name, but writes to `~/.apm/marketplaces.json` at user scope; the git+path object needs nothing beyond the manifest.
The entry above is unpinned and tracks the remote's default branch — add `ref: <tag>` to pin a release. Registering the catalogue instead (`apm marketplace add git@git.rkdr.net:Defame1297/holocron.git --name holocron`) gets you the `bin@holocron` short name, but writes to `~/.apm/marketplaces.json` at user scope; the git+path object needs nothing beyond the manifest.
**Native plugin installs do not work.** This package ships no per-plugin manifest and no flat content directories, so a host that installs it natively gets zero skills — and Claude Code raises no error while doing it (ADR-0024).

View File

@@ -1,13 +1,13 @@
name: bin
version: 1.1.8
version: 1.1.9
description: Skills for everyday AI-assisted development work that is not tied to a single tool, forge or language, and has not yet been split into a focused plugin.
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
url: https://git.rkdr.net/Defame1297/
license: MIT
homepage: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/bin
repository: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/bin
homepage: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/bin
repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/bin
keywords:
- utility
- diagnostics

View File

@@ -9,7 +9,7 @@ apm is the only supported install path (ADR-0024). Declare this package in the c
```yaml
dependencies:
apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/core
```
@@ -19,7 +19,7 @@ Then:
apm install
```
The entry above is unpinned and tracks the remote's default branch — add `ref: <tag>` to pin a release. Registering the catalogue instead (`apm marketplace add git@git.dev.rkdr.net:Defame1297/holocron.git --name holocron`) gets you the `core@holocron` short name, but writes to `~/.apm/marketplaces.json` at user scope; the git+path object needs nothing beyond the manifest.
The entry above is unpinned and tracks the remote's default branch — add `ref: <tag>` to pin a release. Registering the catalogue instead (`apm marketplace add git@git.rkdr.net:Defame1297/holocron.git --name holocron`) gets you the `core@holocron` short name, but writes to `~/.apm/marketplaces.json` at user scope; the git+path object needs nothing beyond the manifest.
**Native plugin installs do not work.** This package ships no per-plugin manifest and no flat content directories, so a host that installs it natively gets zero skills — and Claude Code raises no error while doing it (ADR-0024).

View File

@@ -1,13 +1,13 @@
name: core
version: 1.1.3
version: 1.1.4
description: Skills for authoring and auditing a repo's AGENTS.md and the provider adapter files that defer to it.
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
url: https://git.rkdr.net/Defame1297/
license: MIT
homepage: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/core
repository: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/core
homepage: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/core
repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/core
keywords:
- agents-md
- documentation

View File

@@ -9,7 +9,7 @@ apm is the only supported install path (ADR-0024). Declare this package in the c
```yaml
dependencies:
apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/git
```
@@ -19,7 +19,7 @@ Then:
apm install
```
The entry above is unpinned and tracks the remote's default branch — add `ref: <tag>` to pin a release. Registering the catalogue instead (`apm marketplace add git@git.dev.rkdr.net:Defame1297/holocron.git --name holocron`) gets you the `git@holocron` short name, but writes to `~/.apm/marketplaces.json` at user scope; the git+path object needs nothing beyond the manifest.
The entry above is unpinned and tracks the remote's default branch — add `ref: <tag>` to pin a release. Registering the catalogue instead (`apm marketplace add git@git.rkdr.net:Defame1297/holocron.git --name holocron`) gets you the `git@holocron` short name, but writes to `~/.apm/marketplaces.json` at user scope; the git+path object needs nothing beyond the manifest.
**Native plugin installs do not work.** This package ships no per-plugin manifest and no flat content directories, so a host that installs it natively gets zero skills and zero agents — and Claude Code raises no error while doing it (ADR-0024).

View File

@@ -1,13 +1,13 @@
name: git
version: 1.3.8
version: 1.3.9
description: Skills and agents for working with a local Git clone over the git wire protocol, and for authoring and running the pre-commit hooks that guard it.
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
url: https://git.rkdr.net/Defame1297/
license: MIT
homepage: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/git
repository: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/git
homepage: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/git
repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/git
keywords:
- git
- vcs

View File

@@ -1,13 +1,13 @@
name: gitea
version: 1.3.9
version: 1.3.10
description: Skills and agents for working with a Gitea forge through its HTTP API — the forge's own objects, as distinct from the local git clone.
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
url: https://git.rkdr.net/Defame1297/
license: MIT
homepage: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/gitea
repository: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/gitea
homepage: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/gitea
repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/gitea
keywords:
- gitea
- issues

View File

@@ -9,7 +9,7 @@ apm is the only supported install path (ADR-0024). Declare this package in the c
```yaml
dependencies:
apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git
- git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/kyberforge
```
@@ -19,7 +19,7 @@ Then:
apm install
```
The entry above is unpinned and tracks the remote's default branch — add `ref: <tag>` to pin a release. Registering the catalogue instead (`apm marketplace add git@git.dev.rkdr.net:Defame1297/holocron.git --name holocron`) gets you the `kyberforge@holocron` short name, but writes to `~/.apm/marketplaces.json` at user scope; the git+path object needs nothing beyond the manifest.
The entry above is unpinned and tracks the remote's default branch — add `ref: <tag>` to pin a release. Registering the catalogue instead (`apm marketplace add git@git.rkdr.net:Defame1297/holocron.git --name holocron`) gets you the `kyberforge@holocron` short name, but writes to `~/.apm/marketplaces.json` at user scope; the git+path object needs nothing beyond the manifest.
**Native plugin installs do not work.** This package ships no per-plugin manifest and no flat content directories, so a host that installs it natively gets zero skills, agents and hooks — and Claude Code raises no error while doing it (ADR-0024).

View File

@@ -1,13 +1,13 @@
name: kyberforge
version: 2.0.0
version: 2.0.1
description: Skills and agents for creating, maintaining, and managing an apm plugin marketplace for Claude Code and GitHub Copilot.
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
url: https://git.rkdr.net/Defame1297/
license: MIT
homepage: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/kyberforge
repository: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/kyberforge
homepage: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/kyberforge
repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/kyberforge
keywords:
- marketplace
- plugin

View File

@@ -1,13 +1,13 @@
name: lint
version: 1.1.8
version: 1.1.9
description: Skills and agents for configuring and running linters.
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
url: https://git.rkdr.net/Defame1297/
license: MIT
homepage: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/lint
repository: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/lint
homepage: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/lint
repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/lint
keywords:
- lint
- style

View File

@@ -1,13 +1,13 @@
name: onedev
version: 0.1.0
version: 0.1.1
description: Skills and agents for working with a OneDev forge through the TOD CLI — the forge's own objects, as distinct from the local git clone.
author:
name: Defame1297
email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/
url: https://git.rkdr.net/Defame1297/
license: MIT
homepage: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/onedev
repository: https://git.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/onedev
homepage: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/onedev
repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/onedev
keywords:
- onedev
- tod

View File

@@ -46,6 +46,17 @@ fi
# which is ADR-0024 consequence 2 arriving here. Keeping the exclusion now is
# what stops that landing as a mystery double-run on the merge that enables it.
#
# build/ is excluded for the same reason again, one layer further out: `apm
# pack` stages a full copy of a package's tree (including its skills' tests/
# directories) under build/<package>-<version>/ before archiving it. Those
# staged .bats files carry the same six-levels-up REPO_ROOT walk-up as any
# other copy, which resolves past this repo's actual root and fails on a
# missing bats-support helper -- the same failure mode apm_modules/ and
# .claude/skills/ above already guard against, just from a different apm
# subcommand. build/ is gitignored and regenerated on demand, so nothing here
# depends on its contents; the exclusion only stops a stray local `apm pack`
# output from being discovered and double-run.
#
# The walk runs from inside REPO_ROOT so the exclusions match paths RELATIVE to
# it, the same universe the `git ls-files` grep below sees. Matched against
# absolute paths, `*/.claude/worktrees/*` excluded every file whenever the
@@ -61,6 +72,7 @@ done < <(
-not -path "*/.claude/worktrees/*" \
-not -path "*/apm_modules/*" \
-not -path "*/.claude/skills/*" \
-not -path "*/build/*" \
| sort
)
@@ -99,7 +111,7 @@ if [[ -n "$GIT_TOPLEVEL" && "$GIT_TOPLEVEL" == "$REPO_ROOT" ]]; then
[[ -n "$f" ]] && EXPECTED_FILES+=("$REPO_ROOT/$f")
done < <(
git -C "$REPO_ROOT" ls-files -- '*.bats' \
| grep -Ev '(^|/)tests/bats/|(^|/)test_helper/|(^|/)\.claude/worktrees/|(^|/)apm_modules/|(^|/)\.claude/skills/' \
| grep -Ev '(^|/)tests/bats/|(^|/)test_helper/|(^|/)\.claude/worktrees/|(^|/)apm_modules/|(^|/)\.claude/skills/|(^|/)build/' \
| sort || true
)
else

View File

@@ -476,6 +476,40 @@ else
fail "the plan-shortfall run failed with the wrong count: $FAKE_OUT"
fi
# --- 12. A build/ directory (apm pack's staging output) is excluded, the same
# way apm_modules/ and .claude/skills/ above are. A stray local `apm pack` run
# leaves build/<pkg>-<version>/ on disk holding a full copy of every packaged
# skill's tests/ directory, gitignored and regenerable, but discoverable by a
# bare `find` all the same. Those staged .bats files carry the same
# several-levels-up REPO_ROOT walk-up as any other copy, which overshoots this
# fixture's root, so an unexcluded build/ turns into the same
# bats-support-not-found failure apm_modules/ and .claude/skills/ already guard
# against -- this was caught live with 423 duplicate failures against a real
# checkout holding a stray build/holocron-*/ from an earlier `apm pack`.
echo ""
echo "--- a build/ directory holding staged .bats copies is excluded ---"
DIR12="$(make_fake_repo)"
FIXTURES+=("$DIR12")
seed_bats_files "$DIR12"
mkdir -p "$DIR12/build/some-pkg-1.0.0/tests"
printf '@test "staged" { false; }\n' > "$DIR12/build/some-pkg-1.0.0/tests/staged.bats"
install_stub_bats "$DIR12" <<'EOF'
#!/usr/bin/env bash
echo "1..1"
echo "ok 1 first"
exit 0
EOF
run_fake "$DIR12"
if [[ $FAKE_RC -ne 0 ]]; then
fail "a tree holding a build/ directory failed the run: $FAKE_OUT"
elif grep -q "build/some-pkg-1.0.0" <<< "$FAKE_OUT"; then
fail "a .bats file staged under build/ was discovered and run: $FAKE_OUT"
elif grep -q "^2 tests, 0 failures$" <<< "$FAKE_OUT"; then
pass "a build/ directory's staged .bats copies are excluded from discovery"
else
fail "the build/-exclusion run passed with an unexpected count: $FAKE_OUT"
fi
echo ""
echo "Results: $PASS passed, $FAIL failed"
[[ $FAIL -eq 0 ]]