From 8ee34abe097a5e49926f9cd08defb24aa274a71e Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:01:17 -0700 Subject: [PATCH 01/10] feat: add .copilot-plugin/plugin.json manifest for Copilot CLI Declares A Team's skills, agents, and hooks paths for GitHub Copilot CLI to discover via 'copilot plugin install RBraga01/a-team:a-team'. Mirrors the relative-path conventions used by .cursor-plugin/plugin.json. Refs #17 --- .copilot-plugin/plugin.json | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .copilot-plugin/plugin.json diff --git a/.copilot-plugin/plugin.json b/.copilot-plugin/plugin.json new file mode 100644 index 0000000..1e108d4 --- /dev/null +++ b/.copilot-plugin/plugin.json @@ -0,0 +1,24 @@ +{ + "name": "a-team", + "description": "A complete engineering team in one folder. 26 pre-configured specialists, 19 enforced workflow skills, a lead orchestrator, and a Pipeline Auditor.", + "version": "1.3.0", + "author": { + "name": "RBraga01", + "url": "https://github.com/RBraga01" + }, + "homepage": "https://rbraga01.github.io/a-team/", + "repository": "https://github.com/RBraga01/a-team", + "license": "MIT", + "keywords": [ + "multi-agent", + "ai-agents", + "workflow", + "tdd", + "code-review", + "orchestration", + "copilot-cli" + ], + "skills": "../skills/", + "agents": "../.claude/agents/", + "hooks": "./hooks/hooks.json" +} From 63a5e9f180791d07f530eed1432d3f5e1a42ecbd Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:01:37 -0700 Subject: [PATCH 02/10] feat: add Copilot CLI hooks for SessionStart/PreToolUse/PostToolUse/Stop Mirrors .codex-plugin/hooks/hooks.json shape but extends from SessionStart-only to full 4-event enforcement parity with Claude Code's .claude/settings.json. Hook commands use project-root-relative paths and defensive fallbacks (warns and continues if a script is missing rather than crashing the session). Refs #17 --- .copilot-plugin/hooks/hooks.json | 71 ++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .copilot-plugin/hooks/hooks.json diff --git a/.copilot-plugin/hooks/hooks.json b/.copilot-plugin/hooks/hooks.json new file mode 100644 index 0000000..187634e --- /dev/null +++ b/.copilot-plugin/hooks/hooks.json @@ -0,0 +1,71 @@ +{ + "hooks": { + "SessionStart": [ + { + "matcher": "startup|clear|compact", + "hooks": [ + { + "type": "command", + "command": "python .agent-sync/status.py 2>/dev/null || python3 .agent-sync/status.py 2>/dev/null || py .agent-sync/status.py 2>/dev/null || echo '⚡ A Team · install Python to see state'", + "async": false + }, + { + "type": "command", + "command": "cat \"hooks/session-start.md\" 2>/dev/null || cat \"skills/using-a-team/SKILL.md\" 2>/dev/null || echo '[A Team] Session started. Run /orchestrate init if .agent-sync/TEAM.md is missing.'", + "async": false + }, + { + "type": "command", + "command": "for f in scripts/pre_tool_use.py scripts/watcher.py scripts/status.py scripts/metrics.py scripts/session_export.py; do test -f \"$f\" || echo \"[A Team] WARNING: $f not found — enforcement inactive. Re-run the installer.\"; done", + "async": false + }, + { + "type": "command", + "command": "if test -f scripts/watcher.py; then (python scripts/watcher.py >/dev/null 2>&1 || python3 scripts/watcher.py >/dev/null 2>&1) & fi", + "async": false + } + ] + } + ], + "PreToolUse": [ + { + "matcher": "", + "hooks": [ + { + "type": "command", + "command": "if test -f scripts/pre_tool_use.py; then python scripts/pre_tool_use.py 2>/dev/null || python3 scripts/pre_tool_use.py 2>/dev/null; else echo '[A Team] WARNING: security gate inactive (scripts/pre_tool_use.py missing — re-run installer)'; fi", + "async": false + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Write|Edit", + "hooks": [ + { + "type": "command", + "command": "echo '[A Team] File modified. Use code-reviewer agent before committing. Use verification-before-completion before claiming done.'", + "async": false + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "test -f scripts/metrics.py && (python scripts/metrics.py session_end 2>/dev/null || python3 scripts/metrics.py session_end 2>/dev/null) || true", + "async": false + }, + { + "type": "command", + "command": "test -f scripts/session_export.py && (python scripts/session_export.py 2>/dev/null || python3 scripts/session_export.py 2>/dev/null) || true", + "async": false + } + ] + } + ] + } +} From 347fec518e3b48ec573e0cc1998f0180985ff4ea Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:02:33 -0700 Subject: [PATCH 03/10] docs(readme): add GitHub Copilot CLI to platform integration - Intro line: list Copilot CLI as a supported platform - Folder layout: add .copilot-plugin/ entry - 'What each platform loads' table: add Copilot CLI row with the four hook events it carries - New platform-specific note + install command (copilot plugin install RBraga01/a-team:a-team) Refs #17 --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 32a28f6..013a10c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # A Team — A Complete Engineering Team in One Folder v1.2.0 -Not a marketplace of agents you configure. A pre-configured, pre-enforced engineering team of 26 specialists — with a lead orchestrator, hard quality gates, and a Pipeline Auditor that verifies work was actually done, not just reported. Drop one folder into any project and it's operational from the first keystroke. Works on Claude Code, Codex CLI, Cursor, and OpenCode. +Not a marketplace of agents you configure. A pre-configured, pre-enforced engineering team of 26 specialists — with a lead orchestrator, hard quality gates, and a Pipeline Auditor that verifies work was actually done, not just reported. Drop one folder into any project and it's operational from the first keystroke. Works on Claude Code, Codex CLI, Cursor, OpenCode, and GitHub Copilot CLI. > **Born from the community.** A Team was built by studying, using, and needing to personalise several excellent open-source agent projects. The architecture combines the best patterns from each into a single, portable baseline. See [Acknowledgments](#acknowledgments) for the projects that made this possible. @@ -203,6 +203,7 @@ A Team/ │ ├── .cursor-plugin/ ← Cursor IDE integration ├── .codex-plugin/ ← Codex CLI integration +├── .copilot-plugin/ ← GitHub Copilot CLI integration ├── .opencode/ ← OpenCode integration │ └── tests/ ← Harness test suite for A Team itself @@ -488,6 +489,7 @@ A Team is designed to run on one CLI or several simultaneously. Each platform re | **Claude Code** | `.claude/agents/` | `skills/` | `.claude/rules/` | `settings.json` hooks | `.claude/commands/` | | **Codex CLI** | `.claude/agents/` (via agentsPath) | `skills/` | `.claude/rules/` | `onSessionStart` hook | — | | **Cursor** | `.claude/agents/` (via agentsPath) | `skills/` | `.claude/rules/` | `onSessionStart` hook | — | +| **GitHub Copilot CLI** | `.claude/agents/` (via `agents` path) | `skills/` | `.claude/rules/` | `SessionStart` / `PreToolUse` / `PostToolUse` / `Stop` hooks | — | | **OpenCode** | — | `skills/` | — | — | `.opencode/commands/` | ### Running multiple CLIs on the same project @@ -496,7 +498,7 @@ All CLIs share `.agent-sync/` (DAILY.md, ROUTING.md, TEAM.md, results/). This me - The orchestrator's state is visible regardless of which CLI triggered it. - File Claims are written once and honoured by any CLI reading ROUTING.md. -- Hooks are **not** propagated across platforms — configure `onSessionStart` in each plugin manifest separately (already done in `.codex-plugin/` and `.cursor-plugin/`). +- Hooks are **not** propagated across platforms — configure session-start hooks in each plugin manifest separately (already done in `.codex-plugin/`, `.cursor-plugin/`, and `.copilot-plugin/`). ### Platform-specific behaviour @@ -508,6 +510,14 @@ All CLIs share `.agent-sync/` (DAILY.md, ROUTING.md, TEAM.md, results/). This me **OpenCode** has command aliases in `.opencode/commands/` mapping to the same workflows. It does not have native agent or hook support — skills are invoked manually. +**GitHub Copilot CLI** loads agents, skills, and hooks via the `.copilot-plugin/plugin.json` manifest. It supports the same hook events as Claude Code (`SessionStart`, `PreToolUse`, `PostToolUse`, `Stop`), so enforcement parity is full — not partial. + +Install: + +```bash +copilot plugin install RBraga01/a-team:a-team +``` + --- ## Command Reference From 030fbdcc1669ce90c3a83f5296b87c8ed3deb4cf Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:03:13 -0700 Subject: [PATCH 04/10] docs: add Copilot CLI to project overview and agent roster - CLAUDE.md: intro line, folder layout, Cross-Platform Support table - AGENTS.md: model-tier note, Cross-Platform Support table Refs #17 --- AGENTS.md | 3 ++- CLAUDE.md | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index f7a0319..5a17088 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # A Team — Agent & Skill Roster v1.2.0 -> **Model values below are Claude Code defaults** (`model:` frontmatter). On other platforms (Codex, Cursor, OpenCode), select the equivalent tier in your platform's model settings: Tier 1 = o3/GPT-4o/Gemini 2.5 Pro · Tier 2 = GPT-4o/Gemini Flash · Tier 3 = GPT-4o-mini/Gemini Flash-Lite. +> **Model values below are Claude Code defaults** (`model:` frontmatter). On other platforms (Codex, Cursor, OpenCode, GitHub Copilot CLI), select the equivalent tier in your platform's model settings: Tier 1 = o3/GPT-4o/Gemini 2.5 Pro · Tier 2 = GPT-4o/Gemini Flash · Tier 3 = GPT-4o-mini/Gemini Flash-Lite. ## Core Engineering Agents @@ -111,4 +111,5 @@ For independent problems, dispatch in parallel: | Claude Code | `.claude/` (native) | | Cursor | `.cursor-plugin/plugin.json` | | Codex | `.codex-plugin/plugin.json` | +| GitHub Copilot CLI | `.copilot-plugin/plugin.json` | | OpenCode | `.opencode/commands/` | diff --git a/CLAUDE.md b/CLAUDE.md index e539d15..c4ecded 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,7 +3,7 @@ Not a marketplace of agents you configure — a pre-configured, pre-enforced team of 26 specialists with a lead orchestrator, hard quality gates, and a Pipeline Auditor that verifies work was done, not just reported. Drop this folder into any project and it's operational from the first keystroke. -Works on Claude Code, Codex CLI, Cursor, and OpenCode. +Works on Claude Code, Codex CLI, Cursor, OpenCode, and GitHub Copilot CLI. ## Quick Start @@ -30,6 +30,7 @@ A Team/ │ └── session-start.md ← Injected at every session start ├── .cursor-plugin/ ← Cursor IDE integration ├── .codex-plugin/ ← Codex CLI integration +├── .copilot-plugin/ ← GitHub Copilot CLI integration └── .opencode/ ← OpenCode integration ``` @@ -127,4 +128,5 @@ All agents enforce the rules in `.claude/rules/`: | Claude Code | `.claude/` (native) | | Cursor | `.cursor-plugin/plugin.json` | | Codex CLI | `.codex-plugin/plugin.json` | +| GitHub Copilot CLI | `.copilot-plugin/plugin.json` | | OpenCode | `.opencode/commands/` | From 54526c4a85269e92d4609ca86d7aa48c5fc0aa18 Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:03:30 -0700 Subject: [PATCH 05/10] docs(contributing): add .copilot-plugin to manifest registration checklist New skills must now also be registered in .copilot-plugin/plugin.json's implicit skill discovery (via the skills: '../skills/' path) so Copilot CLI loads them alongside the other 4 platforms. Refs #17 --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d69a0d5..cb78854 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ git checkout -b fix/brief-description - Use `/writing-skills` meta-skill to walk through spec, TDD, and validation - Create `skills//SKILL.md` - Register trigger in `skills/using-a-team/SKILL.md` -- Add to plugin manifests (`.codex-plugin/`, `.cursor-plugin/`) +- Add to plugin manifests (`.codex-plugin/`, `.cursor-plugin/`, `.copilot-plugin/`) - Add `Skill()` and `Skill(:*)` to `settings.json` **Rules changes:** From cb321d1b67b26ba7983c7fe6a2a4995cf105e55f Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:03:41 -0700 Subject: [PATCH 06/10] chore(pr-template): add GitHub Copilot CLI checkbox to Platforms tested Refs #17 --- .github/PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 391264b..d7327ef 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -21,6 +21,7 @@ - [ ] Codex CLI - [ ] Cursor - [ ] OpenCode +- [ ] GitHub Copilot CLI ## Checklist From b1cdfab07225f80795838f1989d1d458970733d6 Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:04:57 -0700 Subject: [PATCH 07/10] chore: bump version to 1.3.0 across plugin manifests and overview docs Marks the addition of Copilot CLI as a supported platform. Bumps: - .claude-plugin/plugin.json + marketplace.json - .codex-plugin/plugin.json - .cursor-plugin/plugin.json - AGENTS.md, CLAUDE.md, README.md header lines .copilot-plugin/plugin.json is born at 1.3.0. Refs #17 --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- .cursor-plugin/plugin.json | 2 +- AGENTS.md | 2 +- CLAUDE.md | 2 +- README.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index b2745ad..5621c2d 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ { "name": "a-team", "description": "Universal multi-agent infrastructure: 26 specialist agents, 19 enforced workflow skills, and a lead orchestrator", - "version": "1.2.0", + "version": "1.3.0", "source": "./", "author": { "name": "RBraga01", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index b746013..0c93255 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "a-team", "description": "Universal multi-agent infrastructure: 26 specialist agents, 19 enforced workflow skills, and a lead orchestrator", - "version": "1.2.0", + "version": "1.3.0", "author": { "name": "RBraga01", "url": "https://github.com/RBraga01" diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 2e3d9c3..74a01ba 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "a-team", - "version": "1.2.0", + "version": "1.3.0", "description": "A complete engineering team in one folder. 26 pre-configured specialists, 19 enforced workflow skills, a lead orchestrator, and a Pipeline Auditor — for Claude Code, Codex CLI, Cursor, and OpenCode.", "author": { "name": "RBraga01", diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index c70cbac..5adce2b 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "a-team", "displayName": "A Team", "description": "A complete engineering team in one folder. 26 pre-configured specialists, 19 enforced workflow skills, a lead orchestrator, and a Pipeline Auditor — for Claude Code, Codex CLI, Cursor, and OpenCode.", - "version": "1.2.0", + "version": "1.3.0", "author": { "name": "RBraga01", "url": "https://github.com/RBraga01" diff --git a/AGENTS.md b/AGENTS.md index 5a17088..5916760 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -# A Team — Agent & Skill Roster v1.2.0 +# A Team — Agent & Skill Roster v1.3.0 > **Model values below are Claude Code defaults** (`model:` frontmatter). On other platforms (Codex, Cursor, OpenCode, GitHub Copilot CLI), select the equivalent tier in your platform's model settings: Tier 1 = o3/GPT-4o/Gemini 2.5 Pro · Tier 2 = GPT-4o/Gemini Flash · Tier 3 = GPT-4o-mini/Gemini Flash-Lite. diff --git a/CLAUDE.md b/CLAUDE.md index c4ecded..d006c06 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,4 +1,4 @@ -# A Team — A Complete Engineering Team in One Folder v1.2.0 +# A Team — A Complete Engineering Team in One Folder v1.3.0 Not a marketplace of agents you configure — a pre-configured, pre-enforced team of 26 specialists with a lead orchestrator, hard quality gates, and a Pipeline Auditor that verifies work was done, diff --git a/README.md b/README.md index 013a10c..4d4cd9b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A Team logo

