@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 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`, `generate-task`, `generate-bug`. Full list: `/multi-agent:help`.
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
 
@@ -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
- const scriptCount = countFiles(scriptsSrc) - DEV_ONLY_SCRIPTS.length;
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} (${DEV_ONLY_SCRIPTS.length} dev-only excluded)`,
114
+ ` -> ${scriptCount} files copied to ${dest} (${excludedCount} dev-only excluded)`,
111
115
  );
112
116
  }
113
117
 
@@ -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
- const scriptCount = countFiles(scriptsSrc) - DEV_ONLY_SCRIPTS.length;
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} (${DEV_ONLY_SCRIPTS.length} dev-only excluded)`,
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.0",
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
- | `generate ["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. |
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
- | `generate` | `$HOME/.claude/commands/multi-agent/generate/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/generate-issue.md`) |
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 generate - Standards-Compliant Jira Issue Creator
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:generate ["desc"] [figma-url] [swagger-url] Create a Jira Task/Bug/Story matching team conventions (asks type + mining + active sprint + auto-sizing sections + preview & approval)
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:generate "Profile screen empty state" https://figma.com/design/abc?node-id=1-2
226
- /multi-agent:generate "Login crash on iOS 17, see attached log"
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:generate ["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)
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:generate "Profil ekranı empty state" https://figma.com/design/abc?node-id=1-2
438
- /multi-agent:generate "iOS 17'de login crash, log ekte"
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
- generate, help, issue, jira, kill, language, local,
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 '$key'
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 '$val' -AsPlainText -Force
144
- New-StoredCredential -Target '$key' -UserName '${USER:-${USERNAME:-claude}}' -SecurePassword \$pwd -Persist LocalMachine | Out-Null
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 '$key' -ErrorAction SilentlyContinue" >/dev/null 2>&1 || true ;;
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
- generate, help, issue, jira, kill, language, local,
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): `generate`
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:generate`. 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.
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 / figma-ios / figma-android /
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: new Date().toISOString(),
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 177
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 177
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
- const files = execSync("find pipeline -name SKILL.md", { cwd: repoRoot, encoding: "utf-8" })
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:generate.
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/generate/SKILL.md"
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-generate/SKILL.md"
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-generate$' && pass "name: multi-agent-generate" || fail "name wrong: $SKILL"
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 '| `generate ' "$DISPATCHER" && pass "dispatcher routing: generate" || fail "dispatcher routing missing: generate"
93
- grep -Fq "generate/SKILL.md" "$DISPATCHER" && pass "dispatcher loading row" || fail "dispatcher loading row missing"
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 '(^|[ ,])generate, help([ ,]|$)' "$CONTRACT" && pass "contract list has generate" || fail "contract list missing generate"
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 "generate" "$ROOT/pipeline/skills/shared/core/multi-agent-help/SKILL.md" && pass "help SKILL lists generate" || fail "help SKILL missing generate (Copilot parity)"
100
- grep -c "multi-agent:generate" "$HELP" | awk '{exit !($1>=2)}' && pass "help.md has EN + TR entries" || fail "help.md entries incomplete"
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
- // Legacy: maybe the whole file is ours (Copilot wrote it before markers)
138
- if (content.includes("# Multi-Agent Development Pipeline") && content.length < 50000) {
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(" - User content outside <!-- multi-agent-pipeline:begin/end --> markers");
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
- rmIfExists(join(CLAUDE, "rules"));
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-09T19:01:45Z",
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": "53e05855937c28986e9328589ecc9e7361473bf71a548a1207c325a13da82488"
16
+ "sha256": "e1c400e1db0ed1c8956a9989f6232c4d45a6b9002331379a2e119b344e948622"
17
17
  },
18
18
  {
19
19
  "path": "shared/core/multi-agent-analysis/SKILL.md",
20
- "sha256": "1711d118edd37fb64051f9dba3d9bf8f7a7565ff3b91e5336f547cff905d6d5b"
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": "9ffd6f8eb758c079bb6b84817023566dc46ff8a1e2d4b6f23e5ab3c0300b23dc"
28
+ "sha256": "0ba38c451d193063cf20e5efe6e6af1e1c738e03448d8f917259a8e2f6b2cd9b"
29
29
  },
30
30
  {
31
31
  "path": "shared/core/multi-agent-channels/SKILL.md",
32
- "sha256": "d31fea96c01fb48b7dbbd496cb378593fe3b17d2ee821c093e8997fe2d4ba61f"
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": "086438494380328e3ed06c7e0ad87351c0b620d7e46dd9ff406b503c35a4ad92"
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": "0a8da9321dcae6d5dc3be664fcaaa5c575d346d29acf39c65aea99f37a9629ba"
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": "bbf735fc92cd0d8577f5f9a6ec8ded7afeb6017e54be1207b79e3a2ab73a24e1"
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": "c9459954dfd20f9b823a9ef7730baa474a1332efbbe76c92558153569c4de99b"
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": "0efe9bacd0e459c58260fb25e31e82d82aa73437e5c7953f680eab49484a76b3"
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, score it, draft an improvement plan, take approval, develop, then ask whether to sync.",
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": [],
@@ -1,12 +1,12 @@
1
1
  ---
2
- name: multi-agent-generate
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 generate - Standards-Compliant Jira Issue Creator
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:generate ["desc"] [figma-url] [swagger-url] Create a Jira Task/Bug/Story matching team conventions (asks type + preview + approval)
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:generate ["açıklama"] [figma-url] [swagger-url] Takım standartlarına uygun Jira Task/Bug/Story oluştur (tip sorar + önizleme + onay)
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
- generate, help, issue, jira, kill, language, local,
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, score it, draft an improvement plan, take approval, develop, then ask whether to sync. |
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. |