2 Commits

Author SHA1 Message Date
Hoai Nam 717b4dc3d2 Merge pull request #29 from unclecatvn/fix/plugin-agents-discovery
fix: load the Odoo agents from the plugin — flat files in agents/ (1.0.17)
2026-09-11 17:21:35 +07:00
UncleCat 6c9a50acab fix: load the Odoo agents from the plugin (1.0.17)
`claude plugin details agent-skills` reported `Agents (0)` while all ten
skills loaded. Two causes, both confirmed with a throwaway probe plugin:

- The loader only reads flat `.md` files in `agents/`. Our reviewer and
  tracer lived at `agents/<name>/SKILL.md`, which is never scanned.
- `plugin.json` listed them under an `agents` key. That key *replaces*
  default discovery rather than extending it, so even a valid flat path
  in the list produced zero agents.

Moved both files next to `planner.md`, which was already flat, and
dropped the key. Verified from a directory-sourced marketplace:
`Agents (3)  odoo-code-tracer, odoo-code-review, planner`.

The validator assumed every entry under agents/ was a directory, so it
would have gone silent on the moved files; it now checks flat `.md`
files too.
2026-09-11 17:19:57 +07:00
8 changed files with 32 additions and 18 deletions
+2 -2
View File
@@ -7,14 +7,14 @@
},
"metadata": {
"description": "Domain-specific skills and specialized agents for Odoo development, code review, and professional workflows",
"version": "1.0.16"
"version": "1.0.17"
},
"plugins": [
{
"name": "agent-skills",
"source": "./",
"description": "Odoo 16-19 skill packs, the odoo-workflow pre-code gate, Odoo commit style, code review, flow diagrams, slide decks, and the Odoo review/tracer agents",
"version": "1.0.16",
"version": "1.0.17",
"category": "development",
"keywords": [
"odoo",
+1 -5
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-plugin.json",
"name": "agent-skills",
"version": "1.0.16",
"version": "1.0.17",
"description": "Domain-specific skills and agents for Odoo development, code review, and more",
"author": {
"name": "UncleCat",
@@ -15,9 +15,5 @@
"python",
"code-review",
"development"
],
"agents": [
"./agents/odoo-code-review/SKILL.md",
"./agents/odoo-code-tracer/SKILL.md"
]
}
+13
View File
@@ -2,6 +2,19 @@
All notable changes to this project will be documented in this file.
## [1.0.17]
### Release Description
Makes the Odoo review and tracer agents actually load from the Claude Code plugin. Both lived at `agents/<name>/SKILL.md`, which the plugin loader never scans, and `plugin.json` listed them under an `agents` key that replaces default discovery instead of adding to it - so `claude plugin details agent-skills` reported `Agents (0)` while all ten skills loaded fine. The agents are now flat files next to `planner.md`, discovered the same way.
### Fixed
- `agents/odoo-code-review.md`, `agents/odoo-code-tracer.md` - moved out of per-agent directories (`git mv` from `<name>/SKILL.md`); the plugin loader only reads flat `.md` files in `agents/`.
- `.claude-plugin/plugin.json` - dropped the `agents` key; an explicit list replaces default discovery and did not load these files.
### Changed
- `tests/test-skills.js` - validates flat agent files as well as skill directories.
- `README.md` - agent links and the project-structure tree follow the new paths.
## [1.0.16]
### Release Description
+4 -4
View File
@@ -198,8 +198,8 @@ Specialized agents that act as senior technical leads:
| Agent | What it does |
|-------|--------------|
| **[Odoo Code Review](agents/odoo-code-review/SKILL.md)** | Reviews Odoo code with scoring and structured feedback. Version-aware (16 / 17 / 18 / 19). |
| **[Odoo Code Tracer](agents/odoo-code-tracer/SKILL.md)** | Traces execution flow from an entry point through the call graph. Version-aware (16 / 17 / 18 / 19). |
| **[Odoo Code Review](agents/odoo-code-review.md)** | Reviews Odoo code with scoring and structured feedback. Version-aware (16 / 17 / 18 / 19). |
| **[Odoo Code Tracer](agents/odoo-code-tracer.md)** | Traces execution flow from an entry point through the call graph. Version-aware (16 / 17 / 18 / 19). |
| **[Planner](agents/planner.md)** | Breaks down complex features into actionable implementation steps |
### Rules — Coding Standards
@@ -253,8 +253,8 @@ agent-skills/
│ ├── code-review/ # Code review workflow
│ └── slide/ # HTML/React slide decks
├── agents/
│ ├── odoo-code-review/ # Version-aware Odoo reviewer
│ ├── odoo-code-tracer/ # Version-aware call-graph tracer
│ ├── odoo-code-review.md # Version-aware Odoo reviewer
│ ├── odoo-code-tracer.md # Version-aware call-graph tracer
│ └── planner.md # Feature planning agent
├── rules/ # Coding style and security
├── bin/ # CLI (`agent-skills`)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@unclecat/agent-skills-cli",
"version": "1.0.16",
"version": "1.0.17",
"description": "CLI and docs for installing agent skills by version.",
"bin": {
"agent-skills": "bin/agent-skills.js"
+11 -6
View File
@@ -58,17 +58,22 @@ function readFrontmatter(filePath) {
}
function validateSkillDir(dir, label) {
const entries = fs
.readdirSync(dir, { withFileTypes: true })
.filter((e) => e.isDirectory());
const entries = fs.readdirSync(dir, { withFileTypes: true });
// A skill lives in <name>/SKILL.md; a plugin agent is a flat <name>.md
// (the plugin loader does not scan agents/<name>/SKILL.md).
const paths = [
...entries.filter((e) => e.isDirectory()).map((e) => path.join(dir, e.name, "SKILL.md")),
...entries
.filter((e) => e.isFile() && e.name.endsWith(".md"))
.map((e) => path.join(dir, e.name)),
];
if (entries.length === 0) {
if (paths.length === 0) {
warn(`${label}/ is empty`);
return;
}
for (const entry of entries) {
const skillPath = path.join(dir, entry.name, "SKILL.md");
for (const skillPath of paths) {
const rel = path.relative(ROOT, skillPath);
if (!fs.existsSync(skillPath)) {
fail(`missing ${rel}`);