- # A Team — A Complete Engineering Team in One Folder v1.2.0 + # A Team — A Complete Engineering Team in One Folder v1.3.0 Not a marketplace of agents you configure. A pre-configured, pre-enforced engineering team of 26 specialists — with a lead orchestrator, hard quality gates, and a Pipeline Auditor that verifies work was actually done, not just reported. Drop one folder into any project and it's operational from the first keystroke. Works on Claude Code, Codex CLI, Cursor, OpenCode, and GitHub Copilot CLI. From 93b0a06329c37cb22e6afc584c5bad074df0eeb8 Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:05:23 -0700 Subject: [PATCH 08/10] =?UTF-8?q?docs(changelog):=20record=201.3.0=20?= =?UTF-8?q?=E2=80=94=20Copilot=20CLI=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #17 --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e57892..f417422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,28 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [1.3.0] — 2026-06-16 + +### Added + +**Platform: GitHub Copilot CLI** (4 → 5 supported platforms): + +- New `.copilot-plugin/plugin.json` declaring A Team's agents (`../.claude/agents/`) + and skills (`../skills/`) for Copilot CLI auto-install. +- New `.copilot-plugin/hooks/hooks.json` carrying `SessionStart`, `PreToolUse`, + `PostToolUse`, and `Stop` hooks — full enforcement parity with Claude Code's + `.claude/settings.json` (not just SessionStart like Codex CLI today). +- Install command: `copilot plugin install RBraga01/a-team:a-team`. +- No new agents, skills, or rules — purely additive platform plumbing. + +### Changed + +- `README.md`, `CLAUDE.md`, `AGENTS.md`, `CONTRIBUTING.md`, and the PR template + updated to reference Copilot CLI as a supported platform. +- Version bumped to `1.3.0` across all plugin manifests for consistency. + +--- + ## [1.2.0] — 2026-06-16 ### Added From 40eb264ad17dd8166726e1d634bc0070c5fa30c0 Mon Sep 17 00:00:00 2001 From: thejesh Date: Tue, 16 Jun 2026 05:07:48 -0700 Subject: [PATCH 09/10] test: validate every platform manifest's JSON, fields, version, and hooks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New unit suite tests/lib/plugin-manifests.test.js (12 cases) asserts: - each *-plugin/plugin.json parses as JSON and has required fields - plugin name 'a-team' is consistent across manifests - versions are in lockstep across all 4 plugin manifests - marketplace.json a-team entry version matches .claude-plugin/plugin.json - referenced hooks files exist and are themselves parseable JSON Hooks into 'npm test' (and a new 'npm run test:manifests' shortcut) so manifest drift fails CI rather than being caught manually. Brings tests from 68 → 80; full suite passes. Refs #17 --- tests/lib/plugin-manifests.test.js | 99 ++++++++++++++++++++++++++++++ tests/package.json | 5 +- 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 tests/lib/plugin-manifests.test.js diff --git a/tests/lib/plugin-manifests.test.js b/tests/lib/plugin-manifests.test.js new file mode 100644 index 0000000..6c3e368 --- /dev/null +++ b/tests/lib/plugin-manifests.test.js @@ -0,0 +1,99 @@ +/** + * Suite: plugin-manifests + * + * Structural validation of every per-platform plugin manifest. Catches drift + * that's easy to introduce when adding a new agent, skill, or platform: + * - manifest is parseable JSON + * - required fields present + * - plugin name is "a-team" everywhere + * - versions are in lockstep (a stale version means a platform falls behind) + * - referenced hooks files exist and are themselves valid JSON + * + * Pure file/JSON validation — no transcript replay, no API calls. + */ + +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync, existsSync } from 'node:fs' +import { join, dirname } from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dir = dirname(fileURLToPath(import.meta.url)) +const ROOT = join(__dir, '..', '..') + +const PLATFORM_MANIFESTS = [ + '.claude-plugin/plugin.json', + '.codex-plugin/plugin.json', + '.cursor-plugin/plugin.json', + '.copilot-plugin/plugin.json', +] + +const REQUIRED_FIELDS = ['name', 'description', 'version', 'author', 'license'] + +function readJson(absolutePath) { + return JSON.parse(readFileSync(absolutePath, 'utf8')) +} + +for (const manifestPath of PLATFORM_MANIFESTS) { + test(`platform manifest is parseable JSON: ${manifestPath}`, () => { + const full = join(ROOT, manifestPath) + assert.ok(existsSync(full), `${manifestPath} not found`) + assert.doesNotThrow(() => readJson(full), `${manifestPath} should be valid JSON`) + }) + + test(`platform manifest has required fields: ${manifestPath}`, () => { + const json = readJson(join(ROOT, manifestPath)) + for (const field of REQUIRED_FIELDS) { + assert.ok(json[field], `${manifestPath} missing required field: ${field}`) + } + }) +} + +test('all platform manifests share the plugin name "a-team"', () => { + for (const manifestPath of PLATFORM_MANIFESTS) { + const json = readJson(join(ROOT, manifestPath)) + assert.equal(json.name, 'a-team', `${manifestPath} name should be "a-team"`) + } +}) + +test('all platform manifest versions are in lockstep', () => { + const versions = PLATFORM_MANIFESTS.map((p) => readJson(join(ROOT, p)).version) + const unique = new Set(versions) + const detail = Object.fromEntries(PLATFORM_MANIFESTS.map((p, i) => [p, versions[i]])) + assert.equal( + unique.size, + 1, + `Manifest versions diverged — bump them together: ${JSON.stringify(detail)}`, + ) +}) + +test('marketplace.json a-team entry matches .claude-plugin/plugin.json version', () => { + const marketplace = readJson(join(ROOT, '.claude-plugin/marketplace.json')) + const aTeam = marketplace.plugins.find((p) => p.name === 'a-team') + assert.ok(aTeam, 'marketplace.json should list a "a-team" plugin entry') + const pluginVersion = readJson(join(ROOT, '.claude-plugin/plugin.json')).version + assert.equal( + aTeam.version, + pluginVersion, + `marketplace.json a-team version (${aTeam.version}) drifted from .claude-plugin/plugin.json version (${pluginVersion})`, + ) +}) + +test('manifests that declare a hooks file: file exists and parses as JSON', () => { + for (const manifestPath of PLATFORM_MANIFESTS) { + const manifestAbsDir = dirname(join(ROOT, manifestPath)) + const json = readJson(join(ROOT, manifestPath)) + if (typeof json.hooks !== 'string') continue + const hookAbsPath = json.hooks.startsWith('/') + ? json.hooks + : join(manifestAbsDir, json.hooks) + assert.ok( + existsSync(hookAbsPath), + `Hook file referenced by ${manifestPath} not found at ${json.hooks}`, + ) + assert.doesNotThrow( + () => readJson(hookAbsPath), + `Hook file ${json.hooks} (referenced by ${manifestPath}) should be valid JSON`, + ) + } +}) diff --git a/tests/package.json b/tests/package.json index b63e929..122b2ee 100644 --- a/tests/package.json +++ b/tests/package.json @@ -5,8 +5,9 @@ "type": "module", "engines": { "node": ">=18.0.0" }, "scripts": { - "test": "node --test lib/transcript-parser.test.js lib/assertions.test.js", - "test:unit": "node --test lib/transcript-parser.test.js lib/assertions.test.js", + "test": "node --test lib/transcript-parser.test.js lib/assertions.test.js lib/plugin-manifests.test.js", + "test:unit": "node --test lib/transcript-parser.test.js lib/assertions.test.js lib/plugin-manifests.test.js", + "test:manifests": "node --test lib/plugin-manifests.test.js", "test:integration": "node runner.js", "test:record": "node runner.js --record", "test:skill-triggering": "node --test suites/skill-triggering.test.js", From 521195247d6880da9f5910a4d37aac939ed3182b Mon Sep 17 00:00:00 2001 From: RBraga Date: Wed, 17 Jun 2026 15:02:36 +0100 Subject: [PATCH 10/10] fix: align Copilot CLI plugin support --- .copilot-plugin/hooks/hooks.json | 76 ++++++++++-------------------- CHANGELOG.md | 4 +- CITATION.cff | 6 +-- README.md | 8 ++-- docs/index.html | 28 +++++++---- scripts/check_consistency.py | 55 +++++++++++---------- tests/lib/plugin-manifests.test.js | 64 ++++++++++++++++++++++++- 7 files changed, 149 insertions(+), 92 deletions(-) diff --git a/.copilot-plugin/hooks/hooks.json b/.copilot-plugin/hooks/hooks.json index 187634e..6de1167 100644 --- a/.copilot-plugin/hooks/hooks.json +++ b/.copilot-plugin/hooks/hooks.json @@ -1,70 +1,46 @@ { + "version": 1, "hooks": { "SessionStart": [ { - "matcher": "startup|clear|compact", - "hooks": [ - { - "type": "command", - "command": "python .agent-sync/status.py 2>/dev/null || python3 .agent-sync/status.py 2>/dev/null || py .agent-sync/status.py 2>/dev/null || echo '⚡ A Team · install Python to see state'", - "async": false - }, - { - "type": "command", - "command": "cat \"hooks/session-start.md\" 2>/dev/null || cat \"skills/using-a-team/SKILL.md\" 2>/dev/null || echo '[A Team] Session started. Run /orchestrate init if .agent-sync/TEAM.md is missing.'", - "async": false - }, - { - "type": "command", - "command": "for f in scripts/pre_tool_use.py scripts/watcher.py scripts/status.py scripts/metrics.py scripts/session_export.py; do test -f \"$f\" || echo \"[A Team] WARNING: $f not found — enforcement inactive. Re-run the installer.\"; done", - "async": false - }, - { - "type": "command", - "command": "if test -f scripts/watcher.py; then (python scripts/watcher.py >/dev/null 2>&1 || python3 scripts/watcher.py >/dev/null 2>&1) & fi", - "async": false - } - ] + "type": "command", + "command": "python .agent-sync/status.py 2>/dev/null || python3 .agent-sync/status.py 2>/dev/null || py .agent-sync/status.py 2>/dev/null || echo '[A Team] install Python to see state'" + }, + { + "type": "command", + "command": "cat \"hooks/session-start.md\" 2>/dev/null || cat \"skills/using-a-team/SKILL.md\" 2>/dev/null || echo '[A Team] Session started. Run /orchestrate init if .agent-sync/TEAM.md is missing.'" + }, + { + "type": "command", + "command": "for f in scripts/pre_tool_use.py scripts/watcher.py scripts/status.py scripts/metrics.py scripts/session_export.py; do test -f \"$f\" || echo \"[A Team] WARNING: $f not found - enforcement inactive. Re-run the installer.\"; done" + }, + { + "type": "command", + "command": "if test -f scripts/watcher.py; then (python scripts/watcher.py >/dev/null 2>&1 || python3 scripts/watcher.py >/dev/null 2>&1) & fi" } ], "PreToolUse": [ { "matcher": "", - "hooks": [ - { - "type": "command", - "command": "if test -f scripts/pre_tool_use.py; then python scripts/pre_tool_use.py 2>/dev/null || python3 scripts/pre_tool_use.py 2>/dev/null; else echo '[A Team] WARNING: security gate inactive (scripts/pre_tool_use.py missing — re-run installer)'; fi", - "async": false - } - ] + "type": "command", + "command": "if test -f scripts/pre_tool_use.py; then python scripts/pre_tool_use.py 2>/dev/null || python3 scripts/pre_tool_use.py 2>/dev/null; else echo '[A Team] WARNING: security gate inactive (scripts/pre_tool_use.py missing - re-run installer)'; fi" } ], "PostToolUse": [ { "matcher": "Write|Edit", - "hooks": [ - { - "type": "command", - "command": "echo '[A Team] File modified. Use code-reviewer agent before committing. Use verification-before-completion before claiming done.'", - "async": false - } - ] + "type": "command", + "command": "echo '[A Team] File modified. Use code-reviewer agent before committing. Use verification-before-completion before claiming done.'" } ], - "Stop": [ + "SessionEnd": [ + { + "type": "command", + "command": "test -f scripts/metrics.py && (python scripts/metrics.py session_end 2>/dev/null || python3 scripts/metrics.py session_end 2>/dev/null) || true" + }, { - "hooks": [ - { - "type": "command", - "command": "test -f scripts/metrics.py && (python scripts/metrics.py session_end 2>/dev/null || python3 scripts/metrics.py session_end 2>/dev/null) || true", - "async": false - }, - { - "type": "command", - "command": "test -f scripts/session_export.py && (python scripts/session_export.py 2>/dev/null || python3 scripts/session_export.py 2>/dev/null) || true", - "async": false - } - ] + "type": "command", + "command": "test -f scripts/session_export.py && (python scripts/session_export.py 2>/dev/null || python3 scripts/session_export.py 2>/dev/null) || true" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index f417422..794b421 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,9 +15,9 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - New `.copilot-plugin/plugin.json` declaring A Team's agents (`../.claude/agents/`) and skills (`../skills/`) for Copilot CLI auto-install. - New `.copilot-plugin/hooks/hooks.json` carrying `SessionStart`, `PreToolUse`, - `PostToolUse`, and `Stop` hooks — full enforcement parity with Claude Code's + `PostToolUse`, and `SessionEnd` hooks — full enforcement parity with Claude Code's `.claude/settings.json` (not just SessionStart like Codex CLI today). -- Install command: `copilot plugin install RBraga01/a-team:a-team`. +- Install command: `copilot plugin install RBraga01/a-team:.copilot-plugin`. - No new agents, skills, or rules — purely additive platform plumbing. ### Changed diff --git a/CITATION.cff b/CITATION.cff index e0610e9..2b55d2a 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -13,7 +13,7 @@ abstract: >- language specialists, domain, and operations), 19 enforced workflow skills including hard gates that cannot be bypassed, and a lead orchestrator that manages daily task flow. The infrastructure is stateless by design — every agent derives its context - from files. Compatible with Claude Code, Codex CLI, Cursor, and OpenCode. + from files. Compatible with Claude Code, Codex CLI, Cursor, OpenCode, and GitHub Copilot CLI. authors: - family-names: Braga @@ -21,7 +21,7 @@ authors: alias: RBraga01 email: ricardormbraga@hotmail.com -version: "1.2.0" +version: "1.3.0" date-released: "2026-06-02" @@ -62,7 +62,7 @@ preferred-citation: - family-names: Braga given-names: Ricardo Romão Marques alias: RBraga01 - version: "1.2.0" + version: "1.3.0" date-released: "2026-06-02" license: MIT repository-code: "https://github.com/RBraga01/a-team" diff --git a/README.md b/README.md index 4d4cd9b..5598077 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ Open `INIT.md` and tick the checkboxes for your project: - Primary languages (Go, Python, Kotlin, Swift, etc.) - Tech stack (database, infra, CI/CD) - Compliance scope (GDPR, PCI-DSS, etc.) -- Which AI platforms are active (Claude Code, Codex, Cursor, OpenCode) +- Which AI platforms are active (Claude Code, Codex, Cursor, OpenCode, GitHub Copilot CLI) Takes about 5 minutes. @@ -489,7 +489,7 @@ A Team is designed to run on one CLI or several simultaneously. Each platform re | **Claude Code** | `.claude/agents/` | `skills/` | `.claude/rules/` | `settings.json` hooks | `.claude/commands/` | | **Codex CLI** | `.claude/agents/` (via agentsPath) | `skills/` | `.claude/rules/` | `onSessionStart` hook | — | | **Cursor** | `.claude/agents/` (via agentsPath) | `skills/` | `.claude/rules/` | `onSessionStart` hook | — | -| **GitHub Copilot CLI** | `.claude/agents/` (via `agents` path) | `skills/` | `.claude/rules/` | `SessionStart` / `PreToolUse` / `PostToolUse` / `Stop` hooks | — | +| **GitHub Copilot CLI** | `.claude/agents/` (via `agents` path) | `skills/` | `.claude/rules/` | `SessionStart` / `PreToolUse` / `PostToolUse` / `SessionEnd` hooks | — | | **OpenCode** | — | `skills/` | — | — | `.opencode/commands/` | ### Running multiple CLIs on the same project @@ -510,12 +510,12 @@ All CLIs share `.agent-sync/` (DAILY.md, ROUTING.md, TEAM.md, results/). This me **OpenCode** has command aliases in `.opencode/commands/` mapping to the same workflows. It does not have native agent or hook support — skills are invoked manually. -**GitHub Copilot CLI** loads agents, skills, and hooks via the `.copilot-plugin/plugin.json` manifest. It supports the same hook events as Claude Code (`SessionStart`, `PreToolUse`, `PostToolUse`, `Stop`), so enforcement parity is full — not partial. +**GitHub Copilot CLI** loads agents, skills, and hooks via the `.copilot-plugin/plugin.json` manifest. It supports the A Team session, tool-use, post-edit, and session-end gates through Copilot CLI hooks, so enforcement parity is full — not partial. Install: ```bash -copilot plugin install RBraga01/a-team:a-team +copilot plugin install RBraga01/a-team:.copilot-plugin ``` --- diff --git a/docs/index.html b/docs/index.html index e9aae1a..09d490a 100644 --- a/docs/index.html +++ b/docs/index.html @@ -319,7 +319,7 @@ .g-amber { border-left-color:var(--amber); } /* ── PLATFORMS ── */ -.platforms-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:16px; } +.platforms-grid { display:grid; grid-template-columns:repeat(5,1fr); gap:16px; } .platform-card { background:var(--surface); border:1px solid var(--border); border-radius:var(--r); padding:28px 20px; text-align:center; @@ -358,10 +358,12 @@ .plat-openai .plat-logo { background:rgba(16,163,127,.1); border:1px solid rgba(16,163,127,.2); --glow-color:rgba(16,163,127,.1); } .plat-cursor .plat-logo { background:rgba(99,102,241,.1); border:1px solid rgba(99,102,241,.2); --glow-color:rgba(99,102,241,.1); } .plat-opencode .plat-logo { background:rgba(148,163,184,.1); border:1px solid rgba(148,163,184,.2); --glow-color:rgba(148,163,184,.1); } +.plat-github .plat-logo { background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.18); --glow-color:rgba(255,255,255,.08); } .plat-anthropic { --glow-color:rgba(255,127,80,.08); } .plat-openai { --glow-color:rgba(16,163,127,.08); } .plat-cursor { --glow-color:rgba(99,102,241,.08); } .plat-opencode { --glow-color:rgba(148,163,184,.08); } +.plat-github { --glow-color:rgba(255,255,255,.06); } /* ── STEPS ── */ .steps { display:flex; flex-direction:column; gap:0; } @@ -564,7 +566,7 @@ @@ -766,6 +768,16 @@

