mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-10-06 15:16:56 +01:00
Simplify standalone AL review skill
Rename the host-facing skill to al-code-review, reduce it to a thin Entry adapter, document the architecture, and validate host skill metadata. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: af96bb3d-893a-48a2-8298-c8f4271c162c
This commit is contained in:
parent
2439d5c412
commit
096f1c7b59
8 changed files with 176 additions and 108 deletions
|
|
@ -1,6 +1,9 @@
|
|||
# BCQuality global skills
|
||||
|
||||
This folder contains the skills that are not owned by any single layer. There are two kinds:
|
||||
This folder contains BCQuality's layer-independent protocol files and the
|
||||
host-native adapter used by standalone plugin installations.
|
||||
|
||||
The protocol files have two kinds:
|
||||
|
||||
- **The entry-point skill** — the first skill an agent invokes at runtime.
|
||||
- **The three meta-skill contracts** — stable references that define what the rest of BCQuality means.
|
||||
|
|
@ -23,6 +26,35 @@ Routing logic lives in Entry, not in the orchestrator. An agent that knows only
|
|||
|
||||
READ and DO are read on demand — typically by the first action skill the agent executes after dispatch. They are not prerequisites for invoking Entry. WRITE is only used when scaffolding new content.
|
||||
|
||||
## Standalone plugin adapter
|
||||
|
||||
| Path | Role |
|
||||
|---|---|
|
||||
| [`al-code-review/SKILL.md`](al-code-review/SKILL.md) | Exposes BCQuality through the standard `SKILL.md` format when this repository is installed as a plugin. |
|
||||
|
||||
The adapter is deliberately thin. It translates the caller's request into an
|
||||
Entry task context, then follows Entry's dispatch without owning routing,
|
||||
review, index, or output policy. It is not an action skill, is not considered
|
||||
by Entry, and should not accumulate behavior already defined by `entry.md`,
|
||||
`read.md`, `do.md`, or a layered action skill.
|
||||
|
||||
This gives the two skill formats distinct roles:
|
||||
|
||||
- `skills/al-code-review/SKILL.md` is the public host integration surface for a
|
||||
standalone plugin installation.
|
||||
- `microsoft/skills/review/al-code-review.md` is BCQuality's internal
|
||||
Microsoft-layer super-skill for coordinating a broad AL review.
|
||||
|
||||
The host adapter and internal coordinator deliberately share the
|
||||
`al-code-review` name because they represent the same user-facing operation in
|
||||
their respective formats. Their locations distinguish their roles. The
|
||||
adapter remains distinct from BC-ALAgents' separately installed `al-review`
|
||||
skill, avoiding a collision in hosts that use one shared skill inventory. The
|
||||
reference from the adapter to Entry, and from a dispatched super-skill to its
|
||||
leaf skills, is intentional progressive disclosure. It avoids registering
|
||||
every internal BCQuality protocol file as an ambient host skill while allowing
|
||||
each review domain to run in an isolated context.
|
||||
|
||||
These contracts are stable. Changes require a PR approved by both maintainers.
|
||||
|
||||
For the end-to-end flow — from orchestrator trigger through to findings integration — see [`../agent-consumption.md`](../agent-consumption.md). For the high-level project framing, see [`../README.md`](../README.md).
|
||||
|
|
|
|||
50
skills/al-code-review/SKILL.md
Normal file
50
skills/al-code-review/SKILL.md
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
---
|
||||
name: al-code-review
|
||||
description: Review Business Central AL code changes using BCQuality's curated rules. Use for an AL pull request, working-tree diff, branch, or individual AL file when BCQuality is installed as a standalone plugin.
|
||||
---
|
||||
|
||||
# AL code review
|
||||
|
||||
This is BCQuality's host-native adapter for standalone plugin installations. It
|
||||
is not a BCQuality action skill and contains no review or routing policy. Its
|
||||
only responsibility is to translate the caller's request into an Entry task
|
||||
context and execute the resulting dispatch.
|
||||
|
||||
## Execute
|
||||
|
||||
1. Resolve `PLUGIN_ROOT` to the directory containing this plugin's root
|
||||
`plugin.json`. This file is
|
||||
`PLUGIN_ROOT/skills/al-code-review/SKILL.md`; when the host does not expose
|
||||
the plugin root, resolve it two levels above this file.
|
||||
2. Build the `task-context` required by
|
||||
`PLUGIN_ROOT/skills/entry.md`:
|
||||
- Copy the caller's actual request verbatim into `goal`; do not replace a
|
||||
focused request such as "review performance" with a generic full-review
|
||||
goal.
|
||||
- Set `inputs-available` to the inputs actually available to the review,
|
||||
normally `pr-diff` for changes or `file-path` for one file.
|
||||
- Set `technologies: [al]` when the input is known to be AL.
|
||||
- Pass `bc-version`, `countries`, and `application-area` only when supplied
|
||||
or reliably determined.
|
||||
- If `BCQUALITY_ENABLED_LAYERS` is set, split its comma-separated value and
|
||||
pass the trimmed, non-empty entries as `enabled-layers`; otherwise omit the
|
||||
field and let Entry apply its default.
|
||||
- If `BCQUALITY_DISABLED_SKILLS` is set, split its comma-separated value and
|
||||
pass the trimmed, non-empty entries as `disabled-skills`; otherwise omit
|
||||
the field.
|
||||
3. Read and execute `PLUGIN_ROOT/skills/entry.md` exactly as written, including
|
||||
its Preparation step. Entry is authoritative for index freshness, routing,
|
||||
defaults, and failure behavior; this adapter must not duplicate or weaken
|
||||
those rules.
|
||||
4. Follow Entry's **How the agent uses the dispatch** instructions. Invoke only
|
||||
the returned action skills, pass each dispatch entry's exact input subset,
|
||||
and read `PLUGIN_ROOT/skills/read.md` and `PLUGIN_ROOT/skills/do.md` on
|
||||
demand. When a dispatched super-skill requests isolated leaf execution and
|
||||
the host supports child contexts, use them.
|
||||
5. Return each dispatched action skill's findings report unchanged. If Entry
|
||||
returns `no-match` or `failed`, return its dispatch record unchanged.
|
||||
|
||||
The internal `microsoft/skills/review/al-code-review.md` action skill remains
|
||||
the canonical coordinator for a broad AL review. Entry decides whether that
|
||||
super-skill or a narrower domain skill applies; this host adapter never chooses
|
||||
between them.
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
---
|
||||
name: bcquality-al-review
|
||||
description: Review Business Central AL code changes using the BCQuality knowledge base. Use when reviewing an AL pull request, a working-tree diff, or a single AL file, and you want findings backed by BCQuality's curated, BC-specific quality rules.
|
||||
---
|
||||
|
||||
# BCQuality AL review
|
||||
|
||||
This skill drives the BCQuality **Entry protocol** over the knowledge base that ships
|
||||
inside this plugin. It is the plugin entry point for consumers (orchestrators, CLIs)
|
||||
that do not already know BCQuality's internal conventions — the only convention they
|
||||
need is "invoke this skill for an AL review."
|
||||
|
||||
BCQuality itself is orchestrator-agnostic content: knowledge files plus routing and
|
||||
action skills. This bridge is the thin consumer glue that lets a plugin host run that
|
||||
content without hardcoding BCQuality's layout.
|
||||
|
||||
## When to use
|
||||
|
||||
- Reviewing an AL pull request or an uncommitted working-tree diff.
|
||||
- Reviewing a single AL file.
|
||||
- Any task whose goal is "review Business Central / AL code for quality issues."
|
||||
|
||||
Do **not** use this skill to *generate* AL code — it only reviews.
|
||||
|
||||
## Plugin root
|
||||
|
||||
Resolve `PLUGIN_ROOT` to the directory that contains this plugin's root
|
||||
`plugin.json`. This skill lives at
|
||||
`PLUGIN_ROOT/skills/bcquality-al-review/SKILL.md`, so `PLUGIN_ROOT` is two levels up
|
||||
from this file. All paths below are relative to `PLUGIN_ROOT`. If the host exposes a
|
||||
plugin-root environment variable, prefer it.
|
||||
|
||||
## Steps
|
||||
|
||||
1. **Refresh the knowledge index (best effort).** If `pwsh` is available, run
|
||||
`pwsh PLUGIN_ROOT/tools/Build-KnowledgeIndex.ps1` from `PLUGIN_ROOT` to (re)generate
|
||||
`PLUGIN_ROOT/knowledge-index.json` over the installed tree. This is a discovery
|
||||
accelerator only — if `pwsh` is missing or the build fails, continue; the review
|
||||
skills fall back to path-based discovery.
|
||||
|
||||
2. **Run Entry.** Read `PLUGIN_ROOT/skills/entry.md` and execute it against a
|
||||
task context describing the review:
|
||||
|
||||
```yaml
|
||||
task-context:
|
||||
goal: "Review the AL changes for quality issues"
|
||||
inputs-available: [pr-diff] # or [file-path] for single-file review
|
||||
technologies: [al]
|
||||
enabled-layers: [microsoft, community, custom] # see "Layer selection" below
|
||||
```
|
||||
|
||||
**Layer selection.** `enabled-layers` defaults to all three layers. A host can
|
||||
narrow it by setting the `BCQUALITY_ENABLED_LAYERS` environment variable to a
|
||||
comma-separated subset (e.g. `microsoft` or `microsoft,community`); when set, pass
|
||||
exactly those layers instead of the default. This is the plugin path's only knob
|
||||
for layer policy — see the limitation in Notes.
|
||||
|
||||
Fill `bc-version`, `countries`, and `application-area` only when the caller
|
||||
supplies them; omit them otherwise (an omitted dimension is unconstrained).
|
||||
|
||||
3. **Follow the dispatch record.** Entry returns a dispatch record naming the action
|
||||
skill(s) to invoke — for a PR review this is normally
|
||||
`microsoft/skills/review/al-code-review.md`. For each dispatched skill, read the
|
||||
file and execute its Source → Relevance → Worklist → Action steps, reading
|
||||
`PLUGIN_ROOT/skills/read.md` and `PLUGIN_ROOT/skills/do.md` on demand.
|
||||
When `al-code-review` composes its leaves and the host supports child contexts or
|
||||
separate model calls, run each leaf in an isolated context and roll up the returned
|
||||
JSON. Pass each call the exact index rows for that leaf's domain so references can
|
||||
be copied verbatim. This is the preferred execution profile for fast/small models;
|
||||
do not force one generation to retain all domain knowledge at once.
|
||||
|
||||
4. **Emit findings.** Produce the rolled-up findings report in the DO output contract,
|
||||
including each review finding's producer-supplied `domain` label (`outcome`,
|
||||
`findings`, `references`, `confidence`, `suppressed`). Do not invent a different
|
||||
shape; downstream consumers parse the DO contract without skill-specific logic.
|
||||
Apply DO's reference-integrity gate before returning: every knowledge-backed path
|
||||
must exist in the installed tree, must have been opened in full, and must be copied
|
||||
verbatim. Never synthesize a plausible article slug.
|
||||
|
||||
If Entry returns `no-match` or `failed`, return the dispatch record unchanged so the
|
||||
caller can log the reason.
|
||||
|
||||
## Notes
|
||||
|
||||
- This skill adds nothing to BCQuality's knowledge or routing logic; it only bootstraps
|
||||
the existing Entry protocol from a plugin host. Knowledge and skill changes belong in
|
||||
the layers under `PLUGIN_ROOT/microsoft/`, `PLUGIN_ROOT/community/`, and
|
||||
`PLUGIN_ROOT/custom/`, not here.
|
||||
- **Layer pruning is coarser than the URL/clone model.** In the clone model a consumer
|
||||
prunes its checkout to policy *before* the agent runs, and the knowledge index is
|
||||
rebuilt over the pruned tree, so a denied layer can never leak into discovery. A
|
||||
plugin install ships the whole tree, so this bridge can only *narrow discovery* via
|
||||
`enabled-layers` (`BCQUALITY_ENABLED_LAYERS`) — the denied layers' files still exist on
|
||||
disk. Treat `enabled-layers` as a selection filter, not a hard security boundary. A
|
||||
future revision could add a genuine deny mechanism (e.g. pruning the installed tree).
|
||||
- **Manifest location.** This plugin's manifest is the root `plugin.json`, which both
|
||||
Claude Code and Copilot CLI accept (verified with Copilot CLI: `plugin install`
|
||||
reports the bridge skill loaded). A `.claude-plugin/marketplace.json` alongside it
|
||||
carries the marketplace entry. Claude Code also reads `.claude-plugin/plugin.json`; if
|
||||
a future host only reads that form, dual-home the manifest there.
|
||||
Loading…
Add table
Add a link
Reference in a new issue