@mmerterden/multi-agent-pipeline 16.6.0 → 16.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 +14 -0
- package/README.md +4 -4
- package/README.tr.md +4 -4
- package/docs/architecture.md +2 -2
- package/docs/ecosystem.md +5 -5
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/feedback/SKILL.md +51 -0
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +32 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +12 -9
- package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
- package/pipeline/multi-agent-refs/analysis/review.md +86 -0
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -7
- package/pipeline/scripts/feedback-send.mjs +181 -0
- package/pipeline/scripts/website-deploy-commit.sh +6 -1
- package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +30 -0
- package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +31 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +12 -9
package/CHANGELOG.md
CHANGED
|
@@ -26,6 +26,20 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
26
26
|
|
|
27
27
|
- **`smoke-website-deploy-identity.sh` (20 assertions).** It runs the script against throwaway repos with real remotes rather than grepping the doc: the happy path lands and pushes, an exported `GIT_AUTHOR_EMAIL` halts with the commit still local, an unchanged tree makes no empty commit, a matching config is preserved while a wrong name is corrected, and missing or non-repository arguments exit 2. Wiring is asserted separately, since a correct script nothing calls is its own failure mode.
|
|
28
28
|
|
|
29
|
+
## [16.7.0] - 2026-08-25
|
|
30
|
+
|
|
31
|
+
Two commands: one that reviews the document instead of the diff, one that lets a user say something went wrong.
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- **`/multi-agent:review-analysis`** reviews a written analysis the way `/multi-agent:review` reviews a diff. It resolves the document from a local path, a Confluence page or a Jira issue, runs the deterministic gates FIRST and reports their output verbatim (`validate-analysis-doc.mjs`, and `build-references.mjs --check` when a state JSON is available), then runs the parallel model review and triage. Findings cite `Locked <n>` where a rule applies, because "I would have written this differently" gives an author nothing to act on while "Locked 34: this Confluence page is in the evidence record but not in Section 21" gives them a fix and a reason; anything with no rule behind it is marked as judgement rather than dressed up as a violation. The verdict states what was NOT checked - without a state file the references coverage claim is exactly the one nobody can verify from the document alone. It never edits the reviewed document: that belongs to its author, and a reviewer who rewrites it has removed the choice to disagree. `/multi-agent:analysis-resolve` remains the command that folds answers back in.
|
|
36
|
+
- **`/multi-agent:feedback "<message>"`** sends one message to the maintainer. **Only the text the user types is sent** - plus the pipeline version, the host CLI and a timestamp, which a report is useless without. No logs, no repo names, no branch names, no file paths, no diffs. That limit is deliberate: this package installs from a public registry, so an automatic log attachment would take a corporate user's internal identifiers off their machine and into someone else's database. A person can paste the one line that matters; a script cannot know which line that is. The exact payload is printed before anything is sent and nothing leaves the machine without a confirmation, autopilot included - a message to a person is never fired unattended. Auth reuses the usage ingest token, so nothing new is onboarded; `usageLog.optOut` does not silence it, because telemetry is passive collection while this is a deliberate act, and silently dropping something somebody chose to send is worse than not offering the command. A send failure is reported rather than swallowed: the person is waiting to hear whether their message went.
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- **The analysis context-budget gate measures the refs the command declares, not a directory glob.** `multi-agent-refs/analysis/` also holds sibling-command refs - `resolve.md` belongs to `:analysis-resolve`, `review.md` to `:review-analysis` - and an analysis run loads neither, so the glob billed every run for files it never reads. The ceiling goes back to 145000 (from the 155000 v16.6.0 set): with the measurement corrected the real per-run cost is 139672, and that raise had been compensating for the glob rather than for anything the tree costs. A ceiling raised to fit a wrong number stops being a budget. Adding a ref to the analysis command now counts automatically; adding one for a sibling command does not.
|
|
41
|
+
- The command surface is 53. Both new commands carry their `shared/core` counterpart for Copilot and Codex, and the canonical inventory in `cross-cli-contract.md` and both sync skills lists them - `smoke-command-inventory.sh` fails on any of those going stale, and did, which is how the gap was found rather than shipped.
|
|
42
|
+
|
|
29
43
|
## [16.6.0] - 2026-08-25
|
|
30
44
|
|
|
31
45
|
Two analysis standards, one evidence record, and a references section that is built rather than remembered.
|
package/README.md
CHANGED
|
@@ -77,7 +77,7 @@ The discipline behind all of this - bounded loops, evidence gates, token-budgete
|
|
|
77
77
|
| Audit | `/multi-agent:design-check` | Mock-mode vs Figma conformance, local-only |
|
|
78
78
|
| Audit | `/multi-agent:testflight-validation` | Pre-submission gates for a TestFlight build: static archive audit → Apple's `altool --validate-app` → Review-Guidelines check. Validates only, never uploads |
|
|
79
79
|
|
|
80
|
-
Helpers: `setup`, `status`, `resume #N`, `kill #N`, `garbage-collect`, `prune-logs`, `purge`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`.
|
|
80
|
+
Helpers: `setup`, `status`, `resume #N`, `kill #N`, `garbage-collect`, `prune-logs`, `purge`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`. 53 commands in all - full list: `/multi-agent:help`.
|
|
81
81
|
|
|
82
82
|
## Stacks
|
|
83
83
|
|
|
@@ -91,13 +91,13 @@ This enables the matching plugin (+ the shared `ai-common` plugin) in the repo's
|
|
|
91
91
|
|
|
92
92
|
## Tool support
|
|
93
93
|
|
|
94
|
-
The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same
|
|
94
|
+
The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 53 commands.
|
|
95
95
|
|
|
96
96
|
| Tool | Flag | What it installs |
|
|
97
97
|
|---|---|---|
|
|
98
98
|
| Claude Code | `--claude` (default) | slash commands + skills + agents + `PreToolUse` secret-scan hook |
|
|
99
|
-
| Copilot CLI | `--copilot` | instructions +
|
|
100
|
-
| Codex CLI | `--codex` | one router skill +
|
|
99
|
+
| Copilot CLI | `--copilot` | instructions + 53 sub-command skills + scripts |
|
|
100
|
+
| Codex CLI | `--codex` | one router skill + 53 specs as refs + 8 agent TOML + `AGENTS.md` block + `codex mcp add` |
|
|
101
101
|
|
|
102
102
|
Filter skills by stack with `--platform=ios\|android\|all`.
|
|
103
103
|
|
package/README.tr.md
CHANGED
|
@@ -76,7 +76,7 @@ Bunun arkasındaki disiplin - sınırlı loop'lar, kanıt kapıları, token-büt
|
|
|
76
76
|
| Audit | `/multi-agent:design-check` | Mock-mode vs Figma uygunluğu, yalnızca lokal |
|
|
77
77
|
| Audit | `/multi-agent:testflight-validation` | TestFlight build için pre-submission kapıları: statik archive denetimi → Apple'ın `altool --validate-app`'i → Review-Guidelines kontrolü. Yalnızca doğrular, asla yüklemez |
|
|
78
78
|
|
|
79
|
-
Yardımcılar: `setup`, `status`, `resume #N`, `kill #N`, `garbage-collect`, `prune-logs`, `purge`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`. Toplam
|
|
79
|
+
Yardımcılar: `setup`, `status`, `resume #N`, `kill #N`, `garbage-collect`, `prune-logs`, `purge`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`, `save`, `routines`, `forget`. Toplam 53 komut - tam liste: `/multi-agent:help`.
|
|
80
80
|
|
|
81
81
|
## Stack'ler
|
|
82
82
|
|
|
@@ -90,13 +90,13 @@ Bu, ilgili plugin'i (+ ortak `ai-common` plugin'ini) repo'nun `.claude/settings.
|
|
|
90
90
|
|
|
91
91
|
## Araç desteği
|
|
92
92
|
|
|
93
|
-
Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı
|
|
93
|
+
Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 53 komutu alır.
|
|
94
94
|
|
|
95
95
|
| Araç | Bayrak | Ne kurar |
|
|
96
96
|
|---|---|---|
|
|
97
97
|
| Claude Code | `--claude` (varsayılan) | slash komutları + skill'ler + agent'lar + `PreToolUse` secret-scan hook'u |
|
|
98
|
-
| Copilot CLI | `--copilot` | talimatlar +
|
|
99
|
-
| Codex CLI | `--codex` | bir router skill + ref olarak
|
|
98
|
+
| Copilot CLI | `--copilot` | talimatlar + 53 alt-komut skill'i + script'ler |
|
|
99
|
+
| Codex CLI | `--codex` | bir router skill + ref olarak 53 spec + 8 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
|
|
100
100
|
|
|
101
101
|
Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
|
|
102
102
|
|
package/docs/architecture.md
CHANGED
|
@@ -117,7 +117,7 @@ graph TB
|
|
|
117
117
|
end
|
|
118
118
|
|
|
119
119
|
subgraph "Pipeline Specs"
|
|
120
|
-
CMD[commands/<br/>
|
|
120
|
+
CMD[commands/<br/>53 command files]
|
|
121
121
|
AGT[agents/<br/>8 agent personas]
|
|
122
122
|
RUL[rules/<br/>12 domain rules]
|
|
123
123
|
PHS[multi-agent-refs/phases/<br/>phase specs + contracts]
|
|
@@ -170,7 +170,7 @@ revisions of this diagram - Codex CLI and the two independently-shipped repos
|
|
|
170
170
|
graph TD
|
|
171
171
|
CC["Claude Code<br/>(source of truth)"]
|
|
172
172
|
COP["Copilot CLI<br/>(instructions + 51 skills)"]
|
|
173
|
-
COD["Codex CLI<br/>(1 router skill +
|
|
173
|
+
COD["Codex CLI<br/>(1 router skill + 53 refs)"]
|
|
174
174
|
REPO["Pipeline Repo<br/>(npm package)"]
|
|
175
175
|
WEB["Website"]
|
|
176
176
|
PLUGREPO["multi-agent-plugins<br/>(5 stack plugins, own repo)"]
|
package/docs/ecosystem.md
CHANGED
|
@@ -5,7 +5,7 @@ separately, wired together at install time and at run time:
|
|
|
5
5
|
|
|
6
6
|
| Repo | What it owns | Ships as |
|
|
7
7
|
|---|---|---|
|
|
8
|
-
| **`multi-agent-pipeline`** (this repo) | Orchestration: the 8-phase flow, the
|
|
8
|
+
| **`multi-agent-pipeline`** (this repo) | Orchestration: the 8-phase flow, the 53 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
|
|
9
9
|
| **`multi-agent-plugins`** | Stack knowledge: per-platform component/lifecycle skills (iOS, Android, Frontend, Backend) + shared knowledge | Claude Code marketplace, 5 independently-versioned plugins |
|
|
10
10
|
| **`multi-agent-toolkit-mcp`** | The pipeline's hands on devices and browsers: 80 MCP tools across 6 categories (simulator/emulator control, accessibility audit, store compliance, web automation, Figma-vs-mock design audit, an agent-DSL batch runner) | npm package, registered as a standard stdio MCP server on every host |
|
|
11
11
|
|
|
@@ -18,7 +18,7 @@ Either can be swapped or removed without touching the other two's source.
|
|
|
18
18
|
graph LR
|
|
19
19
|
subgraph PIPE ["multi-agent-pipeline (orchestrator)"]
|
|
20
20
|
direction TB
|
|
21
|
-
PHASES["8 phases ·
|
|
21
|
+
PHASES["8 phases · 53 commands"]
|
|
22
22
|
GATES["deterministic gates + review triage"]
|
|
23
23
|
end
|
|
24
24
|
|
|
@@ -64,8 +64,8 @@ only those:
|
|
|
64
64
|
graph TD
|
|
65
65
|
CC["Claude Code<br/>~/.claude/commands/multi-agent/<br/>(source of truth)"]
|
|
66
66
|
|
|
67
|
-
CC -->|"Step 2: copy + reformat<br/>
|
|
68
|
-
CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill +
|
|
67
|
+
CC -->|"Step 2: copy + reformat<br/>53 sub-command skills"| COP["Copilot CLI<br/>~/.copilot/skills/"]
|
|
68
|
+
CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill + 53 refs<br/>+ 8 agent TOML"]
|
|
69
69
|
CC -->|"Step 3: genericize<br/>(strip personal data)"| REPO["multi-agent-pipeline repo<br/>pipeline/"]
|
|
70
70
|
CC -->|"Step 4: version + feature sync"| WEB["Website<br/>projects.ts / i18n.tsx"]
|
|
71
71
|
|
|
@@ -153,7 +153,7 @@ measurements behind this table):
|
|
|
153
153
|
|
|
154
154
|
| | Claude Code | Copilot CLI | Codex CLI |
|
|
155
155
|
|---|---|---|---|
|
|
156
|
-
| **Pipeline commands** |
|
|
156
|
+
| **Pipeline commands** | 53 slash-command skills, native | 53 skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 53 command specs as reference files - Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
|
|
157
157
|
| **Stack plugins** | Marketplace plugin, loaded natively, resolved by `.claude/settings.json` enabled-list | Enabled plugin's authored skills copied flat into `~/.copilot/skills/`; `knowledge/` **not** re-copied (already delivered via `shared/external`) | Copied as reference files under `~/.codex/multi-agent-refs/skills/`, plugin-prefixed on name clash (e.g. `architecture` → `ai-ios-toolkit-architecture`) |
|
|
158
158
|
| **Component dispatch (Phase 3)** | Marketplace plugin's `create-component`/`create-screen` skill via the Skill tool | No plugin loader - the enabled stack plugin's authored skills (incl. `create-component`) are copied flat into `~/.copilot/skills/` at install time (the old frozen `figma-*` copies are pruned, they were never a fallback) | Not part of the enforced parity axis; classification + state-shape must match, skill *inventory* does not |
|
|
159
159
|
| **multi-agent-toolkit-mcp** | `claude mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` | `copilot mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` | `codex mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` (skipped with a warning if `codex` isn't on `PATH`) |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.7.0",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable 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",
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Send one message to the maintainer: a bug, an idea or a question. Only the text you type is sent - no logs, no repo names, no paths. Shows the payload and asks before sending."
|
|
3
|
+
description-tr: "Bakımcıya tek mesaj gönderir: hata, fikir ya da soru. Yalnızca yazdığın metin gider - log yok, repo adı yok, yol yok. Göndermeden önce içeriği gösterip onay ister."
|
|
4
|
+
argument-hint: "\"<message>\" [bug | idea | question] - with no argument, you are asked for the text"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# multi-agent feedback - tell the maintainer
|
|
8
|
+
|
|
9
|
+
**Input**: $ARGUMENTS
|
|
10
|
+
|
|
11
|
+
One message, sent to the maintainer's admin panel. This exists because the alternative is a problem nobody hears about: a run goes wrong, the person shrugs and works around it, and the same defect is still there a month later.
|
|
12
|
+
|
|
13
|
+
## What is sent
|
|
14
|
+
|
|
15
|
+
**Only the text you type**, plus three fields the report is useless without:
|
|
16
|
+
|
|
17
|
+
| Field | Why |
|
|
18
|
+
|---|---|
|
|
19
|
+
| `text` | What you wrote. Verbatim, up to 4000 characters. |
|
|
20
|
+
| `kind` | `bug`, `idea` or `question`. |
|
|
21
|
+
| `v` | The installed pipeline version - a report against 16.4 and one against 16.6 are different reports. |
|
|
22
|
+
| `host` | Claude Code, Copilot CLI or Codex CLI - a bug that only reproduces on one host is a different bug. |
|
|
23
|
+
| `at` | When you sent it. |
|
|
24
|
+
|
|
25
|
+
**No logs are attached, ever.** Not the agent log, not the diff, not the repo name, not the branch, not a file path. That is a deliberate limit rather than an oversight: this package installs from a public registry, so an automatic log attachment would take a corporate user's internal identifiers off their machine and into someone else's database. You can paste the one line you think matters - a script cannot know which line that is, so it does not guess.
|
|
26
|
+
|
|
27
|
+
## Flow
|
|
28
|
+
|
|
29
|
+
1. Take the message from `$ARGUMENTS`. With no argument, ask for it (free text) and then ask the kind.
|
|
30
|
+
2. **Print the exact payload that will be sent**, as JSON, using the script's own dry run so what is shown is what goes:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
node "$HOME/.claude/scripts/feedback-send.mjs" --text "<message>" --kind <kind> --dry-run
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. **Ask for confirmation.** Nothing leaves the machine before a yes. This is an outward-facing action and the pipeline confirms those; showing the payload first is what makes the yes meaningful. Autopilot does not exempt this - a message to a person is never something to fire unattended.
|
|
37
|
+
4. Send:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
node "$HOME/.claude/scripts/feedback-send.mjs" --text "<message>" --kind <kind>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
5. Report the result plainly. A failure is surfaced, not swallowed: the person is waiting to hear whether their message went, and silence would leave them believing they had been heard.
|
|
44
|
+
|
|
45
|
+
## Auth and reachability
|
|
46
|
+
|
|
47
|
+
Reuses the usage ingest token (`prefs.global.keychainMapping.usage_ingest`), so nothing extra has to be onboarded - `/multi-agent:update` registers one on first run. With no token, the command says so and names the command that fixes it rather than failing quietly.
|
|
48
|
+
|
|
49
|
+
`usageLog.optOut` does **not** silence this. Telemetry is passive collection and opting out of it is a real choice; feedback is a deliberate act by the person typing the command, and dropping a message somebody chose to send would be worse than not offering the command at all.
|
|
50
|
+
|
|
51
|
+
The endpoint must be TLS. The token rides in a header, so plain http would put it on the wire in cleartext; only loopback is exempt, for local development.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Review a written analysis document instead of a diff: resolve it from a path, a Confluence page or a Jira issue, run the deterministic gates first, then a parallel model review. Findings cite the Locked rule they break. Never edits the document."
|
|
3
|
+
description-tr: "Diff yerine yazılmış analiz dokümanını review eder: yol, Confluence sayfası veya Jira issue'sundan getirir, önce deterministik geçitleri koşar, sonra paralel model review. Bulgular ihlal edilen Locked kuralını gösterir. Dokümanı düzenlemez."
|
|
4
|
+
argument-hint: "[path | Confluence URL | pageId | JIRA-KEY] [--state <state.json>] - optional; with no argument, pick from recent analyses"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# multi-agent review-analysis - analysis document review
|
|
8
|
+
|
|
9
|
+
**Input**: $ARGUMENTS
|
|
10
|
+
|
|
11
|
+
`/multi-agent:review` judges a diff. This judges the document that diff was supposed to come from, before anyone writes the code it describes. No worktree, no branch, no commit, and the reviewed document is never edited in place.
|
|
12
|
+
|
|
13
|
+
## Flow
|
|
14
|
+
|
|
15
|
+
Read `$HOME/.claude/multi-agent-refs/analysis/review.md` and execute it:
|
|
16
|
+
|
|
17
|
+
1. **Resolve** the document from a local path, a Confluence URL or `pageId`, or a Jira key. With no argument, offer the recent analyses from `~/Desktop/multiAgentAnalysis/` and from each selected repo's `analysis/`, newest first.
|
|
18
|
+
2. **Deterministic gates first**: `validate-analysis-doc.mjs` on the document, and `build-references.mjs --check` when the run's state JSON is available (`--state`, or a fresh analysis). Their output is reported verbatim, before any model reads the document. A finding a script already proves does not need an opinion.
|
|
19
|
+
3. **Parallel model review** against the rubric (buildability, evidence, spine, altitude, admitted gaps, contradiction), CLI-aware: 2 models on Claude Code, 3 on Copilot CLI.
|
|
20
|
+
4. **Fable triage** into Blocker / Important / Suggestion, dropping duplicates and anything the document answers elsewhere.
|
|
21
|
+
5. **Report**, naming the profile it judged against and, explicitly, what was NOT checked.
|
|
22
|
+
6. **Output** on request only: chat (default), Confluence comment, Jira comment, or a `-review.md` beside the document.
|
|
23
|
+
|
|
24
|
+
## Why it cites Locked decisions
|
|
25
|
+
|
|
26
|
+
The analysis flow already declares 35 Locked decisions and two deterministic validators. A reviewer that says "I would have written this differently" gives the author nothing to act on; one that says "Locked 34: the Confluence page is in the evidence record but not in Section 21" gives them a fix and a reason. Findings that map to no rule are still allowed, but they are marked as judgement, not dressed up as a violation.
|
|
27
|
+
|
|
28
|
+
## What it never does
|
|
29
|
+
|
|
30
|
+
- Edits the reviewed document. The document belongs to its author; a reviewer who rewrites it has removed the choice to disagree. `/multi-agent:analysis-resolve` is the command that folds answers back in.
|
|
31
|
+
- Touches a Jira description or a Confluence page body. Comments only.
|
|
32
|
+
- Chains into a dev run, creates a branch, or commits.
|
|
@@ -59,7 +59,7 @@ Run every step automatically:
|
|
|
59
59
|
```
|
|
60
60
|
Step 1: PLATFORM Detect macOS / Linux / Windows (Git Bash / WSL); export PLATFORM env
|
|
61
61
|
Step 1.5: DETECT Compare timestamps, find stale targets
|
|
62
|
-
Step 2: COPILOT Claude Code -> Copilot CLI (instructions +
|
|
62
|
+
Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 53 sub-command skills)
|
|
63
63
|
Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + 51 specs as refs + 8 agent TOML)
|
|
64
64
|
Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub, bash -n on all sh)
|
|
65
65
|
Step 3c: PLUGINS pipeline shared/external -> multi-agent-plugins marketplace (rebuild knowledge/,
|
|
@@ -166,7 +166,7 @@ If nothing is stale → report "All targets up to date" and stop.
|
|
|
166
166
|
Unlike the Copilot step, this one does **not** hand-copy files. The Codex tree is a
|
|
167
167
|
*transform* of the Claude tree, not a mirror of it, and the transform is real work:
|
|
168
168
|
|
|
169
|
-
- the
|
|
169
|
+
- the 53 sub-command specs become reference files, because Codex silently truncates
|
|
170
170
|
its skills block (see `cross-cli-contract.md` 2.6 for the measurement)
|
|
171
171
|
- every `$HOME/.claude/...` reference to a CLI-owned tree is retargeted, with
|
|
172
172
|
`agents/<persona>.md` becoming `.toml` and the dispatcher becoming the router skill
|
|
@@ -489,15 +489,18 @@ same 51 specs as reference files rather than as peer skills, via Step 2b - see
|
|
|
489
489
|
|-------------|-------------|
|
|
490
490
|
| `~/.claude/commands/multi-agent/{cmd}/SKILL.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
|
|
491
491
|
|
|
492
|
-
**
|
|
492
|
+
**53 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
|
|
493
493
|
|
|
494
494
|
```
|
|
495
|
-
analysis, analysis-resolve, autopilot, build-optimize, channels,
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
495
|
+
analysis, analysis-resolve, autopilot, build-optimize, channels,
|
|
496
|
+
complaint-analysis, create-jira, design-check, dev, dev-autopilot, dev-local,
|
|
497
|
+
dev-local-autopilot, diff-explain, feedback, forget, garbage-collect, help,
|
|
498
|
+
ios-coding-standard, issue, jira, kill, language, local, local-autopilot,
|
|
499
|
+
log, manual-test, prune-logs, prune-prompts, purge, refactor, resume,
|
|
500
|
+
resume-local, review, review-analysis, review-issue, review-jira, routines,
|
|
501
|
+
save, scan, search, setup, stack, status, store-ready, sync, test,
|
|
502
|
+
test-accessibility, test-dark-mode, test-dynamic-type, test-screenshots,
|
|
503
|
+
testflight-validation, uninstall, update
|
|
501
504
|
```
|
|
502
505
|
|
|
503
506
|
**NOT synced**: `$HOME/.claude/multi-agent-refs/*` - lazy-load references, Claude Code specific
|
|
@@ -179,7 +179,7 @@ A git clone of the pipeline repo is a maintainer workspace, kept in sync by `/mu
|
|
|
179
179
|
```
|
|
180
180
|
Current: v15.6.0 Latest: v15.6.1
|
|
181
181
|
-> npm pack @{npm-scope}/multi-agent-pipeline@15.6.1
|
|
182
|
-
-> node install.js --all (
|
|
182
|
+
-> node install.js --all (53 commands, 245 scripts, 208 skills)
|
|
183
183
|
-> migrate-prefs.mjs (0 changes - already v2.6.0)
|
|
184
184
|
|
|
185
185
|
✓ Updated: v15.6.0 → v15.6.1
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Analysis document review (`/multi-agent:review-analysis`)
|
|
2
|
+
|
|
3
|
+
> Reviews a written analysis the way `/multi-agent:review` reviews a diff. Loaded on demand. Read-only: no branch, no worktree, no commit, and the source document is never edited in place.
|
|
4
|
+
|
|
5
|
+
`/multi-agent:review` answers "is this code right". This answers "could an implementer build the thing from this document, and does the document keep the promises its own contract makes". The two are different questions with the same failure mode: a reviewer who has opinions instead of rules produces findings nobody can act on. So this flow cites `Locked <n>` the way a code review cites a rule ID.
|
|
6
|
+
|
|
7
|
+
## Phase 0 - Resolve the document
|
|
8
|
+
|
|
9
|
+
`$ARGUMENTS` is one of:
|
|
10
|
+
|
|
11
|
+
| Input | Resolution |
|
|
12
|
+
|---|---|
|
|
13
|
+
| A local path | Read it. |
|
|
14
|
+
| A Confluence page URL or `pageId` | Fetch read-only through `$HOME/.claude/multi-agent-refs/channels/confluence.md`. Record `pageId` and page version - the review is about a specific version, and Confluence pages move under you. |
|
|
15
|
+
| A Jira key | Fetch the issue, then follow its analysis link. If the issue carries the analysis in its description or a comment, review that text and say which it was. |
|
|
16
|
+
| Nothing | Offer the most recent documents from `~/Desktop/multiAgentAnalysis/` and from `analysis/` in each selected repo, newest first, and single-select one. |
|
|
17
|
+
|
|
18
|
+
Fetch failures are reported and stop the run. Reviewing a document you could not read is the one outcome worse than not reviewing it.
|
|
19
|
+
|
|
20
|
+
## Phase 1 - Deterministic gates first
|
|
21
|
+
|
|
22
|
+
Run the machine checks before the model reads anything, and report their output verbatim. A finding a script already proves does not need a model's opinion, and a model that reads the document first tends to argue with the script afterwards.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
node "$HOME/.claude/scripts/validate-analysis-doc.mjs" "<doc>"
|
|
26
|
+
# when the run's state JSON is available (a fresh analysis, or --state <path>):
|
|
27
|
+
node "$HOME/.claude/scripts/build-references.mjs" "<state>" --check "<doc>"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
`validate-analysis-doc.mjs` reads `profile` from the front-matter and applies the matching contract, so the corporate backbone and the global omission rule are each judged by their own rule. Its ERRORs are Blockers in this review, its WARNs are Important unless the document states why the warned-about thing is deliberate.
|
|
31
|
+
|
|
32
|
+
**No state JSON, no references gate.** Say so in the report rather than passing silently: the coverage claim ("every source the run read is listed") is exactly the claim nobody can verify from the document alone, and marking it unchecked is the honest output.
|
|
33
|
+
|
|
34
|
+
## Phase 2 - Rubric
|
|
35
|
+
|
|
36
|
+
Parallel model review, same shape as `/multi-agent:review`: 2 models on Claude Code, 3 on Copilot CLI, then triage. Each reviewer answers the rubric below against the resolved profile and returns findings with `Locked <n>` or a rubric id, a quote from the document, and what a reader cannot do because of it.
|
|
37
|
+
|
|
38
|
+
**A. Buildability** - could an implementer start from this alone?
|
|
39
|
+
|
|
40
|
+
- Every screen, state and error path the feature needs is described somewhere, not assumed.
|
|
41
|
+
- Each business requirement or rule is testable: two readers cannot disagree about whether it passed.
|
|
42
|
+
- Nothing important is deferred to a conversation the reader was not in.
|
|
43
|
+
|
|
44
|
+
**B. Evidence** (Locked 3, 4, 34)
|
|
45
|
+
|
|
46
|
+
- Every quoted string, endpoint, status code and event name carries a citation.
|
|
47
|
+
- Nothing in a forward-looking section is actually a description of the current code.
|
|
48
|
+
- References carry their precision anchors, and a source that could not be fetched is listed as unreachable rather than dropped.
|
|
49
|
+
|
|
50
|
+
**C. Spine** (Locked 31 global, Locked 33 corporate)
|
|
51
|
+
|
|
52
|
+
- Global: every `BR-` id reaches an acceptance criterion and a test row.
|
|
53
|
+
- Corporate: every `IG` is realised by a `UC`, every `FG` names a source that exists, and the traceability matrix agrees with the sections. The matrix half is already machine-checked in Phase 1; the reviewer judges whether the chain is *meaningful*, not merely present.
|
|
54
|
+
|
|
55
|
+
**D. Altitude** - Part A carries no technology name, Part C carries no business rationale. A row that is unclear in two layers at once is two rows.
|
|
56
|
+
|
|
57
|
+
**E. Gaps that were admitted** - every `EKLENECEK` and every unverified assumption has an open question naming who can answer it. A gap with an owner is a plan; a gap without one is a defect.
|
|
58
|
+
|
|
59
|
+
**F. Contradiction** - the document does not say two different things in two places. This is the finding class a human reviewer misses most, because it needs the whole document held at once.
|
|
60
|
+
|
|
61
|
+
## Phase 3 - Triage and verdict
|
|
62
|
+
|
|
63
|
+
Fable triages the pooled findings exactly as in `/multi-agent:review`: drop duplicates, drop what the document already answers elsewhere, and keep the rest at one of three severities.
|
|
64
|
+
|
|
65
|
+
| Severity | Meaning |
|
|
66
|
+
|---|---|
|
|
67
|
+
| Blocker | An implementer would build the wrong thing, or could not start. Deterministic-gate ERRORs land here. |
|
|
68
|
+
| Important | The document is right but a reader will need a conversation to use it. |
|
|
69
|
+
| Suggestion | Clarity and consistency. Never a style preference dressed as a defect. |
|
|
70
|
+
|
|
71
|
+
The verdict names the profile it judged against, the counts per severity, and what was NOT checked (the references gate without a state file, anything the fetch could not reach). Follow the pipeline rule on claiming: state which findings are mechanically proven and which are judgement.
|
|
72
|
+
|
|
73
|
+
## Phase 4 - Output
|
|
74
|
+
|
|
75
|
+
Default is the chat report. Nothing is written anywhere without an explicit choice.
|
|
76
|
+
|
|
77
|
+
| Target | Behaviour |
|
|
78
|
+
|---|---|
|
|
79
|
+
| Chat only | Default. |
|
|
80
|
+
| Confluence comment | A comment on the reviewed page, never an edit of the page body. The document belongs to its author; a reviewer who rewrites it has removed the choice to disagree. |
|
|
81
|
+
| Jira comment | Comment only, per `channels/issue-comment.md`. The description is never touched. |
|
|
82
|
+
| Local file | `<doc-dir>/<doc-name>-review.md` beside the document, so the review travels with what it reviewed. |
|
|
83
|
+
|
|
84
|
+
`/multi-agent:analysis-resolve` is the companion that acts on the findings: this command says what is wrong, that one walks the open questions and folds the answers back into the document. Say so in the report when the verdict has open questions, so the reader knows the next command rather than editing by hand.
|
|
85
|
+
|
|
86
|
+
Non-negotiables: report body follows `prefs.global.outputLanguage`; humanizer punctuation policy (Locked 7) applies to anything posted to a channel; no AI attribution anywhere; no status change, no assignment, no page edit, no commit.
|
|
@@ -6,15 +6,18 @@
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## 1. Command Inventory (
|
|
9
|
+
## 1. Command Inventory (53 files, 49 live commands)
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
analysis, analysis-resolve, autopilot, build-optimize, channels,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
analysis, analysis-resolve, autopilot, build-optimize, channels,
|
|
13
|
+
complaint-analysis, create-jira, design-check, dev, dev-autopilot, dev-local,
|
|
14
|
+
dev-local-autopilot, diff-explain, feedback, forget, garbage-collect, help,
|
|
15
|
+
ios-coding-standard, issue, jira, kill, language, local, local-autopilot,
|
|
16
|
+
log, manual-test, prune-logs, prune-prompts, purge, refactor, resume,
|
|
17
|
+
resume-local, review, review-analysis, review-issue, review-jira, routines,
|
|
18
|
+
save, scan, search, setup, stack, status, store-ready, sync, test,
|
|
19
|
+
test-accessibility, test-dark-mode, test-dynamic-type, test-screenshots,
|
|
20
|
+
testflight-validation, uninstall, update
|
|
18
21
|
```
|
|
19
22
|
|
|
20
23
|
Categories:
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// feedback-send.mjs - send one user-written feedback message to the
|
|
3
|
+
// maintainer's admin panel.
|
|
4
|
+
//
|
|
5
|
+
// WHAT IS SENT: the text the user typed, and nothing else that the user did not
|
|
6
|
+
// type. No logs, no repo names, no branch names, no file paths, no diffs, no
|
|
7
|
+
// prompts. The only fields this script adds are the ones the maintainer cannot
|
|
8
|
+
// act on the report without: which pipeline version it came from, which host
|
|
9
|
+
// CLI, and when.
|
|
10
|
+
//
|
|
11
|
+
// That restraint is the whole design. Attaching a run log would make a report
|
|
12
|
+
// easier to act on and would also mean a corporate user's internal identifiers
|
|
13
|
+
// leave their machine and land in someone else's database, from a package
|
|
14
|
+
// anyone can install off npm. A person can paste the one line they think
|
|
15
|
+
// matters; a script cannot know which line that is.
|
|
16
|
+
//
|
|
17
|
+
// Auth reuses the usage ingest token (`prefs.global.keychainMapping.usage_ingest`)
|
|
18
|
+
// so nothing new has to be onboarded. Unlike usage telemetry, `optOut` does NOT
|
|
19
|
+
// silence this: telemetry is passive collection, feedback is a deliberate act by
|
|
20
|
+
// the person running the command, and silently dropping something a user chose
|
|
21
|
+
// to send is worse than not offering the command.
|
|
22
|
+
//
|
|
23
|
+
// Usage:
|
|
24
|
+
// node feedback-send.mjs --text "<message>" [--kind bug|idea|question]
|
|
25
|
+
// [--endpoint <url>] [--dry-run]
|
|
26
|
+
//
|
|
27
|
+
// Exit: 0 sent (or dry run), 1 nothing to send / rejected, 2 usage error.
|
|
28
|
+
|
|
29
|
+
import { execFileSync } from "node:child_process";
|
|
30
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
31
|
+
import { homedir } from "node:os";
|
|
32
|
+
import { join } from "node:path";
|
|
33
|
+
|
|
34
|
+
const ENDPOINT_DEFAULT = "https://mmerterden.vercel.app/api/feedback/ingest";
|
|
35
|
+
const TIMEOUT_MS = 8000;
|
|
36
|
+
const TEXT_MAX = 4000;
|
|
37
|
+
const KINDS = new Set(["bug", "idea", "question"]);
|
|
38
|
+
|
|
39
|
+
function arg(name, fallback = null) {
|
|
40
|
+
const i = process.argv.indexOf(name);
|
|
41
|
+
return i === -1 ? fallback : (process.argv[i + 1] ?? fallback);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function readPrefs() {
|
|
45
|
+
const p = join(homedir(), ".claude", "multi-agent-preferences.json");
|
|
46
|
+
try {
|
|
47
|
+
return JSON.parse(readFileSync(p, "utf-8")).global ?? {};
|
|
48
|
+
} catch {
|
|
49
|
+
return {};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function packageVersion() {
|
|
54
|
+
for (const p of [
|
|
55
|
+
join(homedir(), ".claude", ".pipeline-version"),
|
|
56
|
+
join(homedir(), ".copilot", ".pipeline-version"),
|
|
57
|
+
join(homedir(), ".codex", ".pipeline-version"),
|
|
58
|
+
]) {
|
|
59
|
+
try {
|
|
60
|
+
const v = readFileSync(p, "utf-8").trim();
|
|
61
|
+
if (v) return v;
|
|
62
|
+
} catch {
|
|
63
|
+
/* try the next host */
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return "unknown";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Which CLI the person is running. Useful because a report that only reproduces
|
|
70
|
+
// on one host is a different bug from one that reproduces everywhere.
|
|
71
|
+
function host() {
|
|
72
|
+
if (existsSync(join(homedir(), ".claude", ".pipeline-version"))) return "claude";
|
|
73
|
+
if (existsSync(join(homedir(), ".copilot", ".pipeline-version"))) return "copilot";
|
|
74
|
+
if (existsSync(join(homedir(), ".codex", ".pipeline-version"))) return "codex";
|
|
75
|
+
return "unknown";
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function resolveToken() {
|
|
79
|
+
if (process.env.MULTI_AGENT_USAGE_TOKEN) return process.env.MULTI_AGENT_USAGE_TOKEN;
|
|
80
|
+
const g = readPrefs();
|
|
81
|
+
const inline = g.usageLog?.token;
|
|
82
|
+
if (typeof inline === "string" && inline.trim()) return inline.trim();
|
|
83
|
+
const name = g.keychainMapping?.usage_ingest;
|
|
84
|
+
if (typeof name === "string" && name.trim()) {
|
|
85
|
+
const store = join(homedir(), ".claude", "lib", "credential-store.sh");
|
|
86
|
+
if (existsSync(store)) {
|
|
87
|
+
try {
|
|
88
|
+
const out = execFileSync("bash", [store, "get", name.trim()], {
|
|
89
|
+
encoding: "utf-8",
|
|
90
|
+
timeout: 4000,
|
|
91
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
92
|
+
}).trim();
|
|
93
|
+
if (out) return out;
|
|
94
|
+
} catch {
|
|
95
|
+
/* keychain unavailable */
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return "";
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The token rides in a header, so http would put it on the wire in cleartext.
|
|
103
|
+
// Same rule the usage sender follows: https anywhere, http only for loopback.
|
|
104
|
+
function endpointAllowed(endpoint) {
|
|
105
|
+
let u;
|
|
106
|
+
try {
|
|
107
|
+
u = new URL(endpoint);
|
|
108
|
+
} catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
if (u.protocol === "https:") return true;
|
|
112
|
+
return u.protocol === "http:" && ["localhost", "127.0.0.1", "::1"].includes(u.hostname);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function main() {
|
|
116
|
+
const text = String(arg("--text", "") ?? "").trim();
|
|
117
|
+
if (!text) {
|
|
118
|
+
process.stderr.write('usage: feedback-send.mjs --text "<message>" [--kind bug|idea|question]\n');
|
|
119
|
+
process.exit(2);
|
|
120
|
+
}
|
|
121
|
+
if (text.length > TEXT_MAX) {
|
|
122
|
+
process.stderr.write(`ERROR: message is ${text.length} chars; the cap is ${TEXT_MAX}\n`);
|
|
123
|
+
process.exit(2);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const kindRaw = String(arg("--kind", "bug") ?? "bug").toLowerCase();
|
|
127
|
+
const kind = KINDS.has(kindRaw) ? kindRaw : "bug";
|
|
128
|
+
const endpoint = String(arg("--endpoint", ENDPOINT_DEFAULT) ?? ENDPOINT_DEFAULT);
|
|
129
|
+
|
|
130
|
+
const payload = {
|
|
131
|
+
text,
|
|
132
|
+
kind,
|
|
133
|
+
v: packageVersion(),
|
|
134
|
+
host: host(),
|
|
135
|
+
at: new Date().toISOString(),
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
if (process.argv.includes("--dry-run")) {
|
|
139
|
+
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
140
|
+
process.exit(0);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (!endpointAllowed(endpoint)) {
|
|
144
|
+
process.stderr.write(`ERROR: refusing to send over a non-TLS endpoint: ${endpoint}\n`);
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const token = resolveToken();
|
|
149
|
+
if (!token) {
|
|
150
|
+
process.stderr.write(
|
|
151
|
+
"ERROR: no ingest token. Run /multi-agent:update once (it registers one) or /multi-agent:setup.\n",
|
|
152
|
+
);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const ctrl = new AbortController();
|
|
157
|
+
const timer = setTimeout(() => ctrl.abort(), TIMEOUT_MS);
|
|
158
|
+
try {
|
|
159
|
+
const res = await fetch(endpoint, {
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: { "Content-Type": "application/json", "X-Usage-Token": token },
|
|
162
|
+
body: JSON.stringify(payload),
|
|
163
|
+
signal: ctrl.signal,
|
|
164
|
+
});
|
|
165
|
+
if (!res.ok) {
|
|
166
|
+
// Unlike telemetry, this failure is reported: the person is standing there
|
|
167
|
+
// waiting to hear whether their message went. Swallowing it would leave
|
|
168
|
+
// them believing they had been heard.
|
|
169
|
+
process.stderr.write(`ERROR: the endpoint answered ${res.status}\n`);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
process.stdout.write("feedback sent\n");
|
|
173
|
+
} catch (err) {
|
|
174
|
+
process.stderr.write(`ERROR: could not reach the endpoint (${err.name})\n`);
|
|
175
|
+
process.exit(1);
|
|
176
|
+
} finally {
|
|
177
|
+
clearTimeout(timer);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
main();
|
|
@@ -82,7 +82,12 @@ fi
|
|
|
82
82
|
WAIT="${WEBSITE_SYNC_WAIT:-45}"
|
|
83
83
|
ELAPSED=0
|
|
84
84
|
while [ "$ELAPSED" -lt "$WAIT" ]; do
|
|
85
|
-
|
|
85
|
+
# `vercel ls` prints its table on STDERR, not stdout. Discarding stderr threw
|
|
86
|
+
# away the very rows this grep reads, so ROW was always empty and the check
|
|
87
|
+
# reported "no Ready production build" on every run - including the ones that
|
|
88
|
+
# deployed fine. A guard that cannot pass is worse than no guard: it trains
|
|
89
|
+
# the reader to ignore the one message meant to catch a real failure.
|
|
90
|
+
ROW="$(vercel ls --yes 2>&1 | grep -m1 'Production' || true)"
|
|
86
91
|
case "$ROW" in
|
|
87
92
|
*Ready*) echo "website: production build Ready"; exit 0 ;;
|
|
88
93
|
*Error*) break ;;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multi-agent-feedback
|
|
3
|
+
language: en
|
|
4
|
+
description: "Send one message to the maintainer: a bug, an idea or a question. Only the text you type is sent - no logs, no repo names, no paths. Shows the payload and asks before sending. Use when a run went wrong and the maintainer should know."
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "\"<message>\" [bug | idea | question] - with no argument, you are asked for the text"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# multi-agent feedback - tell the maintainer
|
|
10
|
+
|
|
11
|
+
**Input**: $ARGUMENTS
|
|
12
|
+
|
|
13
|
+
One message to the maintainer's admin panel. It exists because the alternative is a problem nobody hears about: a run goes wrong, the person works around it, and the defect is still there a month later.
|
|
14
|
+
|
|
15
|
+
## What is sent
|
|
16
|
+
|
|
17
|
+
Only the text you type, plus `kind` (bug / idea / question), the installed pipeline version, which host CLI, and the timestamp.
|
|
18
|
+
|
|
19
|
+
**No logs are attached, ever** - not the agent log, the diff, the repo name, the branch, or a file path. This package installs from a public registry, so an automatic log attachment would take a corporate user's internal identifiers off their machine into someone else's database. Paste the one line you think matters; a script cannot know which line that is.
|
|
20
|
+
|
|
21
|
+
## Flow
|
|
22
|
+
|
|
23
|
+
1. Take the message from `$ARGUMENTS`; with no argument, ask for the text and then the kind.
|
|
24
|
+
2. Print the exact payload via the script's own dry run, so what is shown is what goes:
|
|
25
|
+
`node "$HOME/.copilot/scripts/feedback-send.mjs" --text "<message>" --kind <kind> --dry-run`
|
|
26
|
+
3. **Confirm before sending.** Nothing leaves the machine before a yes; autopilot does not exempt this, because a message to a person is never fired unattended.
|
|
27
|
+
4. Send the same command without `--dry-run`.
|
|
28
|
+
5. Report the outcome plainly. A failure is surfaced, not swallowed - the person is waiting to hear whether their message went.
|
|
29
|
+
|
|
30
|
+
Auth reuses the usage ingest token, so nothing extra is onboarded. `usageLog.optOut` does not silence this: telemetry is passive collection, feedback is a deliberate act. The endpoint must be TLS; only loopback is exempt.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multi-agent-review-analysis
|
|
3
|
+
language: en
|
|
4
|
+
description: "Review a written analysis document instead of a diff: resolve it from a path, a Confluence page or a Jira issue, run the deterministic gates first, then a parallel model review. Findings cite the Locked rule they break. Never edits the document. Use when an analysis needs judging before development starts."
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "[path | Confluence URL | pageId | JIRA-KEY] [--state <state.json>] - optional; with no argument, pick from recent analyses"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# multi-agent review-analysis - analysis document review
|
|
10
|
+
|
|
11
|
+
**Input**: $ARGUMENTS
|
|
12
|
+
|
|
13
|
+
`multi-agent-review` judges a diff. This judges the document that diff was supposed to come from, before the code exists. No worktree, no branch, no commit, and the reviewed document is never edited in place.
|
|
14
|
+
|
|
15
|
+
## Flow
|
|
16
|
+
|
|
17
|
+
Read `$HOME/.copilot/multi-agent-refs/analysis/review.md` and execute it:
|
|
18
|
+
|
|
19
|
+
1. **Resolve** from a local path, a Confluence URL or `pageId`, or a Jira key. No argument -> pick from recent analyses in `~/Desktop/multiAgentAnalysis/` and each repo's `analysis/`.
|
|
20
|
+
2. **Deterministic gates first**, output reported verbatim before any model reads the document:
|
|
21
|
+
`validate-analysis-doc.mjs <doc>`, and `build-references.mjs <state> --check <doc>` when a state JSON is available.
|
|
22
|
+
3. **Parallel model review** against the rubric: buildability, evidence, spine, altitude, admitted gaps, contradiction.
|
|
23
|
+
4. **Triage** into Blocker / Important / Suggestion.
|
|
24
|
+
5. **Report** the profile it judged against and, explicitly, what was NOT checked.
|
|
25
|
+
6. **Output** on request: chat (default), Confluence comment, Jira comment, or a `-review.md` beside the document.
|
|
26
|
+
|
|
27
|
+
Findings cite `Locked <n>` where one applies, so the author gets a rule and a fix rather than a preference. Anything with no rule behind it is marked as judgement.
|
|
28
|
+
|
|
29
|
+
## What it never does
|
|
30
|
+
|
|
31
|
+
Edits the reviewed document (that is `multi-agent-analysis-resolve`), touches a Jira description or a Confluence page body, chains into a dev run, branches, or commits.
|
|
@@ -31,7 +31,7 @@ Run all steps automatically:
|
|
|
31
31
|
|
|
32
32
|
```
|
|
33
33
|
Step 1: DETECT Compare timestamps, find stale targets
|
|
34
|
-
Step 2: COPILOT Claude Code -> Copilot CLI (instructions +
|
|
34
|
+
Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 53 sub-command skills)
|
|
35
35
|
Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + 51 specs as refs + 8 agent TOML)
|
|
36
36
|
Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
|
|
37
37
|
Step 3d: DEV-TOOLKIT Companion MCP server -> detect movement, ship gates, commit + publish
|
|
@@ -98,7 +98,7 @@ If nothing is stale -> report "All targets up to date" and stop.
|
|
|
98
98
|
## Codex Sync (Step 2b)
|
|
99
99
|
|
|
100
100
|
This step does **not** hand-copy files. The Codex tree is a *transform* of the Claude
|
|
101
|
-
tree, not a mirror: the
|
|
101
|
+
tree, not a mirror: the 53 sub-command specs become reference files (Codex silently
|
|
102
102
|
truncates its skills block - see `cross-cli-contract.md` 2.6), every reference to a
|
|
103
103
|
CLI-owned tree is retargeted (`agents/<persona>.md` becomes `.toml`, the dispatcher
|
|
104
104
|
becomes the router skill), the 8 personas are regenerated as TOML with a model +
|
|
@@ -224,15 +224,18 @@ When invoked with the `release` argument:
|
|
|
224
224
|
|-------------|-------------|
|
|
225
225
|
| `~/.claude/commands/multi-agent/{cmd}.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
|
|
226
226
|
|
|
227
|
-
**
|
|
227
|
+
**53 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
|
|
228
228
|
|
|
229
229
|
```
|
|
230
|
-
analysis, analysis-resolve, autopilot, build-optimize, channels,
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
230
|
+
analysis, analysis-resolve, autopilot, build-optimize, channels,
|
|
231
|
+
complaint-analysis, create-jira, design-check, dev, dev-autopilot, dev-local,
|
|
232
|
+
dev-local-autopilot, diff-explain, feedback, forget, garbage-collect, help,
|
|
233
|
+
ios-coding-standard, issue, jira, kill, language, local, local-autopilot,
|
|
234
|
+
log, manual-test, prune-logs, prune-prompts, purge, refactor, resume,
|
|
235
|
+
resume-local, review, review-analysis, review-issue, review-jira, routines,
|
|
236
|
+
save, scan, search, setup, stack, status, store-ready, sync, test,
|
|
237
|
+
test-accessibility, test-dark-mode, test-dynamic-type, test-screenshots,
|
|
238
|
+
testflight-validation, uninstall, update
|
|
236
239
|
```
|
|
237
240
|
|
|
238
241
|
**NOT synced**: `refs/*` - Lazy-load references, Claude Code specific
|