@mmerterden/multi-agent-pipeline 14.2.2 → 15.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +186 -6
- package/README.md +19 -12
- package/README.tr.md +19 -12
- package/SECURITY.md +43 -0
- package/docs/FIGMA_PIPELINE.md +3 -3
- package/docs/adr/0006-skills-core-external-split.md +1 -1
- package/docs/adr/0007-multi-tool-adapter-framework.md +1 -1
- package/docs/adr/0009-claude-stack-skills-plugin-only.md +31 -0
- package/docs/adr/README.md +1 -0
- package/docs/architecture.md +13 -13
- package/docs/ecosystem.md +31 -31
- package/docs/features.md +5 -5
- package/index.js +6 -1
- package/install/_codex-agents.mjs +11 -2
- package/install/_common.mjs +109 -3
- package/install/_dev-only-files.mjs +0 -1
- package/install/_platform-filter.mjs +54 -113
- package/install/_plugin-skills.mjs +36 -36
- package/install/claude.mjs +251 -61
- package/install/codex.mjs +28 -6
- package/install/copilot.mjs +69 -9
- package/install/index.mjs +9 -3
- package/install/templates/codex-instructions.md +1 -1
- package/install/templates/copilot-instructions.md +3 -3
- package/package.json +2 -3
- package/pipeline/commands/multi-agent/SKILL.md +2 -0
- package/pipeline/commands/multi-agent/analysis/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +186 -0
- package/pipeline/commands/multi-agent/dev/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +19 -4
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/jira/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +81 -0
- package/pipeline/commands/multi-agent/refactor/SKILL.md +36 -1
- package/pipeline/commands/multi-agent/resume/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/{ship → resume-local}/SKILL.md +8 -8
- package/pipeline/commands/multi-agent/scan/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/setup/SKILL.md +5 -5
- package/pipeline/commands/multi-agent/stack/SKILL.md +62 -40
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/sync/SKILL.md +18 -11
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +2 -0
- package/pipeline/commands/multi-agent/update/SKILL.md +4 -4
- package/pipeline/lib/issue-fetcher.sh +1 -1
- package/pipeline/lib/parse-complaints.sh +316 -0
- package/pipeline/multi-agent-refs/channels/wiki.md +3 -3
- package/pipeline/multi-agent-refs/complaint-analysis-template.md +99 -0
- package/pipeline/multi-agent-refs/component-dispatch.md +6 -6
- package/pipeline/multi-agent-refs/cross-cli-contract.md +16 -16
- package/pipeline/multi-agent-refs/features/external-context-injection.md +1 -1
- package/pipeline/multi-agent-refs/features/stack-skill-routing.md +5 -5
- package/pipeline/multi-agent-refs/generate-issue.md +1 -1
- package/pipeline/multi-agent-refs/phases/modes.md +1 -1
- package/pipeline/multi-agent-refs/phases/operations.md +7 -1
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +7 -7
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +5 -5
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +3 -3
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +12 -12
- package/pipeline/multi-agent-refs/phases/phase-5-test.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-7-report.md +6 -0
- package/pipeline/multi-agent-refs/tracker-contract.md +3 -2
- package/pipeline/multi-agent-refs/wiki-capture.md +2 -2
- package/pipeline/preferences-template.json +18 -5
- package/pipeline/rules/figma-pipeline.md +2 -2
- package/pipeline/schemas/agent-state.schema.json +1 -1
- package/pipeline/schemas/complaint-analysis-spec.schema.json +216 -0
- package/pipeline/schemas/migrations/prefs-2.5.0-to-2.6.0.mjs +46 -0
- package/pipeline/schemas/prefs.schema.json +296 -66
- package/pipeline/schemas/token-budget.json +2 -2
- package/pipeline/scripts/README.md +4 -3
- package/pipeline/scripts/_stack-routing.mjs +79 -0
- package/pipeline/scripts/audit-log-rotate.sh +4 -1
- package/pipeline/scripts/build-skills-index.mjs +11 -0
- package/pipeline/scripts/build-stack-plugins.mjs +28 -60
- package/pipeline/scripts/check-derived-drift.mjs +55 -28
- package/pipeline/scripts/gc-worktrees.sh +4 -1
- package/pipeline/scripts/gen-skills-index.mjs +1 -1
- package/pipeline/scripts/match-skills.mjs +12 -2
- package/pipeline/scripts/migrate-prefs.mjs +33 -21
- package/pipeline/scripts/phase-tracker.sh +32 -5
- package/pipeline/scripts/phase0-exit-gate.mjs +3 -2
- package/pipeline/scripts/run-aggregator.mjs +7 -2
- package/pipeline/scripts/scan-agent-config.sh +1 -1
- package/pipeline/scripts/skill-conformance.mjs +165 -30
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +1 -1
- package/pipeline/scripts/test-gap-rules/android.json +25 -0
- package/pipeline/scripts/test-gap-rules/ios.json +34 -0
- package/pipeline/scripts/test-gap-rules/node.json +29 -0
- package/pipeline/scripts/test-gap-rules/python.json +25 -0
- package/pipeline/scripts/uninstall.mjs +160 -11
- package/pipeline/scripts/usage-report.mjs +426 -0
- package/pipeline/scripts/validate-complaint-doc.mjs +250 -0
- package/pipeline/scripts/validate-reviewer.mjs +9 -3
- package/pipeline/skills/.skill-manifest.json +156 -108
- package/pipeline/skills/.skills-index.json +449 -12
- package/pipeline/skills/shared/README.md +14 -10
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +49 -0
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +83 -0
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +153 -90
- package/pipeline/skills/shared/core/{multi-agent-ship → multi-agent-resume-local}/SKILL.md +6 -6
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +89 -22
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +1 -1
- package/pipeline/skills/shared/external/ios-coding-standard/modules/_TEMPLATE.yml +2 -2
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +368 -33
- package/pipeline/skills/shared/external/ios-coding-standard/references/swiftlint.draft.yml +1 -2
- package/pipeline/skills/shared/external/ios-coding-standard/scripts/check_structure.py +765 -0
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +75 -0
- package/pipeline/skills/shared/external/ios-module-structure/modules/_TEMPLATE.yml +131 -0
- package/pipeline/skills/shared/external/ios-module-structure/references/rules.yml +559 -0
- package/pipeline/skills/shared/external/ios-module-structure/scripts/check_structure.py +765 -0
- package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +53 -10
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +4 -3
- package/pipeline/skills/skills-index.md +7 -4
package/install/copilot.mjs
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
copyFile,
|
|
17
17
|
copySkillsIndex,
|
|
18
18
|
countFiles,
|
|
19
|
+
dirsIdentical,
|
|
19
20
|
ensureDir,
|
|
20
21
|
ensureRealDir,
|
|
21
22
|
isDryRun,
|
|
@@ -24,11 +25,19 @@ import {
|
|
|
24
25
|
wipeDir,
|
|
25
26
|
writeFile,
|
|
26
27
|
} from "./_common.mjs";
|
|
27
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
EXTERNAL_SKILLS_MANIFEST,
|
|
30
|
+
partitionExternalSkillsByPlugins,
|
|
31
|
+
writeExternalSkillsManifest,
|
|
32
|
+
} from "./_platform-filter.mjs";
|
|
28
33
|
import { DEV_ONLY_SCRIPTS, countDevOnlyFiles } from "./_dev-only-files.mjs";
|
|
29
34
|
import { generateCopilotInstructions } from "./_copilot-instructions.mjs";
|
|
30
35
|
import { legacyTrailingContent, mergeManagedBlock } from "./_managed-block.mjs";
|
|
31
|
-
import {
|
|
36
|
+
import {
|
|
37
|
+
installAuthoredPluginSkills,
|
|
38
|
+
pipelineOwnedSkillNames,
|
|
39
|
+
pluginsToDeliver,
|
|
40
|
+
} from "./_plugin-skills.mjs";
|
|
32
41
|
import { registerMcpServer } from "./_mcp-register.mjs";
|
|
33
42
|
|
|
34
43
|
/**
|
|
@@ -357,14 +366,65 @@ function installSkills(opts) {
|
|
|
357
366
|
}
|
|
358
367
|
|
|
359
368
|
if (existsSync(sharedExternalSrc)) {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
369
|
+
// Active-stack filter: Copilot has no plugin loader, so its local copy is the
|
|
370
|
+
// only stack-skill source it has - but it should still carry the SAME stack
|
|
371
|
+
// set the enabled plugins serve on Claude Code, not the whole catalog. The
|
|
372
|
+
// enabled set comes from ~/.claude/settings.json (pluginsToDeliver); the
|
|
373
|
+
// --platform flag stays as the fallback for machines without one.
|
|
374
|
+
const { names: enabled, source: selectionSource } = pluginsToDeliver(home, platformFlag);
|
|
375
|
+
const { keep, skipped } = partitionExternalSkillsByPlugins(sharedExternalSrc, enabled);
|
|
376
|
+
ensureDir(dest);
|
|
377
|
+
// Read the PREVIOUS delivery manifest before this install overwrites it -
|
|
378
|
+
// it is what makes the stale prune below manifest-scoped.
|
|
379
|
+
let prevDelivered = null;
|
|
380
|
+
try {
|
|
381
|
+
const parsed = JSON.parse(readFileSync(join(dest, EXTERNAL_SKILLS_MANIFEST), "utf-8"));
|
|
382
|
+
if (Array.isArray(parsed)) prevDelivered = new Set(parsed.filter((n) => typeof n === "string"));
|
|
383
|
+
} catch {
|
|
384
|
+
prevDelivered = null;
|
|
385
|
+
}
|
|
386
|
+
for (const name of keep) {
|
|
387
|
+
const src = join(sharedExternalSrc, name);
|
|
388
|
+
const dst = join(dest, name);
|
|
389
|
+
if (!useSymlinks) wipeDir(dst);
|
|
390
|
+
copyDir(src, dst, { useSymlinks });
|
|
391
|
+
copilotSkillCount += countFiles(src);
|
|
392
|
+
}
|
|
393
|
+
// Stale prune: a skill delivered by a previous, wider stack selection must
|
|
394
|
+
// leave when the selection narrows, or the old stack lingers forever. Scope:
|
|
395
|
+
// only dirs the previous manifest names (delivered by us), or - on a
|
|
396
|
+
// pre-manifest install - dirs byte-identical to the shipped catalog. A
|
|
397
|
+
// user-authored dir that happens to share a catalog name matches neither
|
|
398
|
+
// and is never touched.
|
|
399
|
+
let keptForeign = 0;
|
|
400
|
+
for (const name of skipped) {
|
|
401
|
+
const stale = join(dest, name);
|
|
402
|
+
if (!existsSync(stale) || isDryRun()) continue;
|
|
403
|
+
let ours;
|
|
404
|
+
if (prevDelivered) {
|
|
405
|
+
ours = prevDelivered.has(name);
|
|
406
|
+
} else {
|
|
407
|
+
try {
|
|
408
|
+
ours = dirsIdentical(join(sharedExternalSrc, name), stale);
|
|
409
|
+
} catch {
|
|
410
|
+
ours = false;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
if (!ours) {
|
|
414
|
+
keptForeign++;
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
try {
|
|
418
|
+
rmSync(stale, { recursive: true, force: true });
|
|
419
|
+
} catch {
|
|
420
|
+
/* non-fatal */
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
writeExternalSkillsManifest(dest, keep);
|
|
424
|
+
console.log(` -> stack filter (${selectionSource}): ${keep.length} kept, ${skipped.length} skipped`);
|
|
425
|
+
if (keptForeign > 0) {
|
|
366
426
|
console.log(
|
|
367
|
-
`
|
|
427
|
+
` note: ${keptForeign} skipped-stack dir(s) kept - not delivered by this pipeline (no manifest entry, differs from catalog)`,
|
|
368
428
|
);
|
|
369
429
|
}
|
|
370
430
|
}
|
package/install/index.mjs
CHANGED
|
@@ -45,7 +45,7 @@ export async function runInstall(argv) {
|
|
|
45
45
|
// `multi-agent-pipeline install --all` (via bin, argv[2]="install")
|
|
46
46
|
const flags = argv.slice(2).filter((a) => a !== "install");
|
|
47
47
|
|
|
48
|
-
const KNOWN_FLAGS = [...TOOL_FLAGS, "--all", "--link", "--index-only", "--dry-run"];
|
|
48
|
+
const KNOWN_FLAGS = [...TOOL_FLAGS, "--all", "--link", "--index-only", "--dry-run", "--prune-external"];
|
|
49
49
|
const KNOWN_PREFIXES = ["--target=", "--platform="];
|
|
50
50
|
const unknown = flags.filter(
|
|
51
51
|
(f) =>
|
|
@@ -74,6 +74,7 @@ export async function runInstall(argv) {
|
|
|
74
74
|
|
|
75
75
|
const useSymlinks = flags.includes("--link");
|
|
76
76
|
const indexOnly = flags.includes("--index-only");
|
|
77
|
+
const pruneExternal = flags.includes("--prune-external");
|
|
77
78
|
const platformFlag = parsePlatformFlag(flags);
|
|
78
79
|
|
|
79
80
|
const installerCtx = {
|
|
@@ -82,6 +83,7 @@ export async function runInstall(argv) {
|
|
|
82
83
|
indexOnly,
|
|
83
84
|
useSymlinks,
|
|
84
85
|
platformFlag,
|
|
86
|
+
pruneExternal,
|
|
85
87
|
};
|
|
86
88
|
|
|
87
89
|
console.log("");
|
|
@@ -187,7 +189,9 @@ function printSummary(opts) {
|
|
|
187
189
|
// hand-registered entry became the only reason it worked on any given machine.
|
|
188
190
|
console.log(" For UI testing, the dev-toolkit MCP server is registered automatically:");
|
|
189
191
|
if (forClaude) {
|
|
190
|
-
console.log(
|
|
192
|
+
console.log(
|
|
193
|
+
" Claude Code: claude mcp add --scope user dev-toolkit (user scope, all projects)",
|
|
194
|
+
);
|
|
191
195
|
}
|
|
192
196
|
if (forCopilot) {
|
|
193
197
|
console.log(" Copilot CLI: copilot mcp add dev-toolkit");
|
|
@@ -195,7 +199,9 @@ function printSummary(opts) {
|
|
|
195
199
|
if (forCodex) {
|
|
196
200
|
console.log(" Codex CLI: codex mcp add dev-toolkit");
|
|
197
201
|
}
|
|
198
|
-
console.log(
|
|
202
|
+
console.log(
|
|
203
|
+
" Skipped only when the host CLI is not on PATH - the command to run is printed above.",
|
|
204
|
+
);
|
|
199
205
|
console.log("");
|
|
200
206
|
console.log(" Uninstall everything: npx @mmerterden/multi-agent-pipeline uninstall");
|
|
201
207
|
console.log(" (Personal access tokens in keychain are preserved.)");
|
|
@@ -62,7 +62,7 @@ failure this layout exists to prevent.
|
|
|
62
62
|
|
|
63
63
|
Codex assembles every discovered skill's name + description into one prompt block
|
|
64
64
|
and **silently drops entries when that block overflows**. The pipeline therefore
|
|
65
|
-
contributes exactly **one** skill (`multi-agent`) and keeps
|
|
65
|
+
contributes exactly **one** skill (`multi-agent`) and keeps every sub-command
|
|
66
66
|
specs as reference files that cost nothing until read. Do not convert those specs
|
|
67
67
|
into peer skills: doing so evicts other skills, including ones from installed
|
|
68
68
|
plugins, with no error surfaced.
|
|
@@ -245,7 +245,7 @@ Cost block reads `phase-tracker.sh tokens` accumulators × `cost-table.json` pri
|
|
|
245
245
|
|
|
246
246
|
## Stack Selection
|
|
247
247
|
|
|
248
|
-
Stack skill sets ship as versioned plugins in the `multi-agent-plugins` marketplace. Selecting a stack enables the matching plugin(s) in the target repo's `.claude/settings.json` `enabledPlugins`; the `ai-common-
|
|
248
|
+
Stack skill sets ship as versioned plugins in the `multi-agent-plugins` marketplace. Selecting a stack enables the matching plugin(s) in the target repo's `.claude/settings.json` `enabledPlugins`; the `ai-common-toolkit` is always enabled alongside. There is no session-start auto-swap script. Select or change the stack with:
|
|
249
249
|
|
|
250
250
|
```bash
|
|
251
251
|
multi-agent-stack [ios|android|mobile|backend|frontend|fullstack|all]
|
|
@@ -302,8 +302,8 @@ if [ "$(jq '.projects | length' "$STATE_FILE")" -ge 2 ]; then
|
|
|
302
302
|
fi
|
|
303
303
|
```
|
|
304
304
|
|
|
305
|
-
Full contract:
|
|
306
|
-
(
|
|
305
|
+
Full contract: https://github.com/mmerterden/multi-agent-pipeline/blob/main/pipeline/multi-agent-refs/multi-repo-integration-build.md
|
|
306
|
+
(the Copilot install ships no local refs tree, so the contract lives on GitHub only)
|
|
307
307
|
|
|
308
308
|
## Permissions Expectation
|
|
309
309
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "15.1.0",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -68,11 +68,11 @@
|
|
|
68
68
|
"install.js",
|
|
69
69
|
"install/**/*",
|
|
70
70
|
"pipeline/**/*",
|
|
71
|
-
"pipeline/scripts/**/*",
|
|
72
71
|
"docs/**/*",
|
|
73
72
|
"README.md",
|
|
74
73
|
"CHANGELOG.md",
|
|
75
74
|
"LICENSE",
|
|
75
|
+
"SECURITY.md",
|
|
76
76
|
"!pipeline/scripts/smoke-figma-config-schema.sh",
|
|
77
77
|
"!pipeline/scripts/smoke-personal-data.sh",
|
|
78
78
|
"!pipeline/scripts/validate-prefs.mjs",
|
|
@@ -89,7 +89,6 @@
|
|
|
89
89
|
"!pipeline/scripts/sync-parity-check.sh",
|
|
90
90
|
"!pipeline/scripts/benchmark-phase-0.sh",
|
|
91
91
|
"!pipeline/scripts/fixtures/**",
|
|
92
|
-
"!pipeline/scripts/test-gap-rules/**",
|
|
93
92
|
"!pipeline/eval/**",
|
|
94
93
|
"pipeline/scripts/smoke-schema-validation.sh",
|
|
95
94
|
"pipeline/scripts/smoke-cross-cli-behavior.sh"
|
|
@@ -78,6 +78,7 @@ Lib scripts (`~/.claude/lib/`):
|
|
|
78
78
|
| `review-jira [KEY\|url]` | Grade a Jira issue's readiness for the pipeline (scope / AC / repro / design / API / stack), then post the gaps as a Jira comment. Read-only on code. |
|
|
79
79
|
| `review-issue [#N\|repo#N\|url]` | Grade a GitHub issue's readiness for the pipeline, then post the gaps as an issue comment. Read-only on code. |
|
|
80
80
|
| `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. |
|
|
81
|
+
| `complaint-analysis ["<run-name>"] [--file <path>] [<jira-id\|confluence-url> ...]` | Müşteri şikayeti triyajı: şikayetler (serbest metin / csv-xlsx-txt-json dosya / Jira issue / Confluence URL) redakte edilerek alınır, trxId/conversationId ile Graylog kanıtı çekilir, seçili client + BFF repolarında salt-okunur eşleştirme yapılır; verdict: client/bff (kök neden + citation + mevcut mimariyi referans alan fix planı + hazır dev prompt'u) veya core (core ekibine yönlendirme önerisi) veya insufficient-evidence. Rapor + Stop; worktree, commit, dev zinciri yok. |
|
|
81
82
|
| `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. |
|
|
82
83
|
| `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. |
|
|
83
84
|
| `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. |
|
|
@@ -120,6 +121,7 @@ This command uses lazy loading for token efficiency. Read the relevant sub-file
|
|
|
120
121
|
| `review-jira` | `$HOME/.claude/commands/multi-agent/review-jira/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/readiness-review.md`) |
|
|
121
122
|
| `review-issue` | `$HOME/.claude/commands/multi-agent/review-issue/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/readiness-review.md`) |
|
|
122
123
|
| `analysis` | `$HOME/.claude/commands/multi-agent/analysis/SKILL.md` |
|
|
124
|
+
| `complaint-analysis` | `$HOME/.claude/commands/multi-agent/complaint-analysis/SKILL.md` |
|
|
123
125
|
| `build-optimize` | `$HOME/.claude/commands/multi-agent/build-optimize/SKILL.md` |
|
|
124
126
|
| `local` | `$HOME/.claude/commands/multi-agent/local/SKILL.md` |
|
|
125
127
|
| `local-autopilot` | `$HOME/.claude/commands/multi-agent/local-autopilot/SKILL.md` |
|
|
@@ -505,9 +505,9 @@ For each `platform` in `state.analysisSpec.platforms[]`:
|
|
|
505
505
|
|
|
506
506
|
2. **Per-platform markdown render**: for each platform in `state.analysisSpec.platforms[]`, concatenate the per-platform spec into one markdown file. Tables in pipe-syntax. Numbering uses plain `## 1.`, `## 2.`, ... - omitted sections do **not** create gaps. Visible numbering is sequential 1..N over the rendered set.
|
|
507
507
|
|
|
508
|
-
3. **Humanizer pass (MANDATORY: actually invoke the `humanizer` skill on the rendered markdown - the punctuation grep alone does NOT satisfy this step)** (`technical-explanatory` tone for the scratch buffer; per-channel re-humanize happens in Phase 4 when actually emitting):
|
|
508
|
+
3. **Humanizer pass (MANDATORY: actually invoke the `ai-common-toolkit:humanizer` skill on the rendered markdown - the punctuation grep alone does NOT satisfy this step)** (`technical-explanatory` tone for the scratch buffer; per-channel re-humanize happens in Phase 4 when actually emitting):
|
|
509
509
|
```
|
|
510
|
-
humanizer skill input:
|
|
510
|
+
ai-common-toolkit:humanizer skill input:
|
|
511
511
|
language: <tr|en>
|
|
512
512
|
tone: technical-explanatory
|
|
513
513
|
stripFancyPunctuation: true
|
|
@@ -662,7 +662,7 @@ When `phase == "cancelled_at_pass_b_preview"`:
|
|
|
662
662
|
| `~/.claude/lib/extract-conventions.sh` | Phase 1c convention extractor (7 pattern groups, JSON output, confidence levels) |
|
|
663
663
|
| `~/.claude/lib/figma-screenshot.sh` | Phase 2b Tier 2 Figma image downloader (REST API, section drill, 2x scale PNG, manifest.json) |
|
|
664
664
|
| `~/.claude/lib/md2confluence-v3.py` | Phase 4 Confluence dispatch (multipart attachments, `<ac:image>` injection, mermaid macro + fallback, tooltip footnote macro, punctuation gate) |
|
|
665
|
-
|
|
|
665
|
+
| `ai-common-toolkit:humanizer` | Phase 3 tone pass |
|
|
666
666
|
| 8-locale set (ar, de, en, es, fr, it, ru, tr) + localization-key naming (inline) | Section 10 localization generation |
|
|
667
667
|
| `$HOME/.claude/multi-agent-refs/channels/confluence.md` | Phase 4 Confluence dispatch |
|
|
668
668
|
| `$HOME/.claude/multi-agent-refs/channels/jira.md` | Phase 4 Jira dispatch |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Resolve the Section 20 Risks and Open Questions of an analysis v3 document one row at a time
|
|
2
|
+
description: "Resolve the Section 20 Risks and Open Questions of an analysis v3 document one row at a time: up to 3 source-labeled answer candidates per row (evidence / repo / AI reasoned), chosen answer merged into the target section, doc updated in place with a changelog bump. Same locked decisions as /multi-agent:analysis. Use when an analysis document's open questions need answering before development starts."
|
|
3
3
|
description-tr: "Analiz v3 dokümanının Bölüm 20 Riskler ve Açık Sorular satırlarını tek tek çözer. Satır başına en fazla 3 kaynak-etiketli cevap adayı önerir (kanıttan / repodan / AI çıkarımı), seçilen cevabı ilgili gövde bölümüne işler ve dokümanı Bölüm 23 changelog artışıyla yerinde günceller. /multi-agent:analysis'in eşlikçisi - aynı Kilitli kararlar geçerli (alıntı disiplini, humanizer noktalama, MCP yok, otomatik commit yok). Platform bazlı dosya setleri için isteğe bağlı kardeş yayılımı."
|
|
4
4
|
argument-hint: "[path/to/analysis/<feature>-<platform>.md] [--autonomous]"
|
|
5
5
|
---
|
|
@@ -121,7 +121,7 @@ For each open row in source order:
|
|
|
121
121
|
| `$HOME/.claude/multi-agent-refs/analysis-template.md` | Section 20 / Section 23 table contracts, front-matter shape, omission re-flow |
|
|
122
122
|
| `$HOME/.claude/multi-agent-refs/conventions-defaults.md` | `convention-fallback` default values per platform |
|
|
123
123
|
| `~/.claude/lib/extract-conventions.sh` | fresh single-field extraction for convention-fallback candidates |
|
|
124
|
-
|
|
|
124
|
+
| `ai-common-toolkit:humanizer` | tone reference for longer merged fragments (short fragments only need the punctuation gate) |
|
|
125
125
|
|
|
126
126
|
## Notes
|
|
127
127
|
|
|
@@ -40,7 +40,7 @@ Before dispatch, fail fast on non-iOS repos. Detect iOS context via the standard
|
|
|
40
40
|
|
|
41
41
|
3. **Dispatch** to `xcode-build-orchestrator` via the Skill tool:
|
|
42
42
|
```
|
|
43
|
-
Skill(skill="xcode-build-orchestrator", args="")
|
|
43
|
+
Skill(skill="ai-ios-toolkit:xcode-build-orchestrator", args="")
|
|
44
44
|
```
|
|
45
45
|
The orchestrator's Phase 1 (Analyze) runs `xcode-build-benchmark`, the three specialist analyzers, and writes `.build-benchmark/optimization-plan.md`. No project files are modified during Phase 1.
|
|
46
46
|
|
|
@@ -48,7 +48,7 @@ Before dispatch, fail fast on non-iOS repos. Detect iOS context via the standard
|
|
|
48
48
|
|
|
49
49
|
5. **Phase 2 (apply + verify)** is initiated by the user. The wrapper does not auto-execute Phase 2 because the upstream contract requires explicit approval via the checkboxes in the plan file. When the user signals "implement the approved items", the wrapper dispatches to `xcode-build-fixer`:
|
|
50
50
|
```
|
|
51
|
-
Skill(skill="xcode-build-fixer", args="")
|
|
51
|
+
Skill(skill="ai-ios-toolkit:xcode-build-fixer", args="")
|
|
52
52
|
```
|
|
53
53
|
The fixer applies only the approved changes and re-benchmarks for wall-clock delta verification.
|
|
54
54
|
|
|
@@ -62,13 +62,13 @@ Before dispatch, fail fast on non-iOS repos. Detect iOS context via the standard
|
|
|
62
62
|
|
|
63
63
|
| Path | Reason |
|
|
64
64
|
|------|--------|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
|
|
|
70
|
-
|
|
|
71
|
-
|
|
|
65
|
+
| `ai-ios-toolkit:xcode-build-orchestrator` | The orchestrator this wrapper dispatches to |
|
|
66
|
+
| `ai-ios-toolkit:xcode-build-benchmark` | Baseline timing |
|
|
67
|
+
| `ai-ios-toolkit:xcode-compilation-analyzer` | Swift compile hotspots |
|
|
68
|
+
| `ai-ios-toolkit:xcode-project-analyzer` | Build settings / script phases / parallelism |
|
|
69
|
+
| `ai-ios-toolkit:spm-build-analysis` | SPM graph + plugins |
|
|
70
|
+
| `ai-ios-toolkit:xcode-build-fixer` | Apply approved fixes + re-benchmark |
|
|
71
|
+
| ai-ios-toolkit plugin NOTICE (xcode build skills) | MIT attribution + upstream pin |
|
|
72
72
|
|
|
73
73
|
## Notes
|
|
74
74
|
|
|
@@ -401,7 +401,7 @@ Full contract: [`$HOME/.claude/multi-agent-refs/channels/confluence.md`]($HOME/.
|
|
|
401
401
|
|
|
402
402
|
**Wiki → Jira comment auto-link** (triad contract, preserved from v5.6): when the Wiki adapter writes pages AND `state.jiraId` is set AND `prefs.global.wikiToJiraComment === true`, also post a humanizer-passed summary of the wiki pages (component name + variant count + wiki URL) as an additional Jira comment on the same issue. Independent of the main Jira channel's comment - both can coexist. Full contract in `$HOME/.claude/multi-agent-refs/issue-jira-triad.md`.
|
|
403
403
|
|
|
404
|
-
**If preconditions met (Case A):** scope multi-select prompt (Main page / iOS sub-page / Screenshots / Index updates / Other); adapter dispatched to the plugin skill `ai-ios-
|
|
404
|
+
**If preconditions met (Case A):** scope multi-select prompt (Main page / iOS sub-page / Screenshots / Index updates / Other); adapter dispatched to the plugin skill `ai-ios-toolkit:figma-component-wiki` (or `ai-android-toolkit:figma-component-wiki`).
|
|
405
405
|
|
|
406
406
|
Full contract: [`$HOME/.claude/multi-agent-refs/channels/wiki.md`]($HOME/.claude/multi-agent-refs/channels/wiki.md) - all four `figma-config.wiki.mode` adapters (submodule / in-repo / github-wiki / separate-repo), full Case A scope menu, screenshot quadrant gate.
|
|
407
407
|
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Customer-complaint triage. Ingests complaints (paste, csv/xlsx/txt/json file, Jira issue, Confluence URL), fetches Graylog evidence per trx/conversation id, correlates read-only against the selected client + BFF repos; per complaint: client/bff root cause + fix plan + dev prompt, or core routing recommendation, or insufficient-evidence. Report only, no dev chaining. Use when customer-reported errors need layer triage."
|
|
3
|
+
description-tr: "Müşteri şikayeti / müşteri kaynaklı hata triyajı. Şikayetleri alır (serbest metin, csv/xlsx/txt/json dosya, Jira issue, Confluence URL), trxId/conversationId ile Graylog kanıtı çeker, seçilen client + BFF repolarıyla salt-okunur eşleştirir ve her şikayeti sınıflandırır: client / bff (bizim sorumluluğumuz, kök neden analizi) veya core (core ekibine yönlendirme önerisi) veya insufficient-evidence. Rapor üretip durur - branch, worktree, commit, PR veya dev zinciri yok."
|
|
4
|
+
argument-hint: "[\"<run-name>\"] [--file <path>] [<jira-id | jira-url | confluence-url> ...]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# multi-agent complaint-analysis - Customer Complaint Triage
|
|
8
|
+
|
|
9
|
+
**Input**: $ARGUMENTS (optional run name, optional `--file <path>`, optional Jira ids / Jira URLs / Confluence URLs; remaining free text is treated as pasted complaints)
|
|
10
|
+
|
|
11
|
+
Triage of customer-reported errors across the layers the team owns (client apps + BFFs). Per complaint: Graylog log evidence by trx/conversation id, read-only repo correlation, and a verdict. **Core failures get a routing recommendation, never a fix analysis.**
|
|
12
|
+
|
|
13
|
+
**Side-effect contract**: may write a local markdown report, post a Confluence page, or add a Jira comment/description - but **never** creates branches, worktrees, commits, or PRs. Stops at the report.
|
|
14
|
+
|
|
15
|
+
> **Language**: Per `$HOME/.claude/multi-agent-refs/rules.md` Language Application matrix - instruction prose stays English. `AskUserQuestion.label` and `header` stay English. `question` and `description` follow `outputLanguage`. The report body follows `outputLanguage`; Graylog excerpts, verdict tokens, and external payload metadata stay English.
|
|
16
|
+
|
|
17
|
+
## Locked decisions (do not re-ask)
|
|
18
|
+
|
|
19
|
+
1. **Graylog is primary evidence (deliberate departure).** `features/external-context-injection.md` declares Graylog advisory-only for the dev pipeline; in THIS command Graylog IS the evidence backbone. A per-complaint fetch failure still never halts the run, but that complaint's verdict is capped at `insufficient-evidence` - never fabricated.
|
|
20
|
+
2. **Ids are never guessed.** A complaint with no trxId and no convId enters the Phase 0 Step 5 confirmation loop: the user supplies the id(s) or explicitly marks the complaint `skip-graylog`. Empty submit is not consent (`feedback_no-inferred-defaults-from-empty-answer`); re-ask.
|
|
21
|
+
3. **Read-only ops command.** No worktree, branch, commit, PR, or dev chaining. Report + Stop.
|
|
22
|
+
4. **Redaction before any output.** Complaint text is redacted at intake (`parse-complaints.sh`, default on). Jira / Confluence-sourced complaint text passes through the same redaction (`--stdin` mode) after fetch. Raw PII never enters state, drafts, or any dispatch target.
|
|
23
|
+
5. **Core is a residual classification, not a repo.** Verdict `core` produces a routing recommendation only - no fix analysis, no core-repo grepping, no core code speculation.
|
|
24
|
+
6. **Layer mapping is user-confirmed.** Name-based layer inference (Step 3b) is a proposal; the confirmation table must be approved before Phase 1.
|
|
25
|
+
7. **Output default = Local file.** The Phase 4.5 picker keeps `Local file` pre-selected; Confluence and Jira are never default-selected.
|
|
26
|
+
8. **Humanizer punctuation policy is non-negotiable.** No em-dash, en-dash, ellipsis, curly quotes, or section sign in any emitted text. Turkish diacritics are preserved verbatim - never ASCII-fold the prose.
|
|
27
|
+
9. **Language split.** Report body follows `outputLanguage`; verdict tokens (`client:ios`, `bff:mobile-bff`, `core`, `insufficient-evidence`), Graylog evidence excerpts, and Confluence/Jira payload metadata stay English.
|
|
28
|
+
10. **Verdict citation discipline.** Every `client`/`bff` verdict cites at least one Graylog message (timestamp + source) AND one repo evidence row (`file:line`). Anything less is `insufficient-evidence`. Every `core` verdict cites the Graylog message that names the upstream service.
|
|
29
|
+
11. **One complaint batch per run.** Mixed batches spanning unrelated products are user error: surface it and ask to split.
|
|
30
|
+
12. **No auto-commit.** The local report is written to the working tree; the user commits it themselves if they want.
|
|
31
|
+
13. **Client/bff verdicts carry a development handoff.** Every `client`/`bff` verdict renders a fix plan grounded in the EXISTING architecture (the `repoEvidence[]` files are the reference: name the concrete files/components to touch, reuse-first, no invented structures) plus a ready-to-run dev prompt (English, one fenced block, `/multi-agent:dev`-compatible). The handoff is part of the report - this command still never runs dev itself (Locked 3). Core and insufficient-evidence verdicts never get a fix plan (Locked 5).
|
|
32
|
+
|
|
33
|
+
## Steps
|
|
34
|
+
|
|
35
|
+
### Phase 0 - Intake
|
|
36
|
+
|
|
37
|
+
Sequential `AskUserQuestion` chain, answers land under `state.complaintSpec.*` (schema: `$HOME/.claude/schemas/complaint-analysis-spec.schema.json`). Step narration per `$HOME/.claude/multi-agent-refs/picker-contract.md`: print `<localized: "Step <i>/<n>: <what this step decides>">` before each picker; auto-resolved steps still print their breadcrumb.
|
|
38
|
+
|
|
39
|
+
#### Step 0 - Language resolution (BLOCKING)
|
|
40
|
+
|
|
41
|
+
Read `prefs.global.outputLanguage` (`tr` or `en`, default `tr`) before the first picker. Every `<localized: "...">` marker in this file is rendered in that language, never emitted literally.
|
|
42
|
+
|
|
43
|
+
#### Step 1 - Run name
|
|
44
|
+
|
|
45
|
+
From `$ARGUMENTS` quoted string if present, else default `complaints-<YYYYMMDD>` (announce, do not ask). Result: `state.complaintSpec.runName`.
|
|
46
|
+
|
|
47
|
+
#### Step 2 - Account picker
|
|
48
|
+
|
|
49
|
+
Reuse `$HOME/.claude/multi-agent-refs/_account-picker.md`. Needed for Graylog-adjacent Jira/Confluence fetches and dispatch; skipped only when the run is fully local (no Jira/Confluence input, local output only) - then `account: null`.
|
|
50
|
+
|
|
51
|
+
#### Step 3 - Repo multi-select
|
|
52
|
+
|
|
53
|
+
Reuse `$HOME/.claude/multi-agent-refs/_repo-picker.md` (multi-select via `~/.claude/lib/repo-cache.sh`). Guidance line in the question: <localized: "Select the client and BFF repos your team owns (e.g. ios / android / web / mobile-bff / web-bff). Core services are NOT selected - core is a triage outcome, not a repo.">
|
|
54
|
+
|
|
55
|
+
#### Step 3b - Layer tagging (single confirmation table)
|
|
56
|
+
|
|
57
|
+
Infer a layer per selected repo from its name (`ios|iphone` -> ios, `android` -> android, `web(?!.*bff)` -> web, `mobile.?bff|bff.?mobile` -> mobile-bff, `web.?bff|bff.?web` -> web-bff, else other). Present ONE AskUserQuestion with the full `repo -> layer` table in the question body: options `Approve mapping` / `Override rows`. On override, one follow-up per rejected row with the 6 layer options. Result: `state.complaintSpec.repos[] = {name, layer, localPath?, provider?}` (Locked 6).
|
|
58
|
+
|
|
59
|
+
#### Step 4 - Complaint input (multi-source)
|
|
60
|
+
|
|
61
|
+
Classify every `$ARGUMENTS` remainder and any pasted input via `~/.claude/lib/context-link-extractor.sh`, then collect per source type. If nothing was supplied, ask: <localized: "Paste the complaints, or give a file path (csv / xlsx / txt / json), a Jira issue, or a Confluence URL. Mixed input is fine.">
|
|
62
|
+
|
|
63
|
+
| Source | Ingestion |
|
|
64
|
+
|---|---|
|
|
65
|
+
| File path (`--file` or detected) | `~/.claude/lib/parse-complaints.sh --file <path>` (format auto-detected; exit 5 = xlsx degrade -> surface `degradeReason`, ask for a CSV export path, re-run) |
|
|
66
|
+
| Pasted free text | `parse-complaints.sh --stdin` (splits blocks, pre-fills ids via the shared label set) |
|
|
67
|
+
| Jira id / URL | Fetch issue summary + description + comments via Jira REST (account token); concatenate as text blocks, pipe through `parse-complaints.sh --stdin` (Locked 4) |
|
|
68
|
+
| Confluence URL | `~/.claude/lib/fetch-confluence.sh <url>`; page body paragraphs/table rows become text blocks, piped through `parse-complaints.sh --stdin` |
|
|
69
|
+
|
|
70
|
+
Merge all outputs into one list, re-numbering ids `C-01..C-NN`. Result: `state.complaintSpec.input` + `state.complaintSpec.complaints[]`.
|
|
71
|
+
|
|
72
|
+
#### Step 5 - Id confirmation loop (Locked 2)
|
|
73
|
+
|
|
74
|
+
Render the parsed table (id, redacted excerpt <= 80 chars, trxId, convId, platformHint) to the user. For every complaint missing BOTH ids, one AskUserQuestion: <localized: "Complaint <id> has no trx/conversation id. Supply one, or skip Graylog for it?"> with options `Skip Graylog for this complaint` (-> `skipGraylog: true`) and Other for the id (`trx:<value>` / `conv:<value>`). Empty submit re-asks. Set `phase: "fetching_graylog"`.
|
|
75
|
+
|
|
76
|
+
### Phase 1 - Graylog evidence fan-out
|
|
77
|
+
|
|
78
|
+
For each complaint with at least one id and `skipGraylog: false`:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
~/.claude/lib/fetch-graylog.sh --trx <trxId> --conv <convId> # pass whichever exist
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Record per complaint: `graylog: {status: ok|degraded|skipped, totalResults, degradeReason}` plus the top messages (timestamp, source, level, message excerpt) kept in working context for Phase 2/3. Failure handling:
|
|
85
|
+
|
|
86
|
+
- Exit 0 with `degraded: true` -> `status: degraded`, keep the reason, continue.
|
|
87
|
+
- Exit 2 / 3 / 6 (credential / auth / host) -> per `$HOME/.claude/multi-agent-refs/keychain.md` non-critical rule: warn ONCE (`WARN: Graylog unavailable (<reason>); remaining complaints proceed without log evidence.`), mark this and all remaining fetches `status: degraded`, continue. Never halt (Locked 1).
|
|
88
|
+
- `skipGraylog: true` -> `status: skipped`.
|
|
89
|
+
|
|
90
|
+
Set `phase: "correlating_repos"`.
|
|
91
|
+
|
|
92
|
+
### Phase 2 - Repo evidence correlation (read-only)
|
|
93
|
+
|
|
94
|
+
From each complaint's Graylog messages extract candidate signals: endpoint paths, error codes, exception class names, distinctive message templates, and the `source` service name. Then grep the selected repos (skip dirs: `.build`, `DerivedData`, `Pods`, `node_modules`, `.next`, `build/`, `.gradle`, `vendor/`):
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
grep -rn --include='*.swift' --include='*.kt' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.java' -E "<signal>" "$REPO_PATH"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Bucket hits per complaint as `repoEvidence[] = {repo, layer, file, line, signal, matchKind: direct|partial}` (`direct` = exact endpoint/error-code/template match; `partial` = fuzzy/name-only). Grep only - no convention extraction, no Figma, no Swagger. Complaints with `status: degraded|skipped` still get a text-similarity pass (grep the complaint's distinctive nouns/error phrases), tagged `partial`. Set `phase: "triaging"`.
|
|
101
|
+
|
|
102
|
+
### Phase 3 - Triage classification
|
|
103
|
+
|
|
104
|
+
Per complaint, in order:
|
|
105
|
+
|
|
106
|
+
| Condition | Verdict |
|
|
107
|
+
|---|---|
|
|
108
|
+
| Graylog error originates in an owned layer: signal matched `direct` in a selected repo, OR the failing `source` maps to an owned BFF | `client:<ios|android|web>` or `bff:<mobile-bff|web-bff>` + root-cause rationale + citations (Locked 10) |
|
|
109
|
+
| Graylog shows the failure downstream of owned layers: `source` is an unowned core service, 5xx from an upstream nobody selected owns, no repo match | `core` + routing recommendation (below) |
|
|
110
|
+
| No/degraded Graylog AND no direct repo signal | `insufficient-evidence` + open question row |
|
|
111
|
+
|
|
112
|
+
**Routing recommendation** (core only, Locked 5): `{suspectedService: <Graylog source>, endpoint, errorCode, evidenceExcerpt (EN, redacted), suggestedQueue: prefs.projects[<project>].routing.coreTeamLabel ?? null, confidence}`.
|
|
113
|
+
|
|
114
|
+
Verdict shape: `verdict: {category, layer, confidence: high|medium|low, rationale}`. Ambiguous client-vs-bff attribution lowers `confidence`, never invents evidence.
|
|
115
|
+
|
|
116
|
+
**Development handoff (client/bff only, Locked 13)**: for each `client`/`bff` verdict, derive from the `repoEvidence[]` rows:
|
|
117
|
+
|
|
118
|
+
- **Fix plan**: 2-5 numbered steps referencing the existing architecture by `file:line` - which service/view/handler to change, what to reuse (reuse-first: prefer extending the cited components over adding new ones), which tests to add. No speculative rewrites.
|
|
119
|
+
- **Dev prompt**: one fenced English block the user can paste into `/multi-agent:dev` (or a Jira description): complaint summary, root cause, the cited files, the fix plan steps, and the acceptance check. Include the complaint id (`[C-NN]`) for traceability.
|
|
120
|
+
|
|
121
|
+
Set `phase: "drafting"`.
|
|
122
|
+
|
|
123
|
+
### Phase 4 - Draft, humanize, buffer
|
|
124
|
+
|
|
125
|
+
1. Render the report per `$HOME/.claude/multi-agent-refs/complaint-analysis-template.md` (8 fixed sections; single-language body in `outputLanguage`; verdict tokens English per Locked 9) to `/tmp/complaint-analysis-<run-slug>-<UTC-iso8601>/report.md`. Store `outputs.draftDir`.
|
|
126
|
+
2. **Humanizer pass (MANDATORY: actually invoke the `ai-common-toolkit:humanizer` skill; the punctuation grep alone does NOT satisfy this)** with `language: <tr|en>`, `tone: technical-explanatory`, `stripFancyPunctuation: true`. Diacritics preserved (Locked 8).
|
|
127
|
+
3. Punctuation gate: `grep -P '[\x{2013}\x{2014}\x{2026}\x{201C}\x{201D}\x{2018}\x{2019}\x{00A7}]'` over the draft returns zero matches.
|
|
128
|
+
4. Show the draft path + size to the user. Set `phase: "awaiting_output_decision"`.
|
|
129
|
+
|
|
130
|
+
### Phase 4.5 - Output destination picker
|
|
131
|
+
|
|
132
|
+
AskUserQuestion (multiSelect=true), `Local file` pre-selected (Locked 7):
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
header: "Output"
|
|
136
|
+
question: <localized: "Where should the triage report be written?">
|
|
137
|
+
options:
|
|
138
|
+
- label: "Local file" (description: complaints/<run-name>.md in the primary repo's working tree)
|
|
139
|
+
- label: "Confluence page"
|
|
140
|
+
- label: "Jira"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Follow-ups: Confluence -> ask parent page (Other, LRU recents from `prefs.projects[<project>].confluenceUrls`); Jira -> pick from Step 4 Jira ids if any, else ask via Other. Result: `outputs.destinations[]`. Set `phase: "dispatching"`.
|
|
144
|
+
|
|
145
|
+
### Phase 5 - Validate, dispatch, report. Stop.
|
|
146
|
+
|
|
147
|
+
**Pre-dispatch gate (BLOCKING)**: `node $HOME/.claude/scripts/validate-complaint-doc.mjs <draft>` - front-matter, required sections, verdict tokens per triage row, routing entry per core verdict, punctuation, redaction-leak scan. Any ERROR blocks dispatch: fix the draft, re-validate.
|
|
148
|
+
|
|
149
|
+
| Target | Action |
|
|
150
|
+
|---|---|
|
|
151
|
+
| Local | `cp` the draft to `complaints/<run-name>.md` in the primary repo's working tree. **No commit** (Locked 12). |
|
|
152
|
+
| Confluence | Re-humanize with `formal-stakeholder` tone; post one page under the chosen parent via `$HOME/.claude/multi-agent-refs/channels/confluence.md` + `~/.claude/lib/md2confluence-v3.py`. |
|
|
153
|
+
| Jira | Re-humanize with `informal-technical` tone; markdown -> wiki markup per `$HOME/.claude/multi-agent-refs/channels/jira.md`; post as a comment on the chosen issue (never close/transition the issue). |
|
|
154
|
+
|
|
155
|
+
Then print the summary in `outputLanguage`: complaint count, verdict counts (`X client / Y bff / Z core / W insufficient-evidence`), degraded services, output paths/URLs. When any `core` verdict exists, add: <localized: "N complaint(s) route to the core team - see the routing section before forwarding.">
|
|
156
|
+
|
|
157
|
+
**Stop. Do not chain into `/multi-agent:dev`. Do not open a worktree. Do not create a branch.** Set `phase: "done"`.
|
|
158
|
+
|
|
159
|
+
### Resume contract
|
|
160
|
+
|
|
161
|
+
`state.complaintSpec.phase`: `intake | fetching_graylog | correlating_repos | triaging | drafting | awaiting_output_decision | dispatching | reporting | done`.
|
|
162
|
+
|
|
163
|
+
`/multi-agent:resume` at `awaiting_output_decision`: if `outputs.draftDir` still holds `report.md`, jump to Phase 4.5; if gone, re-render Phase 4 from state (evidence is retained). Earlier phases resume at their own boundary; Graylog results already in state are never re-fetched.
|
|
164
|
+
|
|
165
|
+
## Reusable refs
|
|
166
|
+
|
|
167
|
+
| Path | Reason |
|
|
168
|
+
|---|---|
|
|
169
|
+
| `~/.claude/lib/parse-complaints.sh` | Phase 0 Step 4 normalization + redaction (all formats + stdin) |
|
|
170
|
+
| `~/.claude/lib/context-link-extractor.sh` | Phase 0 Step 4 input classifier (jira / confluence / graylog id labels) |
|
|
171
|
+
| `~/.claude/lib/fetch-graylog.sh` | Phase 1 log evidence (`--trx` / `--conv`) |
|
|
172
|
+
| `~/.claude/lib/fetch-confluence.sh` | Phase 0 Step 4 Confluence-sourced complaints |
|
|
173
|
+
| `$HOME/.claude/multi-agent-refs/_account-picker.md`, `_repo-picker.md`, `picker-contract.md` | Phase 0 pickers |
|
|
174
|
+
| `$HOME/.claude/multi-agent-refs/keychain.md` | Phase 1 non-critical credential handling |
|
|
175
|
+
| `$HOME/.claude/multi-agent-refs/complaint-analysis-template.md` | Phase 4 report template (8 sections) |
|
|
176
|
+
| `ai-common-toolkit:humanizer` | Phase 4 tone pass |
|
|
177
|
+
| `$HOME/.claude/scripts/validate-complaint-doc.mjs` | Phase 5 pre-dispatch gate |
|
|
178
|
+
| `$HOME/.claude/multi-agent-refs/channels/confluence.md`, `channels/jira.md`, `~/.claude/lib/md2confluence-v3.py` | Phase 5 dispatch |
|
|
179
|
+
| `$HOME/.claude/schemas/complaint-analysis-spec.schema.json` | State contract |
|
|
180
|
+
|
|
181
|
+
## Notes
|
|
182
|
+
|
|
183
|
+
- Fully generic: hosts come from `prefs.global.hosts.*`, tokens from `prefs.global.keychainMapping.*`; no company name, host, or real repo name in this file.
|
|
184
|
+
- `prefs.projects[<project>].routing.coreTeamLabel` is optional; when unset, `suggestedQueue` renders as `-` and the routing entry still stands.
|
|
185
|
+
- If Confluence / Jira dispatch returns 401 / 403, surface the error and offer the Local fallback (the draft stays on disk).
|
|
186
|
+
- The `complaints/` directory is not gitignored; the user commits manually if desired.
|
|
@@ -217,7 +217,7 @@ That is the whole list. Phase 0 (Init full picker), Phase 4 (Review), Phase 5 (U
|
|
|
217
217
|
| Duration | ~10-15 min | ~7-10 min |
|
|
218
218
|
## Intake warnings (`--dev` family)
|
|
219
219
|
|
|
220
|
-
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:
|
|
220
|
+
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:resume-local`, not a second Dev pass). Read that section rather than reasoning about it from scratch.
|
|
221
221
|
|
|
222
222
|
## Required: outward-facing payload contracts
|
|
223
223
|
|
|
@@ -61,7 +61,7 @@ Phase 7: Report → short terminal summary
|
|
|
61
61
|
| Estimated duration | ~12 min | ~7 min | ~10 min | **~5 min** |
|
|
62
62
|
## Intake warnings (`--dev` family)
|
|
63
63
|
|
|
64
|
-
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:
|
|
64
|
+
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:resume-local`, not a second Dev pass). Read that section rather than reasoning about it from scratch.
|
|
65
65
|
|
|
66
66
|
## Required: outward-facing payload contracts
|
|
67
67
|
|
|
@@ -106,7 +106,7 @@ Routes to the orchestrator with `--dev --local` flags. Apply the `$HOME/.claude/
|
|
|
106
106
|
|
|
107
107
|
## Intake warnings (`--dev` family)
|
|
108
108
|
|
|
109
|
-
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:
|
|
109
|
+
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:resume-local`, not a second Dev pass). Read that section rather than reasoning about it from scratch.
|
|
110
110
|
|
|
111
111
|
## Required: outward-facing payload contracts
|
|
112
112
|
|
|
@@ -47,7 +47,7 @@ Routes to the orchestrator with `--dev --local autopilot` flags. The pipeline co
|
|
|
47
47
|
```
|
|
48
48
|
## Intake warnings (`--dev` family)
|
|
49
49
|
|
|
50
|
-
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:
|
|
50
|
+
Two checks belong at the top of every `--dev` run and are specified once in `$HOME/.claude/multi-agent-refs/phases/modes.md` "Intake warnings shared by the whole `--dev` family": an analysis document supplied to a mode that skips Analysis and Planning, and a branch that already carries the work (which wants `/multi-agent:resume-local`, not a second Dev pass). Read that section rather than reasoning about it from scratch.
|
|
51
51
|
|
|
52
52
|
## Required: outward-facing payload contracts
|
|
53
53
|
|
|
@@ -62,7 +62,7 @@ deletes nothing until you confirm.
|
|
|
62
62
|
residue in the index (`.worktrees/{id}` recorded as a "Subproject commit"
|
|
63
63
|
entry by a pre-guard `git add -A`), and a missing `.worktrees/` line in
|
|
64
64
|
`.git/info/exclude`. Registered, healthy worktrees are NEVER touched -
|
|
65
|
-
those belong to `/multi-agent:
|
|
65
|
+
those belong to `/multi-agent:resume-local` / `/multi-agent:kill`.
|
|
66
66
|
|
|
67
67
|
- Output says `nothing to do` -> skip silently, no question.
|
|
68
68
|
- Otherwise surface a second `AskUserQuestion` (in `outputLanguage`):
|