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
22 changed files with 734 additions and 864 deletions

View File

@@ -1,59 +1,59 @@
{ {
"name": "holocron", "name": "holocron",
"description": "AI development skills for Claude Code, and for GitHub Copilot through apm — factory, design, implement, review, and cross-cutting workflows.", "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": { "owner": {
"name": "Defame1297", "name": "Defame1297",
"email": "defame1297@rkdr.net", "email": "defame1297@rkdr.net",
"url": "https://git.dev.rkdr.net/Defame1297/" "url": "https://git.rkdr.net/Defame1297/"
}, },
"plugins": [ "plugins": [
{ {
"name": "kyberforge", "name": "kyberforge",
"description": "Skills and agents for creating, maintaining, and managing an apm plugin marketplace for Claude Code and GitHub Copilot.", "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", "category": "Developer Tools",
"source": "./plugins/kyberforge" "source": "./plugins/kyberforge"
}, },
{ {
"name": "bin", "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.", "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", "category": "Utilities",
"source": "./plugins/bin" "source": "./plugins/bin"
}, },
{ {
"name": "git", "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.", "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", "category": "Version Control",
"source": "./plugins/git" "source": "./plugins/git"
}, },
{ {
"name": "gitea", "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.", "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", "category": "Version Control",
"source": "./plugins/gitea" "source": "./plugins/gitea"
}, },
{ {
"name": "onedev", "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.", "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", "category": "Version Control",
"source": "./plugins/onedev" "source": "./plugins/onedev"
}, },
{ {
"name": "core", "name": "core",
"description": "Skills for authoring and auditing a repo's AGENTS.md and the provider adapter files that defer to it.", "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", "category": "Productivity",
"source": "./plugins/core" "source": "./plugins/core"
}, },
{ {
"name": "lint", "name": "lint",
"description": "Skills and agents for configuring and running linters.", "description": "Skills and agents for configuring and running linters.",
"version": "1.1.8", "version": "1.1.9",
"category": "Developer Tools", "category": "Developer Tools",
"source": "./plugins/lint" "source": "./plugins/lint"
} }

2
.gitmodules vendored
View File

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

View File

@@ -31,7 +31,7 @@ Fall back to raw shell only when no skill covers it.
- **`apm.lock.yaml` turning up modified is expected, not a bug.** kyberforge's `SessionStart` hook keeps the install current on launch and rewrites the lock in the process (ADR-0019). On `main`, commit or discard it deliberately. On a feature branch, discard it (`git checkout -- apm.lock.yaml`, then `apm install`). This keeps unrelated lock churn out of the branch diff and keeps `apm pack --check-clean` consistent with the committed lock. The session then runs the older `main` that the lock records, which is accepted on a branch, and the next session start refreshes again. - **`apm.lock.yaml` turning up modified is expected, not a bug.** kyberforge's `SessionStart` hook keeps the install current on launch and rewrites the lock in the process (ADR-0019). On `main`, commit or discard it deliberately. On a feature branch, discard it (`git checkout -- apm.lock.yaml`, then `apm install`). This keeps unrelated lock churn out of the branch diff and keeps `apm pack --check-clean` consistent with the committed lock. The session then runs the older `main` that the lock records, which is accepted on a branch, and the next session start refreshes again.
- **A `.apm/` edit is not live until it is on the remote's `main`.** The six dependencies resolve from the holocron remote, unpinned against the default branch, so pushing a feature branch does not deploy it (ADR-0019). `apm install` deploys from the lock; `apm update` is what re-resolves refs. - **A `.apm/` edit is not live until it is on the remote's `main`.** The six dependencies resolve from the holocron remote, unpinned against the default branch, so pushing a feature branch does not deploy it (ADR-0019). `apm install` deploys from the lock; `apm update` is what re-resolves refs.
- **No pre-push hook needs the network — once `apm install` has run.** Root `apm.yml`'s marketplace has no remote package entries, so every hook resolves locally. The guarantee is a property of a populated `apm_modules/`, not of the hook set: on a fresh clone `apm-audit-ci`'s `deployed-files-present` fails outright, and its `drift` and `config-consistency` install-replays have no cache to replay from and clone from the remote. Run `apm install` once on a new checkout and the offline guarantee holds from then on (`docs/spec/gates.md`, "Pushing without a network"). - **No pre-push hook needs the network — once `apm install` has run.** Root `apm.yml`'s marketplace has no remote package entries, so every hook resolves locally. The guarantee is a property of a populated `apm_modules/`, not of the hook set: on a fresh clone `apm-audit-ci`'s `deployed-files-present` fails outright, and its `drift` and `config-consistency` install-replays have no cache to replay from and clone from the remote. Run `apm install` once on a new checkout and the offline guarantee holds from then on (`docs/spec/gates.md`, "Pushing without a network").
- **This repo and OneDev are the only source of truth.** All project state, decisions, and working conventions live here. Do not use an external memory system for this project — cached state diverges from the repo and you get a split brain. Before answering any design or architecture question, check `docs/adr/` for an existing decision. - **This repo and Gitea are the only source of truth.** All project state, decisions, and working conventions live here. Do not use an external memory system for this project — cached state diverges from the repo and you get a split brain. Before answering any design or architecture question, check `docs/adr/` for an existing decision.
## Key documents ## Key documents

View File

@@ -133,9 +133,8 @@ than to enumerate siblings. Detail: `factory-audit/references/skill-description-
_Avoid_: overlap, similar skill _Avoid_: overlap, similar skill
**Issue**: **Issue**:
The cross-provider term for a tracked unit of work. OneDev is this repo's canonical tracker The cross-provider term for a tracked unit of work. Gitea is this repo's canonical tracker
(ADR-0007, superseded by ADR-0029), but skills say "linked issue" generically rather than naming (ADR-0007), but skills say "linked issue" generically rather than naming a provider.
a provider.
_Avoid_: ticket, card, task _Avoid_: ticket, card, task
**Family prefix**: **Family prefix**:

File diff suppressed because it is too large Load Diff

22
apm.yml
View File

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

View File

@@ -1,7 +1,5 @@
# Gitea is the exclusive issue tracker — file-based fallback removed # Gitea is the exclusive issue tracker — file-based fallback removed
**Superseded by:** ADR-0029 (OneDev supersedes Gitea as this repo's canonical forge — this repo's own hosting, issue tracking, and PRs move to OneDev; `gitea/` continues to ship as a marketplace product regardless)
**Supersedes:** ADR-0011 (provider-agnostic issue tracker with file-based default — archived during refactoring) **Supersedes:** ADR-0011 (provider-agnostic issue tracker with file-based default — archived during refactoring)
> **Note on the ADR-0011 number.** Every "ADR-0011" on this page means the *archived* provider-agnostic issue tracker ADR, which no longer exists in `docs/adr/` — it was removed when it was superseded, and the number 0011 was later reused for an unrelated decision, `docs/adr/0011-gitea-skill-deep-modules.md` (the gitea skill's split into deep modules). That file is not the ADR referenced below. The number is not renumbered here: these ADRs are a published record and renumbering would break every citation that already points at either one. The archived text is recoverable from git history. > **Note on the ADR-0011 number.** Every "ADR-0011" on this page means the *archived* provider-agnostic issue tracker ADR, which no longer exists in `docs/adr/` — it was removed when it was superseded, and the number 0011 was later reused for an unrelated decision, `docs/adr/0011-gitea-skill-deep-modules.md` (the gitea skill's split into deep modules). That file is not the ADR referenced below. The number is not renumbered here: these ADRs are a published record and renumbering would break every citation that already points at either one. The archived text is recoverable from git history.

View File

@@ -1,43 +0,0 @@
# OneDev supersedes Gitea as this repo's canonical forge
**Supersedes:** ADR-0007 (Gitea as the exclusive issue tracker)
This repo's own hosting, issue tracking, and pull requests move from Gitea (`git.dev.rkdr.net`) to
OneDev (`onedev.dev.rkdr.net/Holocron`). Gitea is frozen and kept reachable read-only as a historical
archive rather than deleted, so commit messages, branch names, and ADRs that cite Gitea issue/PR
numbers (e.g. `#124`, `#140`) stay resolvable. `plugins/gitea/` is unaffected — it continues to ship
as a marketplace product for consumers with Gitea repos of their own; this decision is about what
*this* repo uses on itself, not what this repo authors and distributes.
## Considered and rejected
- **Preserving Gitea's issue/PR numbers in OneDev.** Rejected: OneDev issues and pull requests use
independent per-type counters, unlike Gitea's single shared sequence — there is no API path to
reproduce both simultaneously without a fragile create/delete padding hack. Migrated issues carry a
back-link to their original Gitea URL instead; new work uses OneDev's own numbers from the cutover
point forward.
- **Recreating historical PR objects (title/description/reviews) in OneDev.** Rejected for the
existing ~140 closed/merged PRs: `tod pr create` requires a live source branch, and Gitea already
deletes head branches on merge, so recreating them means resurrecting deleted branches from
merge-commit parent SHAs, opening throwaway PRs, and discarding them without merging (to avoid a
second, divergent merge commit alongside the mirrored git history). The git mirror already carries
every commit, message, author, and merge losslessly; the archived Gitea instance still holds the
original PR/review UI for anyone who needs it. Any PRs genuinely open and in flight at cutover time
are migrated for real, not archived.
- **Recreating Gitea's `Reviewed/*`, `Status/*`, and `Compat/Breaking` labels as new OneDev labels.**
Rejected in favor of OneDev's own out-of-the-box shape: structured `Type`/`Priority` fields (which
`Kind/*` and `Priority/*` map onto directly) plus the native three-state workflow (`Open` /
`In Progress` / `Closed`, no built-in disposition states). Disposition information that has no
native home becomes a one-line note in the migrated issue body instead of a second, parallel,
unstructured label taxonomy next to the real fields.
## Consequences
- Gitea issue/PR numbers cited in existing commit messages and docs remain valid only as long as the
archived Gitea instance stays reachable; they are not remapped to OneDev numbers anywhere.
- The six first-party `apm.yml` plugin dependencies (`git`, `gitea`, `kyberforge`, `lint`, `core`,
`bin`), previously resolved unpinned against `git@git.dev.rkdr.net:Defame1297/holocron.git`, are
repointed to the OneDev remote as part of this migration — apm's own dependency resolution must
track the now-canonical remote, not a frozen archive.
- `AGENTS.md`'s "this repo and Gitea are the only source of truth" language is updated to name
OneDev.

View File

@@ -1,130 +0,0 @@
# Gitea → OneDev migration plan
Executes ADR-0029 (supersedes ADR-0007). Scope: this repo's own self-hosting only — git history,
issues, milestones, wiki (already mirrored), and this repo's own tooling config. `plugins/gitea/`
ships unchanged as a marketplace product. Historical PR objects and Gitea's exact issue/PR numbering
are explicitly not migrated (see ADR-0029's "Considered and rejected").
Source: `Defame1297/holocron` on `git.dev.rkdr.net`. Target: `Holocron` (project id 1, currently
empty) on `onedev.dev.rkdr.net`.
## Prerequisites
- [x] `tod` installed and configured — `~/.config/tod/config` already has `server-url` and
`access-token`; `~/.bashrc` sources `~/.config/tod/env` automatically (`set -a; . env; set +a`),
but non-interactive shells (scripts, CI, this tool) must source it explicitly per invocation.
- [x] OneDev project `Holocron` exists (`tod project get Holocron`), `codeManagement` /
`issueManagement` enabled, currently no `defaultBranch` (empty repo).
- [ ] **Gotcha to build scripts around:** `tod issue`/`tod pr` subcommands resolve their target
project from the working directory's git remote, not from `--project` (verified — `--project`
is accepted by the flag parser but ignored; commands fail outside a repo with a OneDev remote).
Every migration script step below must run from inside a local clone with a remote pointing at
`onedev.dev.rkdr.net/Holocron`.
- [ ] Create the 7 OneDev **Iterations** (milestone equivalent) manually via the OneDev web UI —
`tod` has no iteration-create command. Names, verbatim, to match Gitea milestones for clean
`--iteration` references on migrated issues:
`Governance: enforcement`, `Kyberforge basics`, `Legacy / Triage`, `Road to homelab - prep`,
`Skills & Agents`, `The great refactoring`, `Tooling`.
- [ ] Freeze Gitea: stop merging PRs there once Phase 1 starts. Solo-maintainer repo, so this is just
"don't push to `git.dev.rkdr.net` after the mirror point."
## Phase 1 — Mirror git history (lossless, zero risk)
1. `git remote add onedev https://onedev.dev.rkdr.net/Holocron` in the local clone.
2. `git push onedev refs/heads/*:refs/heads/* refs/tags/*:refs/tags/*` (explicit branch+tag push,
not `--mirror` — avoids touching any Gitea-internal refs that aren't real branches).
3. Verify: `tod project get Holocron` shows `defaultBranch` populated; HEAD of `main` on OneDev
matches Gitea `main` HEAD (`d654dca...` as of this plan).
4. This alone carries every commit, author, message, and merge losslessly — nothing else in this
plan is required for code-level fidelity.
## Phase 2 — Issues (~95 total: 81 closed + 14 open across 7 milestones, per Gitea milestone counts)
Field mapping (OneDev's out-of-the-box `Type`/`Priority` fields, no new labels created):
| Gitea label | OneDev field |
|---|---|
| `Kind/Bug` | `Type: Bug` |
| `Kind/Feature` | `Type: New Feature` |
| `Kind/Enhancement` | `Type: Improvement` |
| `Kind/Documentation`, `Kind/Testing` | `Type: Task` |
| `Kind/Security` | `Type: Bug` |
| `Priority/Critical` | `Priority: Critical` |
| `Priority/High` | `Priority: Major` |
| `Priority/Medium` | `Priority: Normal` |
| `Priority/Low` | `Priority: Minor` |
| `Reviewed/*`, `Status/*`, `Compat/Breaking` | no field/state equivalent — fold into a one-line note in the migrated body |
State mapping: Gitea `open` → OneDev `Open` (default, no action); Gitea `closed` →
`tod issue change-state <ref> Closed`. OneDev's out-of-the-box workflow only has
Open/In Progress/Closed — no disposition states, confirmed by probing the live server.
Per issue:
5. `tod issue create "<title>" --field Type=<mapped> --field Priority=<mapped> --iteration "<milestone>" --description "<body>\n\n---\nMigrated from git.dev.rkdr.net/Defame1297/holocron/issues/<N>.[\nGitea disposition: <label>.]"`
6. Replay comments via `tod issue add-comment` (low effort, worth doing for continuity).
7. `tod issue change-state <new-ref> Closed` for originally-closed issues.
8. Spot-check a sample (e.g. 5 issues across different milestones) against the Gitea source.
Numbers will not match Gitea's (accepted — ADR-0029). Author/submitter on migrated issues will be
the migration token's own OneDev account, not the original Gitea author — no CLI-exposed way to
override this (the `onBehalfOf` field exists in OneDev's issue schema but isn't exposed through `tod`;
using it would mean raw, unverified REST calls, not worth it for this scope).
## Phase 3 — Pull requests
- **Currently-open PRs only** (check at execution time: `list_pull_requests state=open`): migrate for
real via `tod pr create`, since the source branch still exists. Add description, reviewers.
- **Closed/merged historical PRs (~140 of them): explicitly skipped.** Per ADR-0029, their content
survives losslessly in the Phase 1 git mirror; the archived Gitea instance remains the record for
anyone who wants the original review thread.
## Phase 4 — Releases
Git tags (`v1.0.0`, `v2.0.0`, `v2.0.1`) carry over automatically in Phase 1. OneDev has no confirmed
first-class "Release" object with a rendered markdown body the way Gitea does — this needs a quick
check against the live server before deciding further (not yet verified in this session). Fallback if
none exists: leave the 3 release-note bodies in the archived Gitea (read-only) and optionally fold
them into a `CHANGELOG.md` in the repo for local discoverability. **Flag this to the user before
executing Phase 4** — not fully resolved.
## Phase 5 — Wiki
Nothing to do. `docs/wiki/HUMANS.md` and `docs/wiki/Home.md` already mirror the two Gitea wiki pages
in-repo (confirmed identical), and OneDev has no separate wiki feature to migrate into (confirmed: no
wiki flag on the project object, no wiki REST resource). They travel with Phase 1 automatically.
## Phase 6 — Repo self-reference updates (code changes)
9. Repoint the six first-party `apm.yml` plugin dependencies (`git`, `gitea`, `kyberforge`, `lint`,
`core`, `bin`) from `git@git.dev.rkdr.net:Defame1297/holocron.git` to the OneDev remote.
10. Update `AGENTS.md`'s routing table (currently: *"Issues, PRs, labels, milestones →
`gitea-issues`, `gitea-prs`, `gitea-labels-milestones`..."*) to route this repo's own
issue/PR operations to the OneDev/tod skills instead (`using-tod` as the catch-all, plus
`work-on-issue`, `work-on-pull-request`, `submit-issue-work`, `submit-pull-request-work`). This
needs a deliberate mapping pass, not a mechanical find-replace — the tod skillset is
workflow-shaped, not CRUD-shaped like the gitea skills it replaces.
11. Update local `origin` remote to point at OneDev; rename the old one (e.g. `git remote rename
origin gitea-archive`) rather than deleting it.
12. Run `apm install` against the repointed remote and verify it resolves cleanly.
13. Sweep `README.md` and any other doc prose that names Gitea as *this repo's own* host (separate
from `plugins/gitea/`'s own product documentation, which is unaffected).
## Phase 7 — Freeze and archive Gitea
14. Set the Gitea repository to read-only/archived via the Gitea web UI (no MCP tool exposes this —
manual step).
## Verification checklist
- [ ] `tod project get Holocron` → `defaultBranch: main`, HEAD SHA matches Gitea's `main`.
- [ ] Issue count on OneDev matches Gitea's ~95 (open + closed).
- [ ] `apm install` succeeds from a fresh clone against the new remote.
- [ ] Pre-commit hooks (`pre-commit run --all-files`) pass in a fresh OneDev clone.
- [ ] Gitea repo is read-only; a test push to it fails as expected.
## Explicitly out of scope (deferred, per earlier decisions)
- `.onedev-buildspec.yml` / CI setup — no Gitea Actions exist today to migrate; separate follow-up
task via the `edit-build-spec` skill.
- Sunsetting `plugins/gitea/` as a marketplace product — agreed as a *later* phase, not part of this
migration.

View File

@@ -9,7 +9,7 @@ apm is the only supported install path (ADR-0024). Declare this package in the c
```yaml ```yaml
dependencies: dependencies:
apm: apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git - git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/bin path: plugins/bin
``` ```
@@ -19,7 +19,7 @@ Then:
apm install 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). **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 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. 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: author:
name: Defame1297 name: Defame1297
email: defame1297@rkdr.net email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/ url: https://git.rkdr.net/Defame1297/
license: MIT license: MIT
homepage: 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.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/bin repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/bin
keywords: keywords:
- utility - utility
- diagnostics - diagnostics

View File

@@ -9,7 +9,7 @@ apm is the only supported install path (ADR-0024). Declare this package in the c
```yaml ```yaml
dependencies: dependencies:
apm: apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git - git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/core path: plugins/core
``` ```
@@ -19,7 +19,7 @@ Then:
apm install 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). **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 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. description: Skills for authoring and auditing a repo's AGENTS.md and the provider adapter files that defer to it.
author: author:
name: Defame1297 name: Defame1297
email: defame1297@rkdr.net email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/ url: https://git.rkdr.net/Defame1297/
license: MIT license: MIT
homepage: 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.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/core repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/core
keywords: keywords:
- agents-md - agents-md
- documentation - documentation

View File

@@ -9,7 +9,7 @@ apm is the only supported install path (ADR-0024). Declare this package in the c
```yaml ```yaml
dependencies: dependencies:
apm: apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git - git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/git path: plugins/git
``` ```
@@ -19,7 +19,7 @@ Then:
apm install 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). **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 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. 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: author:
name: Defame1297 name: Defame1297
email: defame1297@rkdr.net email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/ url: https://git.rkdr.net/Defame1297/
license: MIT license: MIT
homepage: 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.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/git repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/git
keywords: keywords:
- git - git
- vcs - vcs

View File

@@ -1,13 +1,13 @@
name: gitea 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. 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: author:
name: Defame1297 name: Defame1297
email: defame1297@rkdr.net email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/ url: https://git.rkdr.net/Defame1297/
license: MIT license: MIT
homepage: 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.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/gitea repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/gitea
keywords: keywords:
- gitea - gitea
- issues - issues

View File

@@ -9,7 +9,7 @@ apm is the only supported install path (ADR-0024). Declare this package in the c
```yaml ```yaml
dependencies: dependencies:
apm: apm:
- git: git@git.dev.rkdr.net:Defame1297/holocron.git - git: git@git.rkdr.net:Defame1297/holocron.git
path: plugins/kyberforge path: plugins/kyberforge
``` ```
@@ -19,7 +19,7 @@ Then:
apm install 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). **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 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. description: Skills and agents for creating, maintaining, and managing an apm plugin marketplace for Claude Code and GitHub Copilot.
author: author:
name: Defame1297 name: Defame1297
email: defame1297@rkdr.net email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/ url: https://git.rkdr.net/Defame1297/
license: MIT license: MIT
homepage: 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.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/kyberforge repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/kyberforge
keywords: keywords:
- marketplace - marketplace
- plugin - plugin

View File

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

View File

@@ -1,13 +1,13 @@
name: onedev 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. 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: author:
name: Defame1297 name: Defame1297
email: defame1297@rkdr.net email: defame1297@rkdr.net
url: https://git.dev.rkdr.net/Defame1297/ url: https://git.rkdr.net/Defame1297/
license: MIT license: MIT
homepage: 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.dev.rkdr.net/Defame1297/holocron/src/branch/main/plugins/onedev repository: https://git.rkdr.net/Defame1297/holocron/src/branch/main/plugins/onedev
keywords: keywords:
- onedev - onedev
- tod - tod

View File

@@ -46,6 +46,17 @@ fi
# which is ADR-0024 consequence 2 arriving here. Keeping the exclusion now is # 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. # 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 # 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 # it, the same universe the `git ls-files` grep below sees. Matched against
# absolute paths, `*/.claude/worktrees/*` excluded every file whenever the # absolute paths, `*/.claude/worktrees/*` excluded every file whenever the
@@ -61,6 +72,7 @@ done < <(
-not -path "*/.claude/worktrees/*" \ -not -path "*/.claude/worktrees/*" \
-not -path "*/apm_modules/*" \ -not -path "*/apm_modules/*" \
-not -path "*/.claude/skills/*" \ -not -path "*/.claude/skills/*" \
-not -path "*/build/*" \
| sort | sort
) )
@@ -99,7 +111,7 @@ if [[ -n "$GIT_TOPLEVEL" && "$GIT_TOPLEVEL" == "$REPO_ROOT" ]]; then
[[ -n "$f" ]] && EXPECTED_FILES+=("$REPO_ROOT/$f") [[ -n "$f" ]] && EXPECTED_FILES+=("$REPO_ROOT/$f")
done < <( done < <(
git -C "$REPO_ROOT" ls-files -- '*.bats' \ 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 | sort || true
) )
else else

View File

@@ -476,6 +476,40 @@ else
fail "the plan-shortfall run failed with the wrong count: $FAKE_OUT" fail "the plan-shortfall run failed with the wrong count: $FAKE_OUT"
fi 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 ""
echo "Results: $PASS passed, $FAIL failed" echo "Results: $PASS passed, $FAIL failed"
[[ $FAIL -eq 0 ]] [[ $FAIL -eq 0 ]]