@mmerterden/multi-agent-pipeline 11.3.0 → 11.3.2
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 +46 -0
- package/README.md +1 -1
- package/install/claude.mjs +6 -2
- package/install/copilot.mjs +6 -2
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/{generate → create-jira}/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +6 -6
- package/pipeline/commands/multi-agent/sync/SKILL.md +2 -2
- package/pipeline/lib/credential-store.sh +8 -4
- package/pipeline/multi-agent-refs/cross-cli-contract.md +3 -3
- package/pipeline/multi-agent-refs/generate-issue.md +1 -1
- package/pipeline/scripts/build-skills-index.mjs +3 -6
- package/pipeline/scripts/eval-mine-corpus.mjs +187 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +2 -2
- package/pipeline/scripts/lint-skills.mjs +26 -1
- package/pipeline/scripts/smoke-generate-issue.sh +9 -9
- package/pipeline/scripts/uninstall.mjs +15 -4
- package/pipeline/skills/.skill-manifest.json +14 -14
- package/pipeline/skills/.skills-index.json +10 -11
- package/pipeline/skills/shared/core/{multi-agent-generate → multi-agent-create-jira}/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +2 -2
- package/pipeline/skills/skills-index.md +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,52 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
+
## [11.3.2] - 2026-07-10
|
|
18
|
+
|
|
19
|
+
Command rename + website refresh.
|
|
20
|
+
|
|
21
|
+
- **Renamed `/multi-agent:generate` -> `/multi-agent:create-jira`** (Copilot skill
|
|
22
|
+
`multi-agent-generate` -> `multi-agent-create-jira`). The command is the
|
|
23
|
+
consolidated Jira-issue creator that asks the type (Task / Bug / Story); the
|
|
24
|
+
new name says what it does. Command dir, Copilot skill, dispatcher rows, help
|
|
25
|
+
(EN + TR), the command inventory in the cross-CLI contract + both sync copies,
|
|
26
|
+
the skill index + manifest, and the contract smoke were all updated; command
|
|
27
|
+
count stays 36. The internal ref (`generate-issue.md`) keeps its filename.
|
|
28
|
+
- **Website:** corrected the `multi-agent-plugins` skill count (205 -> 227, the
|
|
29
|
+
real sum across the five toolkits) and bumped the pipeline card to this version.
|
|
30
|
+
- Also published v11.3.1 to GitHub Packages (both registries were on npmjs only).
|
|
31
|
+
|
|
32
|
+
## [11.3.1] - 2026-07-10
|
|
33
|
+
|
|
34
|
+
Self-audit patch (found by running `/multi-agent:refactor` on the pipeline itself): a data-loss fix, a latent gate regression, supply-chain hardening, and a few correctness fixes.
|
|
35
|
+
|
|
36
|
+
- **Fix (data-loss): uninstall no longer deletes `~/.claude/rules/`.** Install
|
|
37
|
+
treats `rules/` as user-owned (write-if-missing, never overwritten), but the
|
|
38
|
+
uninstaller recursively removed the whole tree, destroying personal rules
|
|
39
|
+
(including the git-attribution rule). Uninstall now preserves `rules/`, and
|
|
40
|
+
lists it in the PRESERVED summary.
|
|
41
|
+
- **Fix (gate regression): `lint-skills` scoped to `pipeline/skills`.** The
|
|
42
|
+
v11.3.0 command-layout migration made command files match `find pipeline -name
|
|
43
|
+
SKILL.md`; slash commands have no `name:` frontmatter, so the skill linter
|
|
44
|
+
started erroring on all 37 of them (latent because CI is billing-paused and
|
|
45
|
+
releases were published manually). The linter now only checks actual skills.
|
|
46
|
+
- **Fix: `.skills-index.json` is idempotent** - dropped the `generatedAt`
|
|
47
|
+
timestamp so regenerating an unchanged skill set produces no diff.
|
|
48
|
+
- **Fix: uninstall strips the Copilot pipeline block regardless of file size** -
|
|
49
|
+
removed the 50 KB fallback cap that orphaned the block in large
|
|
50
|
+
`copilot-instructions.md` files.
|
|
51
|
+
- **Fix: install "dev-only excluded" count** is now the real file count (the
|
|
52
|
+
`fixtures/` directory was under-counted as one entry).
|
|
53
|
+
- **Security (supply-chain):** `release.yml` publishes with `npm publish
|
|
54
|
+
--provenance` (`id-token: write`); all GitHub Actions pinned to commit SHAs;
|
|
55
|
+
added `.github/dependabot.yml` (actions + npm dev deps); `credential-store.sh`
|
|
56
|
+
escapes single quotes in the Windows PowerShell paths.
|
|
57
|
+
- **New: `eval-mine-corpus.mjs`** turns recorded triage decisions
|
|
58
|
+
(`triage-corpus.jsonl`) into review-gated candidate triage-eval fixtures.
|
|
59
|
+
- **Tests:** added node unit tests for the Phase 4 diff-risk gates
|
|
60
|
+
(`test/phase4-gates.test.mjs`) so they run in the release lane, not only the
|
|
61
|
+
bash smoke; `lint-skills` now warns (non-fatal) on terse skill descriptions.
|
|
62
|
+
|
|
17
63
|
## [11.3.0] - 2026-07-10
|
|
18
64
|
|
|
19
65
|
Single-source skill management, an upgraded `refactor` command, and two new Phase 4 diff-risk gates.
|
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ The discipline behind all of this — bounded loops, evidence gates, token-budge
|
|
|
63
63
|
| Local | `/multi-agent:local "task"` | Full pipeline, current branch (no worktree) |
|
|
64
64
|
| Finish | `/multi-agent:finish` | Run the review→test→commit→report tail over local work |
|
|
65
65
|
|
|
66
|
-
Helpers: `setup`, `status`, `resume #N`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `
|
|
66
|
+
Helpers: `setup`, `status`, `resume #N`, `review`, `test`, `channels`, `stack`, `update`, `sync`, `refactor`, `jira`, `issue`, `analysis`, `create-jira`. Full list: `/multi-agent:help`.
|
|
67
67
|
|
|
68
68
|
## Stacks
|
|
69
69
|
|
package/install/claude.mjs
CHANGED
|
@@ -105,9 +105,13 @@ function installScripts(pipelineSrc, dest, useSymlinks) {
|
|
|
105
105
|
// removed upstream should not linger.
|
|
106
106
|
wipeDir(dest);
|
|
107
107
|
copyDir(scriptsSrc, dest, { exclude: DEV_ONLY_SCRIPTS, useSymlinks });
|
|
108
|
-
|
|
108
|
+
// Count files actually excluded, not the array length: DEV_ONLY_SCRIPTS mixes
|
|
109
|
+
// individual .sh files with the `fixtures` directory (many files), so the
|
|
110
|
+
// array length under-counts the real exclusion.
|
|
111
|
+
const excludedCount = DEV_ONLY_SCRIPTS.reduce((n, name) => n + countFiles(join(scriptsSrc, name)), 0);
|
|
112
|
+
const scriptCount = countFiles(scriptsSrc) - excludedCount;
|
|
109
113
|
console.log(
|
|
110
|
-
` -> ${scriptCount} files copied to ${dest} (${
|
|
114
|
+
` -> ${scriptCount} files copied to ${dest} (${excludedCount} dev-only excluded)`,
|
|
111
115
|
);
|
|
112
116
|
}
|
|
113
117
|
|
package/install/copilot.mjs
CHANGED
|
@@ -119,9 +119,13 @@ function installScripts(pipelineSrc, dest, useSymlinks) {
|
|
|
119
119
|
if (!existsSync(scriptsSrc)) return;
|
|
120
120
|
wipeDir(dest);
|
|
121
121
|
copyDir(scriptsSrc, dest, { exclude: DEV_ONLY_SCRIPTS, useSymlinks });
|
|
122
|
-
|
|
122
|
+
// Count files actually excluded, not the array length: DEV_ONLY_SCRIPTS mixes
|
|
123
|
+
// individual .sh files with the `fixtures` directory (many files), so the
|
|
124
|
+
// array length under-counts the real exclusion.
|
|
125
|
+
const excludedCount = DEV_ONLY_SCRIPTS.reduce((n, name) => n + countFiles(join(scriptsSrc, name)), 0);
|
|
126
|
+
const scriptCount = countFiles(scriptsSrc) - excludedCount;
|
|
123
127
|
console.log(
|
|
124
|
-
` -> ${scriptCount} files copied to ${dest} (${
|
|
128
|
+
` -> ${scriptCount} files copied to ${dest} (${excludedCount} dev-only excluded)`,
|
|
125
129
|
);
|
|
126
130
|
}
|
|
127
131
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "11.3.
|
|
3
|
+
"version": "11.3.2",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code and Copilot 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",
|
|
@@ -77,7 +77,7 @@ Lib scripts (`~/.claude/lib/`):
|
|
|
77
77
|
| `analysis ["<feature>"]` | Standalone feature-spec analizi: Figma / Swagger / Confluence / Jira / repo girdileri sabit 7-bölümlük şablona dökülür, humanizer'dan geçer, Local/Confluence/Jira hedef(ler)ine post edilir. Worktree veya commit yok. Dev'e zincirleme yok. |
|
|
78
78
|
| `build-optimize` | iOS-only Xcode build performance wrapper. Vendored `xcode-build-orchestrator`'a dispatch eder; benchmark + compilation / project / SPM analyzer'lar + recommend-first plan `.build-benchmark/optimization-plan.md`. Non-iOS stack'lerde fail-fast. |
|
|
79
79
|
| `channels [PR-url\|#N\|Jira-url\|Jira-id] [--channels pr,jira,confluence,wiki] [--content normal,test,auto-diff,note] [--message "..."]` | Post task report to multi-select channels (PR description, Jira comment, Confluence page, Wiki pages) with multi-select content sources. Humanizer pass per-channel. Bitbucket PR updates use reviewer-preserving PUT. Phase 7 delegates to this command; also invocable post-hoc for fixes made outside the pipeline. No worktree. |
|
|
80
|
-
| `
|
|
80
|
+
| `create-jira ["desc"] [figma-url] [swagger-url]` | Create a standards-compliant Jira issue: asks the type (**Task** / **Bug** / **Story**), mines the project's recent same-type issues for conventions (summary format, labels, priority, test-scenario style), detects the active sprint, drafts from a standard template with auto-sizing sections (Design Reference / API Contract / Screenshots appear only when their source is given), asks about unknown fields, then full draft preview + explicit approval before create. No worktree, no commits. |
|
|
81
81
|
| `test` or `test [args]` | UI Bug Hunter - screenshot + tap + analyze on booted simulator via MCP (read `$HOME/.claude/commands/sim-test.md`). `/multi-agent:test` also resolves here via the `commands/multi-agent/test/SKILL.md` delegate. |
|
|
82
82
|
| `manual-test [#id]` | Phase 5 standalone Manual Test - checks out the task branch, prints Xcode / SourceTree hints, waits for user verdict (`ok` / `fix: ...`). |
|
|
83
83
|
| `stack [ios\|android\|backend\|mobile\|all]` | Swap skills for next conversation. No arg = show current stack. |
|
|
@@ -117,7 +117,7 @@ This command uses lazy loading for token efficiency. Read the relevant sub-file
|
|
|
117
117
|
| `local-autopilot` | `$HOME/.claude/commands/multi-agent/local-autopilot/SKILL.md` |
|
|
118
118
|
| `dev-local` | `$HOME/.claude/commands/multi-agent/dev-local/SKILL.md` |
|
|
119
119
|
| `dev-local-autopilot` | `$HOME/.claude/commands/multi-agent/dev-local-autopilot/SKILL.md` |
|
|
120
|
-
| `
|
|
120
|
+
| `create-jira` | `$HOME/.claude/commands/multi-agent/create-jira/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/generate-issue.md`) |
|
|
121
121
|
| `stack` | `$HOME/.claude/commands/multi-agent/stack/SKILL.md` |
|
|
122
122
|
| `language` | Handled inline - set/show prompt language in preferences |
|
|
123
123
|
| SwiftUI component task (iOS) | `$HOME/.claude/multi-agent-refs/swiftui-guide.md` |
|
|
@@ -3,7 +3,7 @@ description: "Create a standards-compliant Jira issue (Task / Bug / Story): asks
|
|
|
3
3
|
argument-hint: "[\"<free-text description>\"] [figma-url] [swagger-url] - all optional, asked interactively when missing"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# multi-agent
|
|
6
|
+
# multi-agent create-jira - Standards-Compliant Jira Issue Creator
|
|
7
7
|
|
|
8
8
|
**Input**: $ARGUMENTS
|
|
9
9
|
|
|
@@ -111,7 +111,7 @@ Post-Hoc & Side-Channel:
|
|
|
111
111
|
/multi-agent:analysis ["analysis-name"] Feature-spec analysis (Figma + Swagger + Confluence + repos) → per-platform v3 doc (23-section Full / 7-section Lite)
|
|
112
112
|
/multi-agent:analysis-resolve [doc] Resolve Section 20 open questions of an analysis doc, one at a time with source-labeled candidates
|
|
113
113
|
/multi-agent:build-optimize iOS-only Xcode build perf wrapper → benchmark + analyze + recommend-first .build-benchmark/optimization-plan.md
|
|
114
|
-
/multi-agent:
|
|
114
|
+
/multi-agent:create-jira ["desc"] [figma-url] [swagger-url] Create a Jira Task/Bug/Story matching team conventions (asks type + mining + active sprint + auto-sizing sections + preview & approval)
|
|
115
115
|
/multi-agent:diff-explain Map a Phase 4 triage finding back to specific diff lines
|
|
116
116
|
/multi-agent:search Cross-task log search with smart ranking; --semantic queries triage corpus
|
|
117
117
|
/multi-agent:scan Skill security scan against tiered pattern catalog
|
|
@@ -222,8 +222,8 @@ Examples:
|
|
|
222
222
|
/multi-agent:review
|
|
223
223
|
|
|
224
224
|
# Create a Jira issue that matches team conventions (preview + approval before create)
|
|
225
|
-
/multi-agent:
|
|
226
|
-
/multi-agent:
|
|
225
|
+
/multi-agent:create-jira "Profile screen empty state" https://figma.com/design/abc?node-id=1-2
|
|
226
|
+
/multi-agent:create-jira "Login crash on iOS 17, see attached log"
|
|
227
227
|
|
|
228
228
|
------------------------------------------------------------
|
|
229
229
|
|
|
@@ -323,7 +323,7 @@ Post-Hoc & Side-Channel:
|
|
|
323
323
|
/multi-agent:analysis ["analysis-name"] Feature-spec analizi (Figma + Swagger + Confluence + repolar) → platform başına v3 doküman (23 bölüm Full / 7 bölüm Lite)
|
|
324
324
|
/multi-agent:analysis-resolve [doc] Analiz dokümanının Bölüm 20 açık sorularını kaynak etiketli adaylarla teker teker çözer
|
|
325
325
|
/multi-agent:build-optimize iOS-only Xcode build performance wrapper → benchmark + analiz + recommend-first .build-benchmark/optimization-plan.md
|
|
326
|
-
/multi-agent:
|
|
326
|
+
/multi-agent:create-jira ["açıklama"] [figma-url] [swagger-url] Takım standartlarına uygun Jira Task/Bug/Story oluştur (tip sorar + convention mining + aktif sprint + auto-sizing bölümler + önizleme & onay)
|
|
327
327
|
/multi-agent:diff-explain Phase 4 triage bulgusunu diff satırlarına eşle
|
|
328
328
|
/multi-agent:search Task log'larında akıllı arama; --semantic triage corpus'unu sorgular
|
|
329
329
|
/multi-agent:scan Skill güvenlik taraması (tiered pattern catalog)
|
|
@@ -434,8 +434,8 @@ Quality & Telemetry (advisory, default açık - prefs.global.* ile kapatılabi
|
|
|
434
434
|
/multi-agent:review
|
|
435
435
|
|
|
436
436
|
# Takım standartlarına uygun Jira issue oluştur (oluşturmadan önce önizleme + onay)
|
|
437
|
-
/multi-agent:
|
|
438
|
-
/multi-agent:
|
|
437
|
+
/multi-agent:create-jira "Profil ekranı empty state" https://figma.com/design/abc?node-id=1-2
|
|
438
|
+
/multi-agent:create-jira "iOS 17'de login crash, log ekte"
|
|
439
439
|
|
|
440
440
|
------------------------------------------------------------
|
|
441
441
|
|
|
@@ -242,9 +242,9 @@ This runs on the Claude <-> Copilot axis — the two CLIs the pipeline supports
|
|
|
242
242
|
**36 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
|
|
243
243
|
|
|
244
244
|
```
|
|
245
|
-
analysis, analysis-resolve, autopilot, build-optimize, channels, delete, dev,
|
|
245
|
+
analysis, analysis-resolve, autopilot, build-optimize, channels, create-jira, delete, dev,
|
|
246
246
|
dev-autopilot, dev-local, dev-local-autopilot, diff-explain, finish, garbage-collect,
|
|
247
|
-
|
|
247
|
+
help, issue, jira, kill, language, local,
|
|
248
248
|
local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review,
|
|
249
249
|
scan, search, setup, stack, status, sync, test, update
|
|
250
250
|
```
|
|
@@ -105,9 +105,11 @@ do_get() {
|
|
|
105
105
|
val=$(secret-tool lookup service "$key" 2>/dev/null || true)
|
|
106
106
|
;;
|
|
107
107
|
windows)
|
|
108
|
+
# Escape single quotes for PowerShell single-quoted strings ('' = literal ').
|
|
109
|
+
local key_esc="${key//\'/\'\'}"
|
|
108
110
|
val=$(ps_run "
|
|
109
111
|
\$ErrorActionPreference='SilentlyContinue'
|
|
110
|
-
\$c = Get-StoredCredential -Target '$
|
|
112
|
+
\$c = Get-StoredCredential -Target '$key_esc'
|
|
111
113
|
if (\$c) { \$c.GetNetworkCredential().Password }
|
|
112
114
|
" 2>/dev/null | tr -d '\r' || true)
|
|
113
115
|
;;
|
|
@@ -137,11 +139,13 @@ do_set() {
|
|
|
137
139
|
printf '%s' "$val" | secret-tool store --label="$key" service "$key" >/dev/null
|
|
138
140
|
;;
|
|
139
141
|
windows)
|
|
142
|
+
# Escape single quotes for PowerShell single-quoted strings ('' = literal ').
|
|
143
|
+
local key_esc="${key//\'/\'\'}" val_esc="${val//\'/\'\'}"
|
|
140
144
|
# CredentialManager module: New-StoredCredential
|
|
141
145
|
ps_run "
|
|
142
146
|
\$ErrorActionPreference='Stop'
|
|
143
|
-
\$pwd = ConvertTo-SecureString '$
|
|
144
|
-
New-StoredCredential -Target '$
|
|
147
|
+
\$pwd = ConvertTo-SecureString '$val_esc' -AsPlainText -Force
|
|
148
|
+
New-StoredCredential -Target '$key_esc' -UserName '${USER:-${USERNAME:-claude}}' -SecurePassword \$pwd -Persist LocalMachine | Out-Null
|
|
145
149
|
" >/dev/null
|
|
146
150
|
;;
|
|
147
151
|
*)
|
|
@@ -159,7 +163,7 @@ do_delete() {
|
|
|
159
163
|
case "$PLATFORM" in
|
|
160
164
|
macos) security delete-generic-password -s "$key" >/dev/null 2>&1 || true ;;
|
|
161
165
|
linux) secret-tool clear service "$key" >/dev/null 2>&1 || true ;;
|
|
162
|
-
windows) ps_run "Remove-StoredCredential -Target '$
|
|
166
|
+
windows) local key_esc="${key//\'/\'\'}"; ps_run "Remove-StoredCredential -Target '$key_esc' -ErrorAction SilentlyContinue" >/dev/null 2>&1 || true ;;
|
|
163
167
|
esac
|
|
164
168
|
}
|
|
165
169
|
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
## 1. Command Inventory (36 commands)
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
analysis, analysis-resolve, autopilot, build-optimize, channels, delete, dev,
|
|
12
|
+
analysis, analysis-resolve, autopilot, build-optimize, channels, create-jira, delete, dev,
|
|
13
13
|
dev-autopilot, dev-local, dev-local-autopilot, diff-explain, finish, garbage-collect,
|
|
14
|
-
|
|
14
|
+
help, issue, jira, kill, language, local,
|
|
15
15
|
local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review,
|
|
16
16
|
scan, search, setup, stack, status, sync, test, update
|
|
17
17
|
```
|
|
@@ -19,7 +19,7 @@ scan, search, setup, stack, status, sync, test, update
|
|
|
19
19
|
Categories:
|
|
20
20
|
|
|
21
21
|
- **Interactive pickers** (single-purpose, not modes): `jira`, `issue`
|
|
22
|
-
- **Issue generator** (one-shot, no worktree, asks type Task/Bug/Story, hard approval gate before create): `
|
|
22
|
+
- **Issue generator** (one-shot, no worktree, asks type Task/Bug/Story, hard approval gate before create): `create-jira`
|
|
23
23
|
- **Full 8-phase modes**: `autopilot`, `local`, `local-autopilot`
|
|
24
24
|
- **Fast modes** (Init -> Dev(Opus) -> Commit -> Report): `dev`, `dev-autopilot`, `dev-local`, `dev-local-autopilot`
|
|
25
25
|
- **Tail modes** (run the pipeline tail over already-done local work): `finish`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Generate Issue - Shared Flow (generate)
|
|
2
2
|
|
|
3
|
-
> **TLDR** - Shared 12-step flow for `/multi-agent:
|
|
3
|
+
> **TLDR** - Shared 12-step flow for `/multi-agent:create-jira`. Asks the issue type (Task / Bug / Story), mines the target project's existing same-type issues to learn team conventions, detects the active sprint, drafts a standards-compliant issue from a fixed standard template with auto-sizing sections, asks the user about every genuinely unknown field, renders a full preview, and creates the Jira issue only after explicit approval. Creates exactly one Jira issue per run - no branches, no commits, no worktrees.
|
|
4
4
|
|
|
5
5
|
Consumed by `generate.md`. This ref is never invoked directly.
|
|
6
6
|
|
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
// name - frontmatter `name:` (fallback: directory name)
|
|
14
14
|
// description - frontmatter `description:` (first 300 chars)
|
|
15
15
|
// platform - frontmatter `platform:` if set (ios / android / generic)
|
|
16
|
-
// group - derived from path: core /
|
|
17
|
-
// figma-common / external
|
|
16
|
+
// group - derived from path: core / external
|
|
18
17
|
// triggerKeywords - frontmatter `trigger-keywords:` (comma-separated
|
|
19
18
|
// values lowercased) - authors can add these to tighten
|
|
20
19
|
// match score. Missing → empty list.
|
|
@@ -66,9 +65,6 @@ function parseFrontmatter(raw) {
|
|
|
66
65
|
function groupFromPath(rel) {
|
|
67
66
|
if (rel.startsWith("shared/core/")) return "core";
|
|
68
67
|
if (rel.startsWith("shared/external/")) return "external";
|
|
69
|
-
if (rel.startsWith("figma-ios/")) return "figma-ios";
|
|
70
|
-
if (rel.startsWith("figma-android/")) return "figma-android";
|
|
71
|
-
if (rel.startsWith("figma-common/")) return "figma-common";
|
|
72
68
|
return "other";
|
|
73
69
|
}
|
|
74
70
|
|
|
@@ -107,7 +103,8 @@ entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
|
107
103
|
|
|
108
104
|
const json = {
|
|
109
105
|
schemaVersion: "1.0.0",
|
|
110
|
-
generatedAt:
|
|
106
|
+
// No generatedAt timestamp: the index is a committed build artifact and must
|
|
107
|
+
// be idempotent, so regenerating on an unchanged skill set produces no diff.
|
|
111
108
|
skillCount: entries.length,
|
|
112
109
|
entries,
|
|
113
110
|
};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// eval-mine-corpus.mjs - grow the triage eval set from real production runs.
|
|
3
|
+
//
|
|
4
|
+
// The pipeline already records every Phase 4 triage decision to
|
|
5
|
+
// `~/.claude/logs/multi-agent/triage-corpus.jsonl` (one line per finding:
|
|
6
|
+
// severity/file/line/issue/fix/reviewer + the classification the run gave it,
|
|
7
|
+
// plus an optional human `reason`/`reviewer`). Hand-authoring eval fixtures is
|
|
8
|
+
// the bottleneck; this closes the loop by turning those real decisions into
|
|
9
|
+
// CANDIDATE regression fixtures in the exact shape `eval-triage.mjs` consumes.
|
|
10
|
+
//
|
|
11
|
+
// It is review-gated on purpose: candidates land in
|
|
12
|
+
// `pipeline/eval/triage-candidates/<task_id>/` (which eval-triage does NOT
|
|
13
|
+
// walk), each validated against the triage schema. A maintainer reviews them,
|
|
14
|
+
// fills scope/diffSummary, and moves the good ones into
|
|
15
|
+
// `pipeline/eval/triage/<NN>-<name>/` to adopt them.
|
|
16
|
+
//
|
|
17
|
+
// Highest-signal cases (a human left a `reason` or `reviewer`) are emitted
|
|
18
|
+
// first and marked, since those encode a deliberate triage judgement.
|
|
19
|
+
//
|
|
20
|
+
// Usage:
|
|
21
|
+
// node pipeline/scripts/eval-mine-corpus.mjs # default corpus path
|
|
22
|
+
// node pipeline/scripts/eval-mine-corpus.mjs --corpus <path>
|
|
23
|
+
// node pipeline/scripts/eval-mine-corpus.mjs --limit 20 # cap candidates
|
|
24
|
+
// node pipeline/scripts/eval-mine-corpus.mjs --dry-run # report, write nothing
|
|
25
|
+
//
|
|
26
|
+
// Exit codes: 0 ok (including "nothing to mine"), 2 usage/setup error.
|
|
27
|
+
|
|
28
|
+
import { readdirSync, readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
29
|
+
import { dirname, join, resolve } from "node:path";
|
|
30
|
+
import { fileURLToPath } from "node:url";
|
|
31
|
+
import { homedir } from "node:os";
|
|
32
|
+
import { spawnSync } from "node:child_process";
|
|
33
|
+
|
|
34
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
const root = resolve(here, "..", "..");
|
|
36
|
+
const evalTriageDir = join(root, "pipeline", "eval", "triage");
|
|
37
|
+
const candidatesDir = join(root, "pipeline", "eval", "triage-candidates");
|
|
38
|
+
const validator = join(root, "pipeline", "scripts", "validate-triage.mjs");
|
|
39
|
+
|
|
40
|
+
const args = process.argv.slice(2);
|
|
41
|
+
const opts = { corpus: null, limit: Infinity, dryRun: false };
|
|
42
|
+
for (let i = 0; i < args.length; i++) {
|
|
43
|
+
if (args[i] === "--corpus") opts.corpus = args[++i];
|
|
44
|
+
else if (args[i] === "--limit") opts.limit = Number(args[++i]) || Infinity;
|
|
45
|
+
else if (args[i] === "--dry-run") opts.dryRun = true;
|
|
46
|
+
else if (args[i] === "-h" || args[i] === "--help") {
|
|
47
|
+
console.log("Usage: eval-mine-corpus.mjs [--corpus <path>] [--limit N] [--dry-run]");
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const corpusPath =
|
|
53
|
+
opts.corpus || join(homedir(), ".claude", "logs", "multi-agent", "triage-corpus.jsonl");
|
|
54
|
+
|
|
55
|
+
if (!existsSync(corpusPath)) {
|
|
56
|
+
console.log(`eval-mine-corpus: no corpus at ${corpusPath} - nothing to mine.`);
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Parse the JSONL corpus, skipping blank/malformed lines (never crash on data).
|
|
61
|
+
const rows = [];
|
|
62
|
+
for (const line of readFileSync(corpusPath, "utf-8").split("\n")) {
|
|
63
|
+
const s = line.trim();
|
|
64
|
+
if (!s) continue;
|
|
65
|
+
try {
|
|
66
|
+
const r = JSON.parse(s);
|
|
67
|
+
if (r && r.task_id && r.issue && r.classification) rows.push(r);
|
|
68
|
+
} catch {
|
|
69
|
+
/* skip malformed line */
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (rows.length === 0) {
|
|
74
|
+
console.log("eval-mine-corpus: corpus has no usable rows - nothing to mine.");
|
|
75
|
+
process.exit(0);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// task_ids that already have an adopted fixture: skip so we only propose new cases.
|
|
79
|
+
const adopted = new Set();
|
|
80
|
+
if (existsSync(evalTriageDir)) {
|
|
81
|
+
for (const name of readdirSync(evalTriageDir)) {
|
|
82
|
+
const inputPath = join(evalTriageDir, name, "input.json");
|
|
83
|
+
if (existsSync(inputPath)) {
|
|
84
|
+
try {
|
|
85
|
+
const meta = JSON.parse(readFileSync(join(evalTriageDir, name, "meta.json"), "utf-8"));
|
|
86
|
+
if (meta.task_id) adopted.add(meta.task_id);
|
|
87
|
+
} catch {
|
|
88
|
+
/* no meta.json -> can't dedup by task_id, that's fine */
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Group corpus rows by task_id.
|
|
95
|
+
const byTask = new Map();
|
|
96
|
+
for (const r of rows) {
|
|
97
|
+
if (!byTask.has(r.task_id)) byTask.set(r.task_id, []);
|
|
98
|
+
byTask.get(r.task_id).push(r);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const toFinding = (r) => ({
|
|
102
|
+
severity: r.severity,
|
|
103
|
+
file: r.file,
|
|
104
|
+
// Triage contract requires an integer line >= 0; corpus may carry null for a
|
|
105
|
+
// file-level finding, so coerce to 0 (the schema's file-level sentinel).
|
|
106
|
+
line: Number.isInteger(r.line) ? r.line : 0,
|
|
107
|
+
issue: r.issue,
|
|
108
|
+
fix: r.fix ?? null,
|
|
109
|
+
reviewer: r.reviewer ?? null,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Build a candidate per task. Highest-signal first (has a human reason/reviewer).
|
|
113
|
+
const candidates = [];
|
|
114
|
+
for (const [taskId, findings] of byTask) {
|
|
115
|
+
if (adopted.has(taskId)) continue;
|
|
116
|
+
const rawFindings = findings.map(toFinding);
|
|
117
|
+
const accepted = [];
|
|
118
|
+
const deferred = [];
|
|
119
|
+
const rejected = [];
|
|
120
|
+
for (const r of findings) {
|
|
121
|
+
if (r.classification === "accepted") accepted.push(toFinding(r));
|
|
122
|
+
else if (r.classification === "deferred")
|
|
123
|
+
deferred.push({ finding: toFinding(r), reason: r.reason || "TODO: reason (from corpus)" });
|
|
124
|
+
else if (r.classification === "rejected")
|
|
125
|
+
rejected.push({ finding: toFinding(r), reason: r.reason || "TODO: reason (from corpus)" });
|
|
126
|
+
}
|
|
127
|
+
const hasHumanSignal = findings.some((r) => r.reason || r.reviewer);
|
|
128
|
+
const title = findings.find((f) => f.task_title)?.task_title || taskId;
|
|
129
|
+
candidates.push({
|
|
130
|
+
taskId,
|
|
131
|
+
hasHumanSignal,
|
|
132
|
+
input: {
|
|
133
|
+
rawFindings,
|
|
134
|
+
// Corpus does not record scope/diff; a maintainer fills these before adopting.
|
|
135
|
+
scope: `TODO: scope for ${title}`,
|
|
136
|
+
diffSummary: "TODO: diff summary",
|
|
137
|
+
},
|
|
138
|
+
expected: {
|
|
139
|
+
accepted,
|
|
140
|
+
deferred,
|
|
141
|
+
rejected,
|
|
142
|
+
// Blockers loop back to dev, so a run with an accepted blocker is not approved.
|
|
143
|
+
approved: accepted.every((f) => f.severity !== "blocking"),
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
candidates.sort((a, b) => Number(b.hasHumanSignal) - Number(a.hasHumanSignal));
|
|
149
|
+
const selected = candidates.slice(0, opts.limit);
|
|
150
|
+
|
|
151
|
+
if (selected.length === 0) {
|
|
152
|
+
console.log("eval-mine-corpus: no new task_ids to propose (all already adopted).");
|
|
153
|
+
process.exit(0);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
let written = 0;
|
|
157
|
+
let invalid = 0;
|
|
158
|
+
for (const c of selected) {
|
|
159
|
+
const safe = c.taskId.replace(/[^A-Za-z0-9._-]/g, "_");
|
|
160
|
+
const dir = join(candidatesDir, safe);
|
|
161
|
+
const tag = c.hasHumanSignal ? " [human-signal]" : "";
|
|
162
|
+
if (opts.dryRun) {
|
|
163
|
+
console.log(` would emit candidate: ${safe} (${c.input.rawFindings.length} findings)${tag}`);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
mkdirSync(dir, { recursive: true });
|
|
167
|
+
writeFileSync(join(dir, "input.json"), JSON.stringify(c.input, null, 2) + "\n");
|
|
168
|
+
writeFileSync(join(dir, "expected.json"), JSON.stringify(c.expected, null, 2) + "\n");
|
|
169
|
+
writeFileSync(
|
|
170
|
+
join(dir, "meta.json"),
|
|
171
|
+
JSON.stringify({ task_id: c.taskId, source: "eval-mine-corpus", hasHumanSignal: c.hasHumanSignal }, null, 2) + "\n",
|
|
172
|
+
);
|
|
173
|
+
// Validate the emitted expected.json against the triage contract; flag if bad.
|
|
174
|
+
const res = spawnSync("node", [validator, join(dir, "expected.json")], { encoding: "utf-8" });
|
|
175
|
+
const ok = res.status === 0;
|
|
176
|
+
if (!ok) invalid++;
|
|
177
|
+
console.log(` emitted: triage-candidates/${safe}${tag} ${ok ? "(schema OK)" : "(SCHEMA FAIL - review)"}`);
|
|
178
|
+
written++;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (!opts.dryRun) {
|
|
182
|
+
console.log("");
|
|
183
|
+
console.log(`eval-mine-corpus: ${written} candidate(s) written to pipeline/eval/triage-candidates/`);
|
|
184
|
+
if (invalid > 0) console.log(` ${invalid} failed schema validation - fix before adopting.`);
|
|
185
|
+
console.log(" Review each, fill scope/diffSummary, then move good ones into");
|
|
186
|
+
console.log(" pipeline/eval/triage/<NN>-<name>/ to add them to the eval suite.");
|
|
187
|
+
}
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
.claude/multi-agent-refs 50
|
|
7
7
|
.claude/rules 12
|
|
8
8
|
.claude/schemas 23
|
|
9
|
-
.claude/scripts
|
|
9
|
+
.claude/scripts 178
|
|
10
10
|
.claude/settings.json 1
|
|
11
11
|
.claude/skills 428
|
|
12
12
|
.copilot/agents 8
|
|
13
13
|
.copilot/copilot-instructions.md 1
|
|
14
14
|
.copilot/lib 24
|
|
15
15
|
.copilot/schemas 23
|
|
16
|
-
.copilot/scripts
|
|
16
|
+
.copilot/scripts 178
|
|
17
17
|
.copilot/skills 465
|
|
@@ -21,7 +21,11 @@ import { dirname, join } from "node:path";
|
|
|
21
21
|
import { fileURLToPath } from "node:url";
|
|
22
22
|
|
|
23
23
|
const repoRoot = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
24
|
-
|
|
24
|
+
// Scope to pipeline/skills only. Slash commands under pipeline/commands also use
|
|
25
|
+
// the <name>/SKILL.md layout now, but they are command definitions
|
|
26
|
+
// (description + allowed-tools, name derived from the dir), NOT skills, so the
|
|
27
|
+
// skill frontmatter contract (required `name:`) does not apply to them.
|
|
28
|
+
const files = execSync("find pipeline/skills -name SKILL.md", { cwd: repoRoot, encoding: "utf-8" })
|
|
25
29
|
.trim()
|
|
26
30
|
.split("\n")
|
|
27
31
|
.filter(Boolean)
|
|
@@ -29,6 +33,10 @@ const files = execSync("find pipeline -name SKILL.md", { cwd: repoRoot, encoding
|
|
|
29
33
|
|
|
30
34
|
const errors = [];
|
|
31
35
|
const fail = (file, msg) => errors.push(`${file}: ${msg}`);
|
|
36
|
+
// Non-fatal quality signals (a terse description routes poorly). Warnings never
|
|
37
|
+
// fail the gate; they surface skills whose frontmatter could trigger better.
|
|
38
|
+
const warnings = [];
|
|
39
|
+
const warn = (file, msg) => warnings.push(`${file}: ${msg}`);
|
|
32
40
|
|
|
33
41
|
for (const file of files) {
|
|
34
42
|
const raw = readFileSync(join(repoRoot, file), "utf-8");
|
|
@@ -61,6 +69,18 @@ for (const file of files) {
|
|
|
61
69
|
fail(file, "description is empty");
|
|
62
70
|
} else if (fields.description.length > 1024) {
|
|
63
71
|
fail(file, `description exceeds 1024 chars (${fields.description.length})`);
|
|
72
|
+
} else {
|
|
73
|
+
// Routing quality: a description of a few words rarely says what the skill
|
|
74
|
+
// does AND when to use it, so the model cannot decide to trigger it.
|
|
75
|
+
// Skip YAML block scalars (`description: |` / `>`): this line-based parser
|
|
76
|
+
// only sees the indicator, not the real multi-line text, so a word count
|
|
77
|
+
// would be a false positive.
|
|
78
|
+
const desc = fields.description;
|
|
79
|
+
const isBlockScalar = /^[|>][+-]?\d*$/.test(desc);
|
|
80
|
+
const words = desc.split(/\s+/).filter(Boolean).length;
|
|
81
|
+
if (!isBlockScalar && words < 6) {
|
|
82
|
+
warn(file, `description is terse (${words} words) - say what it does AND when to use it`);
|
|
83
|
+
}
|
|
64
84
|
}
|
|
65
85
|
|
|
66
86
|
if ("user-invocable" in fields && !["true", "false"].includes(fields["user-invocable"])) {
|
|
@@ -72,6 +92,11 @@ for (const file of files) {
|
|
|
72
92
|
}
|
|
73
93
|
}
|
|
74
94
|
|
|
95
|
+
if (warnings.length > 0) {
|
|
96
|
+
console.warn(`lint-skills: ${warnings.length} warning(s) (non-fatal):`);
|
|
97
|
+
for (const w of warnings) console.warn(" " + w);
|
|
98
|
+
}
|
|
99
|
+
|
|
75
100
|
if (errors.length > 0) {
|
|
76
101
|
console.error(`lint-skills: ${errors.length} error(s) across ${files.length} SKILL.md files`);
|
|
77
102
|
for (const e of errors) console.error(" " + e);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# smoke-generate-issue.sh - contract for /multi-agent:
|
|
2
|
+
# smoke-generate-issue.sh - contract for /multi-agent:create-jira.
|
|
3
3
|
#
|
|
4
4
|
# Verifies:
|
|
5
5
|
# 1. All 3 files exist (1 command, shared ref, 1 Copilot/plugin SKILL.md).
|
|
@@ -16,9 +16,9 @@ set -euo pipefail
|
|
|
16
16
|
|
|
17
17
|
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
18
18
|
ROOT="$(cd "$HERE/../.." && pwd)"
|
|
19
|
-
CMD="$ROOT/pipeline/commands/multi-agent/
|
|
19
|
+
CMD="$ROOT/pipeline/commands/multi-agent/create-jira/SKILL.md"
|
|
20
20
|
REF="$ROOT/pipeline/multi-agent-refs/generate-issue.md"
|
|
21
|
-
SKILL="$ROOT/pipeline/skills/shared/core/multi-agent-
|
|
21
|
+
SKILL="$ROOT/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md"
|
|
22
22
|
DISPATCHER="$ROOT/pipeline/commands/multi-agent/SKILL.md"
|
|
23
23
|
CONTRACT="$ROOT/pipeline/multi-agent-refs/cross-cli-contract.md"
|
|
24
24
|
SYNC="$ROOT/pipeline/commands/multi-agent/sync/SKILL.md"
|
|
@@ -43,7 +43,7 @@ echo ""
|
|
|
43
43
|
echo "→ 2. frontmatter keys"
|
|
44
44
|
head -5 "$CMD" | grep -q '^description:' && pass "description: ${CMD##*/}" || fail "description missing: ${CMD##*/}"
|
|
45
45
|
head -5 "$CMD" | grep -q '^argument-hint:' && pass "argument-hint: ${CMD##*/}" || fail "argument-hint missing: ${CMD##*/}"
|
|
46
|
-
head -8 "$SKILL" | grep -q '^name: multi-agent-
|
|
46
|
+
head -8 "$SKILL" | grep -q '^name: multi-agent-create-jira$' && pass "name: multi-agent-create-jira" || fail "name wrong: $SKILL"
|
|
47
47
|
head -8 "$SKILL" | grep -q '^language: en' && pass "language en" || fail "language missing: $SKILL"
|
|
48
48
|
head -8 "$SKILL" | grep -q '^user-invocable: true' && pass "user-invocable" || fail "user-invocable missing: $SKILL"
|
|
49
49
|
|
|
@@ -89,15 +89,15 @@ grep -Fqi "swagger" "$REF" && pass "swagger context present" || fail "swagger co
|
|
|
89
89
|
|
|
90
90
|
echo ""
|
|
91
91
|
echo "→ 8. registration + count consistency (36)"
|
|
92
|
-
grep -Fq '| `
|
|
93
|
-
grep -Fq "
|
|
92
|
+
grep -Fq '| `create-jira ' "$DISPATCHER" && pass "dispatcher routing: create-jira" || fail "dispatcher routing missing: generate"
|
|
93
|
+
grep -Fq "create-jira/SKILL.md" "$DISPATCHER" && pass "dispatcher loading row" || fail "dispatcher loading row missing"
|
|
94
94
|
grep -Fq "## 1. Command Inventory (36 commands)" "$CONTRACT" && pass "contract count = 36" || fail "contract count wrong"
|
|
95
|
-
grep -Eq '(^|[ ,])
|
|
95
|
+
grep -Eq '(^|[ ,])create-jira([ ,]|$)' "$CONTRACT" && pass "contract list has create-jira" || fail "contract list missing generate"
|
|
96
96
|
grep -Fq "**36 commands are synced**" "$SYNC" && pass "sync count = 36" || fail "sync count wrong"
|
|
97
97
|
SYNC_SKILL="$ROOT/pipeline/skills/shared/core/multi-agent-sync/SKILL.md"
|
|
98
98
|
grep -Fq "**36 commands are synced**" "$SYNC_SKILL" && pass "sync SKILL count = 36" || fail "sync SKILL count wrong (Copilot parity)"
|
|
99
|
-
grep -Fq "
|
|
100
|
-
grep -c "multi-agent:
|
|
99
|
+
grep -Fq "create-jira" "$ROOT/pipeline/skills/shared/core/multi-agent-help/SKILL.md" && pass "help SKILL lists create-jira" || fail "help SKILL missing create-jira (Copilot parity)"
|
|
100
|
+
grep -c "multi-agent:create-jira" "$HELP" | awk '{exit !($1>=2)}' && pass "help.md has EN + TR entries" || fail "help.md entries incomplete"
|
|
101
101
|
# no stale split-command references anywhere in the synced surfaces
|
|
102
102
|
if grep -rqE "generate-task|generate-bug" "$DISPATCHER" "$CONTRACT" "$SYNC" "$HELP" "$CMD" "$REF" "$SKILL"; then
|
|
103
103
|
fail "stale generate-task/generate-bug reference found"
|
|
@@ -134,8 +134,13 @@ function stripManagedBlock(filePath) {
|
|
|
134
134
|
const re =
|
|
135
135
|
/\s*<!-- multi-agent-pipeline:begin -->[\s\S]*?<!-- multi-agent-pipeline:end -->\s*/m;
|
|
136
136
|
if (!re.test(content)) {
|
|
137
|
-
//
|
|
138
|
-
|
|
137
|
+
// Copilot's install (install/copilot.mjs) does not wrap the block in
|
|
138
|
+
// begin/end markers; it always writes the pipeline section LAST, from the
|
|
139
|
+
// `# Multi-Agent Development Pipeline` heading to EOF, keeping any user
|
|
140
|
+
// content ABOVE it. So slicing from that heading to EOF reliably removes
|
|
141
|
+
// only our section regardless of file size (no arbitrary size cap - a cap
|
|
142
|
+
// used to orphan the block in files >50 KB).
|
|
143
|
+
if (content.includes("# Multi-Agent Development Pipeline")) {
|
|
139
144
|
// Heuristic: Copilot's generateCopilotInstructions output. Only strip the
|
|
140
145
|
// pipeline section, not the whole file.
|
|
141
146
|
const marker = "# Multi-Agent Development Pipeline";
|
|
@@ -244,8 +249,9 @@ async function main() {
|
|
|
244
249
|
console.log(" PRESERVED (never touched):");
|
|
245
250
|
console.log(" - Personal access tokens in OS credential store (Keychain / Credential Manager / libsecret)");
|
|
246
251
|
console.log(" - ~/.claude/CLAUDE.md (your customizations)");
|
|
252
|
+
console.log(" - ~/.claude/rules/ (user-owned; installed write-if-missing, never overwritten)");
|
|
247
253
|
console.log(" - ~/.claude/multi-agent-preferences.json (your settings)");
|
|
248
|
-
console.log(" -
|
|
254
|
+
console.log(" - Your own content in copilot-instructions.md above the pipeline section");
|
|
249
255
|
console.log("");
|
|
250
256
|
|
|
251
257
|
if (!(await confirm(" Proceed? (y/N) "))) {
|
|
@@ -259,7 +265,12 @@ async function main() {
|
|
|
259
265
|
const CLAUDE = join(HOME, ".claude");
|
|
260
266
|
rmIfExists(join(CLAUDE, "commands", "multi-agent"));
|
|
261
267
|
rmIfExists(join(CLAUDE, "scripts"));
|
|
262
|
-
|
|
268
|
+
// NOTE: ~/.claude/rules/ is USER-OWNED. install lays baseline rules down
|
|
269
|
+
// write-if-missing and NEVER overwrites them (install/claude.mjs
|
|
270
|
+
// installRules, skipExisting) so users can evolve their global rules
|
|
271
|
+
// locally. Deleting the tree here would destroy those personal edits
|
|
272
|
+
// (e.g. the git-attribution rule) -- asymmetric data loss. Leave rules
|
|
273
|
+
// in place on uninstall, exactly like CLAUDE.md and preferences.
|
|
263
274
|
const skills = join(CLAUDE, "skills");
|
|
264
275
|
let n = rmMatchingDirs(skills, (name) => name === "multi-agent" || name.startsWith("multi-agent-"));
|
|
265
276
|
n += rmMatchingDirs(skills, (name) => name === "figma-ios" || name === "figma-android" || name === "figma-common" || name === "figma-to-component");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-07-
|
|
3
|
+
"generatedAt": "2026-07-10T13:07:43Z",
|
|
4
4
|
"skillCount": 187,
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"path": "shared/core/multi-agent-analysis-resolve/SKILL.md",
|
|
16
|
-
"sha256": "
|
|
16
|
+
"sha256": "e1c400e1db0ed1c8956a9989f6232c4d45a6b9002331379a2e119b344e948622"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "shared/core/multi-agent-analysis/SKILL.md",
|
|
20
|
-
"sha256": "
|
|
20
|
+
"sha256": "8d37d4d90493ccda7a39084651537fd4d28f2bdde82ecaac835d8c0f2d996363"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "shared/core/multi-agent-autopilot/SKILL.md",
|
|
@@ -25,11 +25,15 @@
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"path": "shared/core/multi-agent-build-optimize/SKILL.md",
|
|
28
|
-
"sha256": "
|
|
28
|
+
"sha256": "0ba38c451d193063cf20e5efe6e6af1e1c738e03448d8f917259a8e2f6b2cd9b"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"path": "shared/core/multi-agent-channels/SKILL.md",
|
|
32
|
-
"sha256": "
|
|
32
|
+
"sha256": "122792d25a2b7329af80086b6e0e563a7b8c3ec2e954ceb7e7c9dc8ea7cf71ba"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"path": "shared/core/multi-agent-create-jira/SKILL.md",
|
|
36
|
+
"sha256": "40caf0489ad8322cd00d792a244e772d4ddb6ccfd7c3807729d6b17590e7f81c"
|
|
33
37
|
},
|
|
34
38
|
{
|
|
35
39
|
"path": "shared/core/multi-agent-delete/SKILL.md",
|
|
@@ -57,19 +61,15 @@
|
|
|
57
61
|
},
|
|
58
62
|
{
|
|
59
63
|
"path": "shared/core/multi-agent-finish/SKILL.md",
|
|
60
|
-
"sha256": "
|
|
64
|
+
"sha256": "3e8e430f7aee626be96129a9d0ae6c9ac5ef0dbf80cbe580dde2d7fb5fccfed1"
|
|
61
65
|
},
|
|
62
66
|
{
|
|
63
67
|
"path": "shared/core/multi-agent-garbage-collect/SKILL.md",
|
|
64
68
|
"sha256": "24736f163e645e2bee7d552e555ae6e32cd3fc3d15c844813a75b908a58d52fd"
|
|
65
69
|
},
|
|
66
|
-
{
|
|
67
|
-
"path": "shared/core/multi-agent-generate/SKILL.md",
|
|
68
|
-
"sha256": "be92e3c2599bbbab79bd4368ac8a62c55f97e49363e195926039dc2d1111324f"
|
|
69
|
-
},
|
|
70
70
|
{
|
|
71
71
|
"path": "shared/core/multi-agent-help/SKILL.md",
|
|
72
|
-
"sha256": "
|
|
72
|
+
"sha256": "15755c1abd508f708e548529c869bc937f1ea038bbabb1cf47dfc3a8b0343346"
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
75
|
"path": "shared/core/multi-agent-issue/SKILL.md",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
"path": "shared/core/multi-agent-refactor/SKILL.md",
|
|
116
|
-
"sha256": "
|
|
116
|
+
"sha256": "f8a9495f6aebacba634672d6c9416046521cbdfa769746c9ff3a4a993482a85a"
|
|
117
117
|
},
|
|
118
118
|
{
|
|
119
119
|
"path": "shared/core/multi-agent-resume/SKILL.md",
|
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
"path": "shared/core/multi-agent-sync/SKILL.md",
|
|
148
|
-
"sha256": "
|
|
148
|
+
"sha256": "0ec56a2a802bbd59843bf8e9a6adfdae8c1e626ea07700914cf12e0d0c00dace"
|
|
149
149
|
},
|
|
150
150
|
{
|
|
151
151
|
"path": "shared/core/multi-agent-test/SKILL.md",
|
|
@@ -157,7 +157,7 @@
|
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
"path": "shared/core/multi-agent/SKILL.md",
|
|
160
|
-
"sha256": "
|
|
160
|
+
"sha256": "758646b660047bb4595528a57153afda0e1b331c70ad8c04bbd18066fc4bb336"
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
163
|
"path": "shared/external/accessibility-compliance-accessibility-audit/SKILL.md",
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-07-09T19:01:45.304Z",
|
|
4
3
|
"skillCount": 187,
|
|
5
4
|
"entries": [
|
|
6
5
|
{
|
|
@@ -786,6 +785,15 @@
|
|
|
786
785
|
"triggerPaths": [],
|
|
787
786
|
"relativePath": "shared/core/multi-agent-channels/SKILL.md"
|
|
788
787
|
},
|
|
788
|
+
{
|
|
789
|
+
"name": "multi-agent-create-jira",
|
|
790
|
+
"description": "Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with auto-sizing sections, full preview + explicit approval before create.",
|
|
791
|
+
"platform": null,
|
|
792
|
+
"group": "core",
|
|
793
|
+
"triggerKeywords": [],
|
|
794
|
+
"triggerPaths": [],
|
|
795
|
+
"relativePath": "shared/core/multi-agent-create-jira/SKILL.md"
|
|
796
|
+
},
|
|
789
797
|
{
|
|
790
798
|
"name": "multi-agent-delete",
|
|
791
799
|
"description": "Uninstall the pipeline from Claude Code + Copilot CLI. Keychain access tokens are left untouched. Asks for double confirmation.",
|
|
@@ -858,15 +866,6 @@
|
|
|
858
866
|
"triggerPaths": [],
|
|
859
867
|
"relativePath": "shared/core/multi-agent-garbage-collect/SKILL.md"
|
|
860
868
|
},
|
|
861
|
-
{
|
|
862
|
-
"name": "multi-agent-generate",
|
|
863
|
-
"description": "Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with auto-sizing sections, full preview + explicit approval before create.",
|
|
864
|
-
"platform": null,
|
|
865
|
-
"group": "core",
|
|
866
|
-
"triggerKeywords": [],
|
|
867
|
-
"triggerPaths": [],
|
|
868
|
-
"relativePath": "shared/core/multi-agent-generate/SKILL.md"
|
|
869
|
-
},
|
|
870
869
|
{
|
|
871
870
|
"name": "multi-agent-help",
|
|
872
871
|
"description": "Multi-agent pipeline usage guide - renders in EN or TR per prefs.global.outputLanguage (falls back to promptLanguage for backward compatibility).",
|
|
@@ -968,7 +967,7 @@
|
|
|
968
967
|
},
|
|
969
968
|
{
|
|
970
969
|
"name": "multi-agent-refactor",
|
|
971
|
-
"description": "Analyse the project,
|
|
970
|
+
"description": "Analyse the project: extract adapted best-practices, hunt real bugs + improvement areas, check upstream drift of derived skills, draft one plan, take approval, develop, then ask whether to sync.",
|
|
972
971
|
"platform": null,
|
|
973
972
|
"group": "core",
|
|
974
973
|
"triggerKeywords": [],
|
package/pipeline/skills/shared/core/{multi-agent-generate → multi-agent-create-jira}/SKILL.md
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: multi-agent-
|
|
2
|
+
name: multi-agent-create-jira
|
|
3
3
|
language: en
|
|
4
4
|
description: "Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with auto-sizing sections, full preview + explicit approval before create."
|
|
5
5
|
user-invocable: true
|
|
6
6
|
argument-hint: "[\"<free-text description>\"] [figma-url] [swagger-url] - all optional, asked interactively when missing"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# multi-agent
|
|
9
|
+
# multi-agent create-jira - Standards-Compliant Jira Issue Creator
|
|
10
10
|
|
|
11
11
|
**Input**: $ARGUMENTS
|
|
12
12
|
|
|
@@ -98,7 +98,7 @@ Utility Commands (dash form on Copilot, colon form on Claude Code):
|
|
|
98
98
|
/multi-agent:purge Worktree + logs - full reset (double confirm)
|
|
99
99
|
/multi-agent:channels Post multi-channel report (Jira/Confluence/Wiki/PR)
|
|
100
100
|
/multi-agent:review Review current diff only
|
|
101
|
-
/multi-agent:
|
|
101
|
+
/multi-agent:create-jira ["desc"] [figma-url] [swagger-url] Create a Jira Task/Bug/Story matching team conventions (asks type + preview + approval)
|
|
102
102
|
/multi-agent:sync Sync ecosystem (Claude + Copilot + website)
|
|
103
103
|
/multi-agent:setup Keychain tokens + Git identity + language onboarding
|
|
104
104
|
/multi-agent:language [en|tr] Show or set prompt language
|
|
@@ -234,7 +234,7 @@ Utility Komutları:
|
|
|
234
234
|
/multi-agent:purge Worktree + log'lar - tam reset (çift onay)
|
|
235
235
|
/multi-agent:channels Multi-channel rapor gönder (Jira/Confluence/Wiki/PR)
|
|
236
236
|
/multi-agent:review Sadece mevcut diff'i review et
|
|
237
|
-
/multi-agent:
|
|
237
|
+
/multi-agent:create-jira ["açıklama"] [figma-url] [swagger-url] Takım standartlarına uygun Jira Task/Bug/Story oluştur (tip sorar + önizleme + onay)
|
|
238
238
|
/multi-agent:sync Ekosistemi senkronize et
|
|
239
239
|
/multi-agent:setup Keychain token + Git kimliği + dil onboarding
|
|
240
240
|
/multi-agent:language [en|tr] Prompt dilini göster veya ayarla
|
|
@@ -139,9 +139,9 @@ When invoked with the `release` argument:
|
|
|
139
139
|
**36 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
|
|
140
140
|
|
|
141
141
|
```
|
|
142
|
-
analysis, analysis-resolve, autopilot, build-optimize, channels, delete, dev,
|
|
142
|
+
analysis, analysis-resolve, autopilot, build-optimize, channels, create-jira, delete, dev,
|
|
143
143
|
dev-autopilot, dev-local, dev-local-autopilot, diff-explain, finish, garbage-collect,
|
|
144
|
-
|
|
144
|
+
help, issue, jira, kill, language, local,
|
|
145
145
|
local-autopilot, log, manual-test, prune-logs, purge, refactor, resume, review,
|
|
146
146
|
scan, search, setup, stack, status, sync, test, update
|
|
147
147
|
```
|
|
@@ -94,6 +94,7 @@
|
|
|
94
94
|
| core | `multi-agent-autopilot` | - | Launch any task in autopilot mode: skips every confirmation, runs end-to-end autonomously. |
|
|
95
95
|
| core | `multi-agent-build-optimize` | - | Wrapper that dispatches to xcode-build-orchestrator on iOS repos. Benchmarks the current Xcode build, runs compilation / project / SPM analy |
|
|
96
96
|
| core | `multi-agent-channels` | - | Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbuck |
|
|
97
|
+
| core | `multi-agent-create-jira` | - | Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with |
|
|
97
98
|
| core | `multi-agent-delete` | - | Uninstall the pipeline from Claude Code + Copilot CLI. Keychain access tokens are left untouched. Asks for double confirmation. |
|
|
98
99
|
| core | `multi-agent-dev` | - | Fast development mode: Init → Dev (Opus) → Test → Commit → Report. Analysis, planning, and review phases are skipped. |
|
|
99
100
|
| core | `multi-agent-dev-autopilot` | - | Fastest mode: Dev (Opus) plus Autopilot. Init → Dev → Commit → Report with zero confirmations. |
|
|
@@ -102,7 +103,6 @@
|
|
|
102
103
|
| core | `multi-agent-diff-explain` | - | Map Phase 4 triage findings to branch diff lines. Read-only post-hoc command, used after review to answer 'which finding lines up with which |
|
|
103
104
|
| core | `multi-agent-finish` | - | Continue already-done LOCAL work through the pipeline tail: Review → Build+Test → Commit/PR → Report (technical analysis + Jira test-scenari |
|
|
104
105
|
| core | `multi-agent-garbage-collect` | - | Sweep leftover /tmp scratch (picker state, review diffs, channel payloads, analysis drafts) from past runs. Dry-run first; confirms before d |
|
|
105
|
-
| core | `multi-agent-generate` | - | Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with |
|
|
106
106
|
| core | `multi-agent-help` | - | Multi-agent pipeline usage guide - renders in EN or TR per prefs.global.outputLanguage (falls back to promptLanguage for backward compatib |
|
|
107
107
|
| core | `multi-agent-issue` | - | List unassigned GitHub issues, pick one, auto-assign, and launch the multi-agent pipeline. |
|
|
108
108
|
| core | `multi-agent-jira` | - | List open Jira issues, pick one, and launch the multi-agent pipeline. |
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
| core | `multi-agent-manual-test` | - | Switch to the active task's branch and prepare it for manual testing in Xcode. Phase 5 standalone (the UI Bug Hunter lives at multi-agent-te |
|
|
115
115
|
| core | `multi-agent-prune-logs` | - | Delete per-task project logs under ~/.claude/logs/multi-agent (filter by age/project/task). Audit trail + metrics are preserved. Dry-run fir |
|
|
116
116
|
| core | `multi-agent-purge` | - | ⚠️ Wipes every worktree, branch, log, and state file. Irreversible; asks for double confirmation. |
|
|
117
|
-
| core | `multi-agent-refactor` | - | Analyse the project
|
|
117
|
+
| core | `multi-agent-refactor` | - | Analyse the project: extract adapted best-practices, hunt real bugs + improvement areas, check upstream drift of derived skills, draft one p |
|
|
118
118
|
| core | `multi-agent-resume` | - | Resume a stopped or failed task from the phase where it left off. |
|
|
119
119
|
| core | `multi-agent-review` | - | Run parallel review on the current branch's diff: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). R |
|
|
120
120
|
| core | `multi-agent-scan` | - | Skill security scan: walks local skill directories against a tiered pattern catalog. |
|