@mmerterden/multi-agent-pipeline 10.6.0 → 10.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +10 -39
- package/install/index.mjs +9 -101
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +1 -11
- package/pipeline/commands/multi-agent/setup.md +0 -1
- package/pipeline/commands/multi-agent/sync.md +4 -73
- package/pipeline/commands/multi-agent/update.md +9 -0
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +0 -7
- package/pipeline/scripts/smoke-install-layout.sh +1 -2
- package/install/_adapters.mjs +0 -73
- package/pipeline/adapters/_base.mjs +0 -640
- package/pipeline/adapters/antigravity.mjs +0 -140
- package/pipeline/adapters/codex.mjs +0 -159
- package/pipeline/adapters/copilot-chat-orchestration.mjs +0 -148
- package/pipeline/adapters/copilot-chat.mjs +0 -124
- package/pipeline/adapters/cursor-orchestration.mjs +0 -152
- package/pipeline/adapters/cursor.mjs +0 -146
- package/pipeline/scripts/smoke-adapters.sh +0 -276
- package/pipeline/scripts/smoke-shared-runtime.sh +0 -108
- package/pipeline/scripts/smoke-sync-adapters.sh +0 -113
- package/pipeline/scripts/sync-adapters.mjs +0 -183
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,29 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
+
## [10.7.0] - 2026-07-02
|
|
18
|
+
|
|
19
|
+
The pipeline targets **Claude Code + Copilot CLI only**. The Cursor / Antigravity / VS Code Copilot Chat / OpenAI Codex CLI adapters are removed.
|
|
20
|
+
|
|
21
|
+
### Removed
|
|
22
|
+
|
|
23
|
+
- **All non-native adapters deleted.** `pipeline/adapters/` (Cursor, Antigravity,
|
|
24
|
+
Copilot Chat, Codex + orchestration variants), `pipeline/scripts/sync-adapters.mjs`,
|
|
25
|
+
`install/_adapters.mjs`, and the `smoke-adapters.sh` / `smoke-sync-adapters.sh` /
|
|
26
|
+
`smoke-shared-runtime.sh` smokes are gone.
|
|
27
|
+
- Installer flags `--cursor` / `--copilot-chat` / `--antigravity` / `--codex` /
|
|
28
|
+
`--all-tools` removed; `install` now dispatches only Claude Code + Copilot CLI.
|
|
29
|
+
- `multi-agent:sync` drops the Codex (Step 2a) and per-project adapter (Step 2b)
|
|
30
|
+
steps; the `--no-adapters` flag is retired. README, `phase-4-review`, and
|
|
31
|
+
`setup` adapter documentation removed.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- **`multi-agent:update` prunes the retired global Codex adapter prompt**
|
|
36
|
+
(`~/.codex/prompts/multi-agent.md`). Per-project adapter files (`.cursor/`,
|
|
37
|
+
`.agent/`, `.github/copilot-instructions.md`) are left untouched — they live in
|
|
38
|
+
user repos; the `uninstall` command can still remove them selectively.
|
|
39
|
+
|
|
17
40
|
## [10.6.0] - 2026-07-02
|
|
18
41
|
|
|
19
42
|
Fable 5 restored as the top model tier; `stack-swap` fully removed; setup gains a default stack step.
|
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|---|---|
|
|
14
14
|
| Slash commands (colon-form `/multi-agent:*`) | 35 |
|
|
15
15
|
| Copilot skills (dash-form `multi-agent-*`) | 35 |
|
|
16
|
-
| Platforms (
|
|
16
|
+
| Platforms (Claude Code, Copilot CLI) | 2 |
|
|
17
17
|
| Store-compliance skills (`apple-archive-compliance`, `google-play-compliance`) | 2 |
|
|
18
18
|
| Figma skills (iOS + Android + Common) | 41 |
|
|
19
19
|
| External skill catalog (`shared/external/`) | 143 |
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
| Agent personas | 8 |
|
|
26
26
|
| Pipeline phases | 8 |
|
|
27
27
|
|
|
28
|
-
>
|
|
28
|
+
> **Claude Code** and **Copilot CLI** run the full pipeline natively - the gate scripts + live tracker are installed to `~/.claude` / `~/.copilot`, and on Claude Code a `PreToolUse` hook hard-blocks on the secret scan.
|
|
29
29
|
|
|
30
30
|
> Security issue? See [SECURITY.md](./SECURITY.md). Please do not open public issues for vulnerabilities.
|
|
31
31
|
|
|
@@ -72,14 +72,6 @@ node install.js # Claude Code (default)
|
|
|
72
72
|
node install.js --copilot # Copilot CLI
|
|
73
73
|
node install.js --all # Both Claude + Copilot
|
|
74
74
|
|
|
75
|
-
# Third-party AI tool adapters (knowledge layer only)
|
|
76
|
-
node install.js --cursor # Cursor (.cursor/rules/*.mdc + .cursorrules)
|
|
77
|
-
node install.js --copilot-chat # GitHub Copilot Chat (.github/copilot-instructions.md)
|
|
78
|
-
node install.js --antigravity # Antigravity (.agent/ + AGENTS.md)
|
|
79
|
-
node install.js --codex # OpenAI Codex CLI (global: ~/.codex/prompts + config.toml)
|
|
80
|
-
node install.js --all-tools # Everything: 2 native (Claude + Copilot CLI) + 4 adapter targets
|
|
81
|
-
node install.js --cursor --target=/path/to/repo # Adapter target override (default: cwd)
|
|
82
|
-
|
|
83
75
|
node install.js --link # Symlink mode (dev, saves ~10K tokens)
|
|
84
76
|
node install.js --all --dry-run # Preview every operation, write nothing
|
|
85
77
|
|
|
@@ -87,7 +79,6 @@ node install.js --all --dry-run # Preview every operation, write nothing
|
|
|
87
79
|
node install.js # ...later...
|
|
88
80
|
node pipeline/scripts/uninstall.mjs --dry-run # preview what would be removed
|
|
89
81
|
node pipeline/scripts/uninstall.mjs --yes # remove from every installed target
|
|
90
|
-
node pipeline/scripts/uninstall.mjs --cursor # selective uninstall
|
|
91
82
|
|
|
92
83
|
# Optional: expose the CLI globally as 'multi-agent-pipeline'
|
|
93
84
|
npm link
|
|
@@ -109,11 +100,6 @@ Update later with `git pull && npm install` inside the clone. Pin to a specific
|
|
|
109
100
|
npx @mmerterden/multi-agent-pipeline install # Claude Code only (default)
|
|
110
101
|
npx @mmerterden/multi-agent-pipeline install --copilot # Copilot CLI only
|
|
111
102
|
npx @mmerterden/multi-agent-pipeline install --all # Both native CLIs (Claude + Copilot)
|
|
112
|
-
npx @mmerterden/multi-agent-pipeline install --cursor # Cursor adapter (per-project, cwd)
|
|
113
|
-
npx @mmerterden/multi-agent-pipeline install --copilot-chat # GitHub Copilot Chat adapter (per-project)
|
|
114
|
-
npx @mmerterden/multi-agent-pipeline install --antigravity # Antigravity adapter (per-project)
|
|
115
|
-
npx @mmerterden/multi-agent-pipeline install --codex # OpenAI Codex CLI (global ~/.codex)
|
|
116
|
-
npx @mmerterden/multi-agent-pipeline install --all-tools # Everything: 2 native + 4 adapter targets
|
|
117
103
|
npx @mmerterden/multi-agent-pipeline install --link # Symlink mode
|
|
118
104
|
npx @mmerterden/multi-agent-pipeline install --all --dry-run # Preview, write nothing
|
|
119
105
|
|
|
@@ -194,42 +180,27 @@ Earlier README revisions referenced GitHub Packages with a Classic PAT and `~/.n
|
|
|
194
180
|
|
|
195
181
|
## Tool support
|
|
196
182
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
### Tier 1 - Full pipeline (orchestration + knowledge)
|
|
183
|
+
The pipeline runs natively on **Claude Code** and **Copilot CLI** — the two CLIs it targets. Both install from the same `pipeline/skills/` source and get identical skill coverage.
|
|
200
184
|
|
|
201
185
|
| Tool | Install Flag | How It Works |
|
|
202
186
|
| --- | --- | --- |
|
|
203
187
|
| **Claude Code** | `--claude` (default) | Native: slash commands + shared + figma skills + agents + rules + scripts |
|
|
204
188
|
| **Copilot CLI** | `--copilot` | Native: instructions + shared + figma skills + scripts |
|
|
205
|
-
| **Cursor** | `--cursor` | Adapter: `.cursor/agents/ma-*.md` subagents + `.cursor/commands/multi-agent.md` + rules + `.cursor/mcp.json` |
|
|
206
|
-
| **Antigravity** | `--antigravity` | Adapter: `.agent/workflows/multi-agent.md` + `.agent/rules/` + `AGENTS.md` + `.agent/mcp_config.json` |
|
|
207
|
-
| **VS Code Copilot Chat** | `--copilot-chat` | Adapter: `.github/agents/ma-*.agent.md` + `.github/prompts/multi-agent.prompt.md` + `.vscode/mcp.json` |
|
|
208
|
-
| **OpenAI Codex CLI** | `--codex` | Global adapter: `~/.codex/prompts/multi-agent.md` + `~/.codex/AGENTS.md` + `~/.codex/config.toml` ([mcp_servers.dev-toolkit]) |
|
|
209
|
-
|
|
210
|
-
Claude Code and Copilot CLI run the pipeline natively. Cursor, Antigravity, and VS Code Copilot Chat run it through per-platform orchestration adapters that transform the pipeline personas (`pipeline/agents/*.md`) into that platform's subagent/agent format and emit a `/multi-agent` command/workflow, registering the dev-toolkit MCP server automatically. Codex CLI is a global-config tool (its prompts + MCP live under `~/.codex`, with no per-project prompt directory), so its adapter installs globally and runs the `/multi-agent` slash command sequentially - Codex has no subagent fan-out, so the parallel review degrades to a sequential adversarial two-pass. Where a platform lacks a native picker, confirmations degrade per `refs/picker-contract.md` (the `ask_user_choice` MCP tool or `pipeline/lib/ask-choice.sh`); hard blocking gates degrade to advisory rules plus a CI smoke step.
|
|
211
|
-
|
|
212
|
-
All install from the same `pipeline/skills/` source. Tree organization:
|
|
213
|
-
|
|
214
|
-
- `pipeline/skills/shared/core/` - **orchestration skills** (`multi-agent-*` dash-form mirrors of colon-form slash commands + compliance skills + orchestrator)
|
|
215
|
-
- `pipeline/skills/shared/external/` - **127 third-party / curated iOS, Android, and generic guidance skills** (SwiftUI, Jetpack Compose, testing, performance, security, etc.)
|
|
216
|
-
- `pipeline/skills/figma-ios/` + `pipeline/skills/figma-android/` - **5 + 5 platform-specific Phase 3 sub-skills** (SwiftUI and Jetpack Compose code generation)
|
|
217
|
-
- `pipeline/skills/figma-common/` - **27 platform-agnostic Figma helpers** (iterate, commit, wiki setup, MCP auth, performance harness)
|
|
218
|
-
|
|
219
|
-
You get identical skill coverage regardless of which CLI you use. Both CLIs also receive the same `pipeline/scripts/` tree so multi-CLI-only installs stay self-contained.
|
|
220
189
|
|
|
221
|
-
|
|
190
|
+
Skill tree:
|
|
222
191
|
|
|
223
|
-
|
|
192
|
+
- `pipeline/skills/shared/core/` - **orchestration skills** (`multi-agent-*` dash-form mirrors of the colon-form slash commands + compliance skills + orchestrator)
|
|
193
|
+
- `pipeline/skills/shared/external/` - **curated iOS / Android / generic guidance skills** (SwiftUI, Jetpack Compose, testing, performance, security, etc.) — also distributed as versioned marketplace plugins in `mmerterden/multi-agent-plugins`
|
|
194
|
+
- `pipeline/skills/figma-ios/` + `pipeline/skills/figma-android/` - **platform-specific Phase 3 sub-skills** (SwiftUI and Jetpack Compose code generation)
|
|
195
|
+
- `pipeline/skills/figma-common/` - **platform-agnostic Figma helpers** (iterate, commit, wiki setup, MCP auth, performance harness)
|
|
224
196
|
|
|
225
|
-
|
|
197
|
+
Filter the skill set by stack with `--platform=ios|android|all`. Both CLIs also receive the same `pipeline/scripts/` tree so single-CLI installs stay self-contained.
|
|
226
198
|
|
|
227
|
-
### Uninstall (token-preserving
|
|
199
|
+
### Uninstall (token-preserving)
|
|
228
200
|
|
|
229
201
|
```bash
|
|
230
202
|
npx @mmerterden/multi-agent-pipeline uninstall # interactive, all installed targets
|
|
231
203
|
npx @mmerterden/multi-agent-pipeline uninstall --dry-run # preview, zero side effects
|
|
232
|
-
npx @mmerterden/multi-agent-pipeline uninstall --cursor # selective: only this tool
|
|
233
204
|
```
|
|
234
205
|
|
|
235
206
|
Personal access tokens stored in macOS Keychain / Windows Credential Manager / Linux libsecret are **never touched** by the uninstaller. Smoke tests enforce this with a static check that fails the build if the script ever references a credential-store deletion API.
|
package/install/index.mjs
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* multi-agent-pipeline installer entry point.
|
|
3
3
|
*
|
|
4
|
-
* Parses flags, dispatches to per-target installers (Claude / Copilot
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Behaviour MUST stay byte-equivalent to the pre-v8.0.0 monolithic install.js.
|
|
8
|
-
* The smoke `smoke-install-layout.sh` test compares the produced filesystem
|
|
9
|
-
* tree against a fixture before/after refactor.
|
|
4
|
+
* Parses flags, dispatches to the per-target installers (Claude Code / Copilot
|
|
5
|
+
* CLI), prints a summary, and fires opt-in telemetry. The pipeline runs natively
|
|
6
|
+
* on these two CLIs only.
|
|
10
7
|
*
|
|
11
8
|
* @module install/index
|
|
12
9
|
*/
|
|
@@ -16,7 +13,6 @@ import { fileURLToPath } from "url";
|
|
|
16
13
|
|
|
17
14
|
import { installClaude } from "./claude.mjs";
|
|
18
15
|
import { installCopilot } from "./copilot.mjs";
|
|
19
|
-
import { anyAdapterRequested, installAdapters } from "./_adapters.mjs";
|
|
20
16
|
import { setDryRun } from "./_common.mjs";
|
|
21
17
|
import { sendInstallTelemetry } from "./_telemetry.mjs";
|
|
22
18
|
|
|
@@ -26,14 +22,7 @@ const PIPELINE_ROOT = dirname(__dirname);
|
|
|
26
22
|
const PIPELINE_SRC = `${PIPELINE_ROOT}/pipeline`;
|
|
27
23
|
|
|
28
24
|
/** Tool flags surfaced in CLI help. */
|
|
29
|
-
const TOOL_FLAGS = [
|
|
30
|
-
"--claude",
|
|
31
|
-
"--copilot",
|
|
32
|
-
"--cursor",
|
|
33
|
-
"--copilot-chat",
|
|
34
|
-
"--antigravity",
|
|
35
|
-
"--codex",
|
|
36
|
-
];
|
|
25
|
+
const TOOL_FLAGS = ["--claude", "--copilot"];
|
|
37
26
|
|
|
38
27
|
/**
|
|
39
28
|
* @param {string[]} argv
|
|
@@ -55,7 +44,6 @@ export async function runInstall(argv) {
|
|
|
55
44
|
const KNOWN_FLAGS = [
|
|
56
45
|
...TOOL_FLAGS,
|
|
57
46
|
"--all",
|
|
58
|
-
"--all-tools",
|
|
59
47
|
"--link",
|
|
60
48
|
"--index-only",
|
|
61
49
|
"--dry-run",
|
|
@@ -79,32 +67,12 @@ export async function runInstall(argv) {
|
|
|
79
67
|
setDryRun(dryRun);
|
|
80
68
|
|
|
81
69
|
const isExplicitlyTargeted =
|
|
82
|
-
flags.some((f) => TOOL_FLAGS.includes(f)) ||
|
|
83
|
-
flags.includes("--all") ||
|
|
84
|
-
flags.includes("--all-tools");
|
|
70
|
+
flags.some((f) => TOOL_FLAGS.includes(f)) || flags.includes("--all");
|
|
85
71
|
|
|
86
72
|
const forClaude =
|
|
87
|
-
flags.includes("--claude") ||
|
|
88
|
-
flags.includes("--all") ||
|
|
89
|
-
flags.includes("--all-tools") ||
|
|
90
|
-
!isExplicitlyTargeted;
|
|
91
|
-
|
|
92
|
-
const forCopilot =
|
|
93
|
-
flags.includes("--copilot") ||
|
|
94
|
-
flags.includes("--all") ||
|
|
95
|
-
flags.includes("--all-tools");
|
|
96
|
-
|
|
97
|
-
const adapterFlags = {
|
|
98
|
-
cursor: flags.includes("--cursor") || flags.includes("--all-tools"),
|
|
99
|
-
copilotChat: flags.includes("--copilot-chat") || flags.includes("--all-tools"),
|
|
100
|
-
antigravity: flags.includes("--antigravity") || flags.includes("--all-tools"),
|
|
101
|
-
codex: flags.includes("--codex") || flags.includes("--all-tools"),
|
|
102
|
-
};
|
|
73
|
+
flags.includes("--claude") || flags.includes("--all") || !isExplicitlyTargeted;
|
|
103
74
|
|
|
104
|
-
const
|
|
105
|
-
const raw = flags.find((f) => f.startsWith("--target="));
|
|
106
|
-
return raw ? raw.slice("--target=".length) : process.cwd();
|
|
107
|
-
})();
|
|
75
|
+
const forCopilot = flags.includes("--copilot") || flags.includes("--all");
|
|
108
76
|
|
|
109
77
|
const useSymlinks = flags.includes("--link");
|
|
110
78
|
const indexOnly = flags.includes("--index-only");
|
|
@@ -127,26 +95,6 @@ export async function runInstall(argv) {
|
|
|
127
95
|
if (forClaude) installClaude(installerCtx);
|
|
128
96
|
if (forCopilot) installCopilot(installerCtx);
|
|
129
97
|
|
|
130
|
-
if (anyAdapterRequested(adapterFlags)) {
|
|
131
|
-
if (dryRun) {
|
|
132
|
-
// Adapter installs merge marker-wrapped blocks into user-owned files;
|
|
133
|
-
// the preview lists the touched paths instead of threading dry-run
|
|
134
|
-
// through every adapter write site.
|
|
135
|
-
const planned = Object.entries(adapterFlags)
|
|
136
|
-
.filter(([, on]) => on)
|
|
137
|
-
.map(([name]) => name);
|
|
138
|
-
console.log(` [dry-run] would install adapter(s) ${planned.join(", ")} into ${adapterTarget}`);
|
|
139
|
-
} else {
|
|
140
|
-
await installAdapters({
|
|
141
|
-
pipelineRoot: PIPELINE_ROOT,
|
|
142
|
-
pipelineSrc: PIPELINE_SRC,
|
|
143
|
-
target: adapterTarget,
|
|
144
|
-
platformFilter: platformFlag,
|
|
145
|
-
flags: adapterFlags,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
98
|
if (dryRun) {
|
|
151
99
|
console.log("");
|
|
152
100
|
console.log(" Dry-run complete — nothing was written. Re-run without --dry-run to install.");
|
|
@@ -154,12 +102,7 @@ export async function runInstall(argv) {
|
|
|
154
102
|
return;
|
|
155
103
|
}
|
|
156
104
|
|
|
157
|
-
printSummary({
|
|
158
|
-
forClaude,
|
|
159
|
-
forCopilot,
|
|
160
|
-
adapterFlags,
|
|
161
|
-
adapterTarget,
|
|
162
|
-
});
|
|
105
|
+
printSummary({ forClaude, forCopilot });
|
|
163
106
|
|
|
164
107
|
// Fire-and-forget; install is already done.
|
|
165
108
|
sendInstallTelemetry({ packageRoot: PIPELINE_ROOT, flags });
|
|
@@ -182,7 +125,7 @@ function parsePlatformFlag(flags) {
|
|
|
182
125
|
}
|
|
183
126
|
|
|
184
127
|
function printSummary(opts) {
|
|
185
|
-
const { forClaude, forCopilot
|
|
128
|
+
const { forClaude, forCopilot } = opts;
|
|
186
129
|
|
|
187
130
|
console.log(" Installation complete!");
|
|
188
131
|
console.log("");
|
|
@@ -200,41 +143,6 @@ function printSummary(opts) {
|
|
|
200
143
|
console.log(" Just describe your task — Copilot will follow the pipeline");
|
|
201
144
|
console.log("");
|
|
202
145
|
}
|
|
203
|
-
if (adapterFlags.cursor) {
|
|
204
|
-
console.log(" Cursor (full orchestration):");
|
|
205
|
-
console.log(` Rules: ${adapterTarget}/.cursor/rules/multi-agent-*.mdc`);
|
|
206
|
-
console.log(` Subagents: ${adapterTarget}/.cursor/agents/ma-*.md (parallel review / explorer / triage)`);
|
|
207
|
-
console.log(` Command: ${adapterTarget}/.cursor/commands/multi-agent.md (run /multi-agent)`);
|
|
208
|
-
console.log(` MCP: ${adapterTarget}/.cursor/mcp.json (dev-toolkit)`);
|
|
209
|
-
console.log(" Pickers degrade per refs/picker-contract.md; hard gates -> advisory rules + CI.");
|
|
210
|
-
console.log("");
|
|
211
|
-
}
|
|
212
|
-
if (adapterFlags.copilotChat) {
|
|
213
|
-
console.log(" GitHub Copilot Chat (VS Code, full orchestration):");
|
|
214
|
-
console.log(` Instructions: ${adapterTarget}/.github/copilot-instructions.md + .github/instructions/multi-agent-*`);
|
|
215
|
-
console.log(` Agents: ${adapterTarget}/.github/agents/ma-*.agent.md (parallel review / explorer / triage)`);
|
|
216
|
-
console.log(` Command: ${adapterTarget}/.github/prompts/multi-agent.prompt.md (run /multi-agent)`);
|
|
217
|
-
console.log(` MCP: ${adapterTarget}/.vscode/mcp.json (dev-toolkit)`);
|
|
218
|
-
console.log(" Confirmations use VS Code native approval dialogs (refs/picker-contract.md).");
|
|
219
|
-
console.log("");
|
|
220
|
-
}
|
|
221
|
-
if (adapterFlags.antigravity) {
|
|
222
|
-
console.log(" Antigravity (full orchestration):");
|
|
223
|
-
console.log(` Rules: ${adapterTarget}/.agent/rules/multi-agent-*.md`);
|
|
224
|
-
console.log(` Workflow: ${adapterTarget}/.agent/workflows/multi-agent.md (run /multi-agent)`);
|
|
225
|
-
console.log(` Context: ${adapterTarget}/AGENTS.md (skill index, marker-wrapped)`);
|
|
226
|
-
console.log(` MCP: ${adapterTarget}/.agent/mcp_config.json (dev-toolkit)`);
|
|
227
|
-
console.log(" Note: .agent/ paths community-documented; confirm against current Antigravity docs.");
|
|
228
|
-
console.log("");
|
|
229
|
-
}
|
|
230
|
-
if (adapterFlags.codex) {
|
|
231
|
-
console.log(" OpenAI Codex CLI (global, sequential orchestration):");
|
|
232
|
-
console.log(" Command: ~/.codex/prompts/multi-agent.md (run /multi-agent)");
|
|
233
|
-
console.log(" Context: ~/.codex/AGENTS.md (skill index, marker-wrapped)");
|
|
234
|
-
console.log(" MCP: ~/.codex/config.toml ([mcp_servers.dev-toolkit])");
|
|
235
|
-
console.log(" Note: prompts + MCP are global; Codex has no subagent fan-out (review runs sequential).");
|
|
236
|
-
console.log("");
|
|
237
|
-
}
|
|
238
146
|
|
|
239
147
|
console.log(" For UI testing, also install the mobile MCP server:");
|
|
240
148
|
console.log(" Add to your MCP config: npx @mmerterden/dev-toolkit-mcp");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "10.
|
|
3
|
+
"version": "10.7.0",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI, Cursor, Antigravity, and VS Code Copilot Chat. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Opus triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -187,17 +187,7 @@ Launch Agent instances **in parallel** using the shared `code-reviewer` subagent
|
|
|
187
187
|
|
|
188
188
|
Each reviewer inherits the `code-reviewer` agent's focus areas (Security, Architecture, Quality, Performance) and output contract. The orchestrator overrides only the model and the stack-specific skill per-reviewer - no prompt duplication.
|
|
189
189
|
|
|
190
|
-
**Model override wiring:** `code-reviewer.md` declares `preferredModel:
|
|
191
|
-
|
|
192
|
-
**Adapter platforms (Cursor / Antigravity / VS Code Copilot Chat) - reviewer set.** The native trio above is a Claude-Code / Copilot-CLI capability. On the adapter platforms the pipeline configures a 2-model cross-vendor review using the models each platform actually exposes (lineup in `pipeline/adapters/_base.mjs#REVIEWER_MODELS`; update as the platforms ship new versions):
|
|
193
|
-
|
|
194
|
-
| Platform | Reviewer agents emitted | Models |
|
|
195
|
-
|---|---|---|
|
|
196
|
-
| Cursor | `ma-code-reviewer` + `ma-code-reviewer-x` (per-agent `model:` pinning is supported) | primary `inherit` (your selected model, usually Claude) + `gpt-5.5` |
|
|
197
|
-
| VS Code Copilot Chat | `ma-code-reviewer` + `ma-code-reviewer-x` (frontmatter `model:` takes the picker label) | `Claude Opus 4.8` + `GPT-5.5` |
|
|
198
|
-
| Antigravity | two parallel review agents (model chosen in the UI, not a file) | recommended `Gemini 3 Pro` + `Claude Opus 4.6`, set via the side-panel dropdown |
|
|
199
|
-
|
|
200
|
-
So cross-vendor review IS restored on the adapter platforms (two different models on the code review), with the stack architect + `ma-security-auditor` as before. Two honest caveats remain vs the native hosts: (1) the exact model availability depends on the user's subscription (a pinned model the user lacks must be swapped in `REVIEWER_MODELS` / the dropdown), and (2) there is no `PreToolUse` hook, so gates are workflow-enforced not OS-blocked. Antigravity's models are dropdown-selected, so its pair is documented in the workflow rather than file-pinned.
|
|
190
|
+
**Model override wiring:** `code-reviewer.md` declares `preferredModel: fable`, so Reviewer 1 uses the persona default (Fable 5). Reviewer 2 (Copilot-only, `gpt-5.4`) and Reviewer 3 (`claude-sonnet-4.6`) set `PHASE_MODEL_OVERRIDE=<model>` before dispatch - the orchestrator exports `CLAUDE_CODE_SUBAGENT_MODEL` on Claude Code, or passes `--model` on Copilot CLI. Full precedence rule: `skills/shared/core/multi-agent/SKILL.md#agent-dispatch--per-persona-model-routing-v610`. Fable dispatches are subject to the fallback contract (`refs/features/model-fallback.md`): dispatch-error retry walks `fable -> opus -> sonnet` and budget-ceiling downgrade.
|
|
201
191
|
|
|
202
192
|
**Stack-specific skills loaded per reviewer** (from Phase 1 `detectedStack`). On Claude Code, Reviewer 2 (GPT-5.4) is not dispatched - its skill column is ignored. On Copilot CLI all three columns are used.
|
|
203
193
|
|
|
@@ -799,7 +799,6 @@ Offer to make the secret scan a HARD pre-commit gate (a non-zero exit blocks the
|
|
|
799
799
|
- Ask (picker): "Install the pre-commit secret-scan hook into `~/.claude/settings.json`?" Default Yes.
|
|
800
800
|
- On Yes, deep-merge the template's `hooks.PreToolUse` into the user's `settings.json` (preserve any existing hooks; do not duplicate a matcher that already calls `pre-commit-check.sh`).
|
|
801
801
|
- Honest note to show: this is the only deterministic gate that is OS-enforceable as a hook (it needs no run-specific arguments). The evidence / consensus / intent / learnings gates are invoked by the pipeline phases with per-run arguments, so they are enforced by the phase contract + the installed gate scripts, not by a hook.
|
|
802
|
-
- On the adapter platforms (Cursor / Antigravity / VS Code Copilot Chat) there is no PreToolUse equivalent; the gate scripts live in `~/.multi-agent/` and are run as workflow steps. See `refs/picker-contract.md`.
|
|
803
802
|
### Step 9 - Default stack plugin enablement
|
|
804
803
|
|
|
805
804
|
Stack skills ship as versioned plugins in the `{owner}/multi-agent-plugins` marketplace. On first setup, wire the stack so the pipeline works out of the box.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "One-shot sync of the entire multi-agent ecosystem: Claude Code, Copilot CLI,
|
|
3
|
-
argument-hint: "[release] [--
|
|
2
|
+
description: "One-shot sync of the entire multi-agent ecosystem: Claude Code, Copilot CLI, pipeline repo, website, and remote-control."
|
|
3
|
+
argument-hint: "[release] [--platform=<macos|linux|windows>]"
|
|
4
4
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, WebFetch
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -14,9 +14,8 @@ When invoked, it synchronizes all 7 targets in order. It detects what changed, u
|
|
|
14
14
|
|
|
15
15
|
| Arg | Meaning |
|
|
16
16
|
|---|---|
|
|
17
|
-
| (none) | Full ecosystem sync:
|
|
17
|
+
| (none) | Full ecosystem sync: Claude Code, Copilot CLI, pipeline repo, website, remote-control. |
|
|
18
18
|
| `release` | Full sync + version bump + tag + npm publish + website deploy |
|
|
19
|
-
| `--no-adapters` | Skip Step 2b (per-project adapter refresh). Use when you want only the global targets and must not touch any project repo (e.g. mid-feature-branch in a project). |
|
|
20
19
|
| `--platform=<macos\|linux\|windows>` | Override automatic platform detection. For CI / cross-platform smoke. |
|
|
21
20
|
| `"change description"` | Apply the description to every target at once |
|
|
22
21
|
|
|
@@ -27,8 +26,6 @@ When invoked, it synchronizes all 7 targets in order. It detects what changed, u
|
|
|
27
26
|
| 0 | Figma source (deprecated) | `prefs.global.figmaSource.path` | skip (see memory `feedback_figma_source_deprecated`) |
|
|
28
27
|
| 1 | Claude Code (source of truth) | `~/.claude/commands/multi-agent.md` + `~/.claude/commands/multi-agent/` + `~/.claude/agents/` + `~/.claude/scripts/` + `~/.claude/lib/` | source |
|
|
29
28
|
| 2 | Copilot CLI | `~/.copilot/copilot-instructions.md` + `~/.copilot/skills/` | <- from Claude |
|
|
30
|
-
| 2a | OpenAI Codex CLI (global, auto when `~/.codex` present) | `~/.codex/prompts/multi-agent.md` + `~/.codex/AGENTS.md` + `~/.codex/config.toml` | <- from Claude |
|
|
31
|
-
| 2b | Cursor / Antigravity / Copilot Chat adapters (default; skip with `--no-adapters`) | `.cursor/rules/multi-agent.mdc`, `.github/copilot-instructions.md` in each project root | <- from Claude (template) |
|
|
32
29
|
| 3 | multi-agent-pipeline repo | `~/multi-agent-pipeline/pipeline/` | <- from Claude (genericized) |
|
|
33
30
|
| 4 | Website | `{owner}/{website-host}` | <- version + features |
|
|
34
31
|
| 5 | Remote Control | `{owner}/remote-control` | <- pipeline references |
|
|
@@ -62,13 +59,6 @@ Step 0: FIGMA_SYNC SKIP (deprecated - feedback_figma_source_deprecated)
|
|
|
62
59
|
Step 1: PLATFORM Detect macOS / Linux / Windows (Git Bash / WSL); export PLATFORM env
|
|
63
60
|
Step 1.5: DETECT Compare timestamps, find stale targets
|
|
64
61
|
Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 34 sub-command skills)
|
|
65
|
-
Step 2a: CODEX Claude Code -> Codex CLI (global ~/.codex prompt + AGENTS.md + config.toml mcp)
|
|
66
|
-
- runs via `node pipeline/scripts/sync-adapters.mjs`, which fires the
|
|
67
|
-
codex adapter ONCE (global) when `~/.codex` exists on this machine
|
|
68
|
-
Step 2b: ADAPTERS Cursor / Antigravity / Copilot Chat per-project rule files refresh
|
|
69
|
-
- RUNS BY DEFAULT: refreshes all projectsTouched[] targets + the pipeline repo
|
|
70
|
-
- `--no-adapters` skips this step entirely
|
|
71
|
-
- writes files + a LOCAL commit per project; push stays the user's call
|
|
72
62
|
Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub, bash -n on all sh)
|
|
73
63
|
Step 3c: PLUGINS pipeline shared/external -> multi-agent-plugins marketplace (rebuild knowledge/,
|
|
74
64
|
bump changed plugins' patch version, commit + push the plugins repo)
|
|
@@ -134,65 +124,6 @@ If nothing is stale → report "All targets up to date" and stop.
|
|
|
134
124
|
4. **Do not duplicate** - summary in Copilot, full spec in Claude. Keep this distinction.
|
|
135
125
|
5. **Report** - show a short diff summary after sync
|
|
136
126
|
|
|
137
|
-
## Step 2b - Per-Project Adapter Sync (default; skip with `--no-adapters`)
|
|
138
|
-
|
|
139
|
-
Cursor and GitHub Copilot Chat do not have global skill directories like Claude Code (`~/.claude/`) or Copilot CLI (`~/.copilot/`). They consume the pipeline through a separate rule file per project. So for them, sync runs **per-project**, over every repo in `prefs.global.projectsTouched[]`.
|
|
140
|
-
|
|
141
|
-
This step RUNS BY DEFAULT. The only side effect on a project repo is a refresh of the marker-wrapped adapter files plus a LOCAL commit; **push is never automatic** (see below), so sync cannot publish anything to a project's remote on its own. If you still need to keep a project repo completely untouched this run (e.g. you are mid-feature-branch and do not want even a local commit), pass `--no-adapters` to skip the step.
|
|
142
|
-
|
|
143
|
-
| Adapter | Per-project files | Created by setup |
|
|
144
|
-
|---|---|---|
|
|
145
|
-
| Cursor | `.cursor/rules/multi-agent-*.mdc` + `.cursor/agents/ma-*.md` + `.cursor/commands/multi-agent.md` + `.cursor/mcp.json` | `multi-agent:setup` `--cursor` flag |
|
|
146
|
-
| Antigravity | `.agent/rules/multi-agent-*.md` + `.agent/workflows/multi-agent.md` + `AGENTS.md` + `.agent/mcp_config.json` | `multi-agent:setup` `--antigravity` flag |
|
|
147
|
-
| Copilot Chat (VS Code) | `.github/copilot-instructions.md` + `.github/agents/ma-*.agent.md` + `.github/prompts/multi-agent.prompt.md` + `.vscode/mcp.json` | `multi-agent:setup` `--copilot-chat` flag |
|
|
148
|
-
|
|
149
|
-
These three are FULL-orchestration adapters (subagents/workflow + a `/multi-agent` command + the dev-toolkit MCP server), not just knowledge layers. Claude Code and Copilot CLI run the pipeline natively and are synced via the global flow above, not here.
|
|
150
|
-
|
|
151
|
-
**OpenAI Codex CLI is NOT in this per-project table.** Codex is a global-config tool: its custom prompts and MCP servers live under `~/.codex/` and there is no per-project prompt directory. So Codex is synced in the GLOBAL flow (Step 2a), not per-project - `sync-adapters.mjs` fires the codex adapter once when `~/.codex` exists, writing `~/.codex/prompts/multi-agent.md`, `~/.codex/AGENTS.md`, and the `[mcp_servers.dev-toolkit]` block in `~/.codex/config.toml`. Installed via `multi-agent:setup` `--codex` flag (or `node install.js --codex`). Codex has no subagent fan-out, so the Phase 4 parallel review degrades to a sequential adversarial two-pass.
|
|
152
|
-
|
|
153
|
-
### Flow
|
|
154
|
-
|
|
155
|
-
Adapter sync orchestration goes through `pipeline/scripts/sync-adapters.mjs` - this script discovers per-project marker files (`.cursor*`, `.github/copilot-instructions.md`, `.agent`/`AGENTS.md`) and dispatches the matching adapter module (`pipeline/adapters/{cursor,copilot-chat,antigravity}.mjs`, each of which also emits its orchestration layer).
|
|
156
|
-
|
|
157
|
-
1. Read the `prefs.global.projectsTouched[]` list (LRU, max 20 entries). Each entry is in the form `{ path, adapters: [...] }`: a record of which adapters are installed in that project.
|
|
158
|
-
|
|
159
|
-
2. One command, all projects:
|
|
160
|
-
```bash
|
|
161
|
-
node pipeline/scripts/sync-adapters.mjs --all
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
For each target the script:
|
|
165
|
-
- If a `.cursor/` or `.cursorrules` marker is present, runs the **cursor** adapter → `pipeline/adapters/cursor.mjs install()` emits 174+ `.cursor/rules/multi-agent-*.mdc` files + one legacy `.cursorrules` digest.
|
|
166
|
-
- If a `.copilot/` or `.github/copilot-instructions.md` marker is present, runs the **copilot-chat** adapter.
|
|
167
|
-
- The pipeline repo itself (when `pipeline/` + `.git/` are present) always gets the cursor sync - the maintainer's canonical cursor consumer.
|
|
168
|
-
- If no marker is present, skips (`[skip]`).
|
|
169
|
-
|
|
170
|
-
3. Dry-run view:
|
|
171
|
-
```bash
|
|
172
|
-
node pipeline/scripts/sync-adapters.mjs --doctor
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
4. Single-project refresh (this repo or another target):
|
|
176
|
-
```bash
|
|
177
|
-
node pipeline/scripts/sync-adapters.mjs --target=/path/to/repo --platform=ios
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
5. Commits are made separately per project (no cross-project commit):
|
|
181
|
-
```bash
|
|
182
|
-
cd "$PROJ"
|
|
183
|
-
if ! git diff --cached --quiet; then
|
|
184
|
-
git commit -m "chore(adapter): sync multi-agent rules"
|
|
185
|
-
# NOTE: push is not automatic - it's the user's call. Sync only makes a local commit.
|
|
186
|
-
fi
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
4. Push is **not automatic**. Adapter sync leaves the commit local by default; the push decision for each project branch is the user's (whether the project branch is shared requires external knowledge).
|
|
190
|
-
|
|
191
|
-
### Skip conditions
|
|
192
|
-
|
|
193
|
-
- If `--no-adapters` is given, Step 2b is skipped entirely (the report says "skipped (--no-adapters)").
|
|
194
|
-
- `prefs.global.projectsTouched[]` empty -> "no project adapter installs recorded - run `multi-agent:setup` in a project first". Step 2b is a no-op (nothing to refresh), not an error.
|
|
195
|
-
- Project directory deleted -> the entry is subject to LRU pruning (sync does not error there).
|
|
196
127
|
|
|
197
128
|
---
|
|
198
129
|
|
|
@@ -340,7 +271,7 @@ When invoked with the `release` argument:
|
|
|
340
271
|
|
|
341
272
|
## Sub-Command Sync (Claude Code <-> Copilot CLI Skills)
|
|
342
273
|
|
|
343
|
-
This
|
|
274
|
+
This runs on the Claude <-> Copilot axis — the two CLIs the pipeline supports natively.
|
|
344
275
|
|
|
345
276
|
| Claude Code | Copilot CLI |
|
|
346
277
|
|-------------|-------------|
|
|
@@ -51,6 +51,15 @@ Update the pipeline in one command. Existing preferences are preserved; only ski
|
|
|
51
51
|
fi
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
4c. **Prune retired adapter files** (Cursor / Antigravity / Codex / Copilot Chat were removed in v10.7.0 — the pipeline now targets Claude Code + Copilot CLI only):
|
|
55
|
+
```bash
|
|
56
|
+
# Global Codex adapter prompt is safe to remove (no longer produced).
|
|
57
|
+
rm -f "$HOME/.codex/prompts/multi-agent.md"
|
|
58
|
+
echo " -> pruned retired global Codex adapter prompt (if present)"
|
|
59
|
+
# Per-project adapter files (.cursor/, .agent/, .github/copilot-instructions.md)
|
|
60
|
+
# live in your repos and are left untouched — remove them manually if you like.
|
|
61
|
+
```
|
|
62
|
+
|
|
54
63
|
5. **Migrate preferences** (if there is an old schema):
|
|
55
64
|
```bash
|
|
56
65
|
if [ -f "$HOME/.claude/scripts/migrate-prefs.mjs" ]; then
|
|
@@ -226,13 +226,6 @@ if grep -q '"reviewerCount"' "$TRSCHEMA" && grep -qi "Claude Code = 2, Copilot C
|
|
|
226
226
|
else
|
|
227
227
|
fail "triage consensus.reviewerCount does not document the 2/3 split"
|
|
228
228
|
fi
|
|
229
|
-
# The 3 adapter platforms must document their concrete reviewer set (a 2-model
|
|
230
|
-
# cross-vendor review configured to each platform's available models).
|
|
231
|
-
if grep -qi "Adapter platforms" "$P4" && grep -qi "cross-vendor" "$P4" && grep -q "ma-code-reviewer-x" "$P4"; then
|
|
232
|
-
pass "phase-4-review documents the adapter-platform cross-vendor reviewer set"
|
|
233
|
-
else
|
|
234
|
-
fail "phase-4-review does not document the adapter-platform reviewer set"
|
|
235
|
-
fi
|
|
236
229
|
|
|
237
230
|
echo ""
|
|
238
231
|
echo "══ cross-cli-behavior smoke: $PASS passed, $FAIL failed ══"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# the same on-disk output as the pre-v8.0.0 monolithic installer.
|
|
5
5
|
#
|
|
6
6
|
# v8.0.0 split install.js (1246 LOC) into ./install/{index,claude,copilot,
|
|
7
|
-
# _common,_platform-filter,_telemetry,
|
|
7
|
+
# _common,_platform-filter,_telemetry,_dev-only-files,
|
|
8
8
|
# _copilot-instructions}.mjs. The legacy install.js stayed as a thin shim
|
|
9
9
|
# that imports install/index.mjs and calls runInstall(process.argv).
|
|
10
10
|
#
|
|
@@ -66,7 +66,6 @@ expected_modules=(
|
|
|
66
66
|
"_common.mjs"
|
|
67
67
|
"_platform-filter.mjs"
|
|
68
68
|
"_telemetry.mjs"
|
|
69
|
-
"_adapters.mjs"
|
|
70
69
|
"_copilot-instructions.mjs"
|
|
71
70
|
"_dev-only-files.mjs"
|
|
72
71
|
)
|
package/install/_adapters.mjs
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Third-party adapter dispatch.
|
|
3
|
-
*
|
|
4
|
-
* Each adapter (Cursor / Copilot Chat) is dynamically imported only when its
|
|
5
|
-
* flag is set, so the default Claude / Copilot install path stays free of
|
|
6
|
-
* adapter module load cost.
|
|
7
|
-
*
|
|
8
|
-
* As of v8.5.4 the previously-shipped Windsurf / Cline / Zed / Continue
|
|
9
|
-
* adapters were removed — pipeline owner did not use them, and keeping them
|
|
10
|
-
* green added smoke-test surface for no real benefit. Their files were
|
|
11
|
-
* deleted from `pipeline/adapters/`. Reintroducing any of them is a one-file
|
|
12
|
-
* add against `_base.mjs`.
|
|
13
|
-
*
|
|
14
|
-
* @module install/_adapters
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { join } from "path";
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @typedef {object} AdapterFlags
|
|
21
|
-
* @property {boolean} cursor
|
|
22
|
-
* @property {boolean} copilotChat
|
|
23
|
-
* @property {boolean} antigravity
|
|
24
|
-
* @property {boolean} codex
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* @param {AdapterFlags} flags
|
|
29
|
-
* @returns {boolean}
|
|
30
|
-
*/
|
|
31
|
-
export function anyAdapterRequested(flags) {
|
|
32
|
-
return flags.cursor || flags.copilotChat || flags.antigravity || flags.codex;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* @param {{
|
|
37
|
-
* pipelineRoot: string,
|
|
38
|
-
* pipelineSrc: string,
|
|
39
|
-
* target: string,
|
|
40
|
-
* platformFilter: "ios"|"android"|"all",
|
|
41
|
-
* flags: AdapterFlags,
|
|
42
|
-
* }} ctx
|
|
43
|
-
*/
|
|
44
|
-
export async function installAdapters(ctx) {
|
|
45
|
-
const { pipelineRoot, target, platformFilter, flags } = ctx;
|
|
46
|
-
console.log("");
|
|
47
|
-
console.log(" Third-party tool adapters (knowledge layer only)");
|
|
48
|
-
console.log(` Target: ${target}`);
|
|
49
|
-
console.log("");
|
|
50
|
-
|
|
51
|
-
const adapterCommonOpts = {
|
|
52
|
-
pipelineSrc: ctx.pipelineSrc,
|
|
53
|
-
target,
|
|
54
|
-
platformFilter,
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const adapterTargets = [
|
|
58
|
-
flags.cursor && "./pipeline/adapters/cursor.mjs",
|
|
59
|
-
flags.copilotChat && "./pipeline/adapters/copilot-chat.mjs",
|
|
60
|
-
flags.antigravity && "./pipeline/adapters/antigravity.mjs",
|
|
61
|
-
flags.codex && "./pipeline/adapters/codex.mjs",
|
|
62
|
-
].filter(Boolean);
|
|
63
|
-
|
|
64
|
-
for (const modPath of adapterTargets) {
|
|
65
|
-
try {
|
|
66
|
-
const adapter = (await import(join(pipelineRoot, modPath))).default;
|
|
67
|
-
console.log(` [${adapter.name}] Installing...`);
|
|
68
|
-
adapter.install(adapterCommonOpts);
|
|
69
|
-
} catch (e) {
|
|
70
|
-
console.error(` -> Adapter load failed (${modPath}): ${e.message}`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|