Cursor

Strong Support + +
+ +

Copilot CLI

+

Agents, skills, and hooks load through the Copilot CLI plugin manifest

+ Full Support +
+
@@ -987,7 +999,7 @@

Frequently asked questions

Can I run multiple AI platforms simultaneously on the same project?

Yes. All platforms share the same .agent-sync/ directory (DAILY.md, ROUTING.md, TEAM.md), so orchestrator state is visible regardless of which CLI triggered it.

-

Important: session-start hooks are not propagated between platforms. Each platform's plugin manifest configures its own onSessionStart hook independently — the files are already pre-configured for Claude Code, Codex, and Cursor.

+

Important: session-start hooks are not propagated between platforms. Each platform's plugin manifest configures its own session-start hook independently — the files are already pre-configured for Claude Code, Codex, Cursor, and GitHub Copilot CLI.

@@ -995,7 +1007,7 @@

Frequently asked questions

Does it work on Windows, Mac, and Linux?

Yes. A Team is platform-agnostic — it's markdown files and JSON, with no compiled code or OS-specific scripts. The path normalisation for git worktrees uses standard POSIX-style paths that work across all systems via the git CLI.

-

The bash commands in agent files (for running tests, linting, etc.) are standard shell commands that work on all three platforms.

+

The bash commands in agent files (for running tests, linting, etc.) are standard shell commands that work across the supported platforms.

@@ -1182,9 +1194,9 @@

Help us reach more developers ⭐