@mmerterden/multi-agent-pipeline 16.28.0 → 16.30.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +119 -2
  2. package/README.md +4 -4
  3. package/README.tr.md +3 -3
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/docs/features.md +14 -0
  7. package/install/claude.mjs +17 -0
  8. package/package.json +1 -1
  9. package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +93 -0
  10. package/pipeline/commands/multi-agent/design-check/SKILL.md +6 -5
  11. package/pipeline/commands/multi-agent/doctor/SKILL.md +78 -0
  12. package/pipeline/commands/multi-agent/help/SKILL.md +15 -12
  13. package/pipeline/commands/multi-agent/manual-test/SKILL.md +1 -1
  14. package/pipeline/commands/multi-agent/setup/SKILL.md +14 -1
  15. package/pipeline/commands/multi-agent/sync/SKILL.md +12 -9
  16. package/pipeline/commands/multi-agent/update/SKILL.md +12 -0
  17. package/pipeline/lib/_jira-auth.sh +99 -0
  18. package/pipeline/lib/analysis-jira-write.sh +203 -0
  19. package/pipeline/lib/issue-fetcher.sh +4 -4
  20. package/pipeline/multi-agent-refs/analysis/render.md +1 -1
  21. package/pipeline/multi-agent-refs/channels/pr.md +37 -1
  22. package/pipeline/multi-agent-refs/cross-cli-contract.md +3 -3
  23. package/pipeline/multi-agent-refs/features/analysis-jira.md +128 -0
  24. package/pipeline/multi-agent-refs/features/doctor.md +197 -0
  25. package/pipeline/multi-agent-refs/features/model-fallback.md +2 -2
  26. package/pipeline/multi-agent-refs/features/visual-evidence.md +103 -20
  27. package/pipeline/multi-agent-refs/phases/phase-0-init.md +38 -7
  28. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +13 -1
  29. package/pipeline/multi-agent-refs/phases/phase-5-test.md +11 -1
  30. package/pipeline/multi-agent-refs/phases/phase-6-commit.md +23 -0
  31. package/pipeline/multi-agent-refs/picker-contract.md +35 -0
  32. package/pipeline/multi-agent-refs/tracker-contract.md +5 -1
  33. package/pipeline/preferences-template.json +1 -1
  34. package/pipeline/schemas/agent-state.schema.json +84 -1
  35. package/pipeline/schemas/analysis-spec.schema.json +336 -95
  36. package/pipeline/schemas/prefs.schema.json +80 -3
  37. package/pipeline/schemas/token-budget.json +10 -10
  38. package/pipeline/scripts/analysis-story-tree.mjs +441 -0
  39. package/pipeline/scripts/capture-evidence.sh +170 -5
  40. package/pipeline/scripts/doctor.mjs +758 -0
  41. package/pipeline/scripts/evidence-gate.mjs +31 -2
  42. package/pipeline/scripts/phase-tracker.sh +97 -17
  43. package/pipeline/scripts/probe-evidence-capability.sh +250 -0
  44. package/pipeline/scripts/run-ui-tests.sh +380 -0
  45. package/pipeline/scripts/scan-agent-config.sh +48 -10
  46. package/pipeline/scripts/skill-siblings.mjs +1 -1
  47. package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +94 -0
  48. package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +79 -0
  49. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +10 -1
  50. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +13 -0
  51. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +9 -6
  52. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +18 -0
@@ -76,6 +76,11 @@
76
76
  "type": "string",
77
77
  "description": "PR target branch (e.g. develop, main)."
78
78
  },
79
+ "baseBranchSource": {
80
+ "type": "string",
81
+ "enum": ["asked", "input", "remembered", "default"],
82
+ "description": "How baseBranch was decided. asked = the user answered the Step 3 picker; input = it arrived with the task reference; remembered = autopilot took the most recent entry in prefs.global.recentBranches still inside the TTL and still on the remote; default = autopilot fell back to the develop/release/main sort order. An autopilot run cannot be asked anything, so recording which rule fired is what keeps it readable afterwards."
83
+ },
79
84
  "remoteType": {
80
85
  "type": "string",
81
86
  "enum": ["github", "bitbucket"],
@@ -1117,6 +1122,71 @@
1117
1122
  "type": ["string", "null"],
1118
1123
  "description": "Directory the worktree's artefacts were salvaged into before removal (agent-state, phase-tracker, triage-output, .pipeline/, build+test logs, review diff). Phase 7 and :resume read from here when worktreePath is gone."
1119
1124
  },
1125
+ "testDepth": {
1126
+ "type": ["string", "null"],
1127
+ "enum": ["unit", "unit+ui", "unit+mcp", null],
1128
+ "description": "How far the run tests, answered at intake because Phase 5 is absent from four of the eight modes and a question asked where it cannot be reached is a question nobody answers. `unit+ui` runs the repo's own UI test and records the screen around it; `unit+mcp` drives the flow through the toolkit MCP instead. The options offered are built from evidenceCapability, never from the model's reading of the repo."
1129
+ },
1130
+ "testDepthSource": {
1131
+ "type": ["string", "null"],
1132
+ "enum": ["user", "autopilot", "default", "forced", null],
1133
+ "description": "Who chose. `forced` means only one option was open, so nothing was asked - recorded rather than passed off as the user's answer."
1134
+ },
1135
+ "evidenceCapability": {
1136
+ "type": ["object", "null"],
1137
+ "additionalProperties": true,
1138
+ "description": "What this machine and this repo can actually produce, measured by probe-evidence-capability.sh BEFORE the test-depth question. Every absent value carries its reason, so a closed option can say why instead of vanishing from the menu; a value that could not be measured is null with a reason, never false, because a probe that did not look and a probe that found nothing are different facts. Contract: multi-agent-refs/features/visual-evidence.md.",
1139
+ "properties": {
1140
+ "platform": { "type": "string", "enum": ["ios", "android", "web", "other"] },
1141
+ "uiTestTarget": {
1142
+ "type": ["string", "null"],
1143
+ "description": "The single chosen target, empty while several candidates exist and no match picks one."
1144
+ },
1145
+ "uiTestTargets": {
1146
+ "type": "array",
1147
+ "items": { "type": "string" },
1148
+ "description": "Every candidate. A real app has many: the reference iOS app has one XCUITest bundle among 477 files that merely sit under a *UITests path, and the reference Android app has eight instrumentation source sets."
1149
+ },
1150
+ "uiTestTargetReason": { "type": ["string", "null"] },
1151
+ "matchingTests": {
1152
+ "type": "array",
1153
+ "items": { "type": "string" },
1154
+ "description": "Tests that mention a changed file's name. A heuristic, and treated as one: an empty set falls to the next tier rather than concluding the screen is untested."
1155
+ },
1156
+ "matchingTestsReason": { "type": ["string", "null"] },
1157
+ "device": { "type": ["string", "null"] },
1158
+ "deviceReason": {
1159
+ "type": ["string", "null"],
1160
+ "description": "'no booted simulator, but one is available to boot' and 'no iOS simulator available on this machine' are different problems with different fixes, and the user can act on only one of them."
1161
+ },
1162
+ "recorder": { "type": ["boolean", "null"] },
1163
+ "recorderReason": { "type": ["string", "null"] },
1164
+ "mcp": { "type": ["boolean", "null"] },
1165
+ "mcpReason": { "type": ["string", "null"] },
1166
+ "tier1": {
1167
+ "type": "string",
1168
+ "enum": ["open", "closed", "unknown"],
1169
+ "description": "Whether the depth menu may offer tier 1. `unknown` means the target was not probed (a --only device re-check), which is not the same as closed and must not be rendered as one."
1170
+ },
1171
+ "tier2": { "type": "string", "enum": ["open", "closed", "unknown"] }
1172
+ }
1173
+ },
1174
+ "uiTest": {
1175
+ "type": ["object", "null"],
1176
+ "additionalProperties": true,
1177
+ "description": "The UI test run that produced the tier 1 recording. Subject to the same default-FAIL rule as the build: a zero exit code alone is not a pass, the log is the evidence, and evidence-gate.mjs reads it.",
1178
+ "properties": {
1179
+ "ran": { "type": "boolean" },
1180
+ "target": { "type": ["string", "null"] },
1181
+ "selected": { "type": "array", "items": { "type": "string" } },
1182
+ "status": { "type": ["string", "null"], "enum": ["passed", "failed", "not-run", null] },
1183
+ "notRunReason": {
1184
+ "type": ["string", "null"],
1185
+ "description": "Why it did not run: no target, no matching test, no device. Each is a reason to fall to the next video tier, never a phase failure."
1186
+ },
1187
+ "logPath": { "type": ["string", "null"] }
1188
+ }
1189
+ },
1120
1190
  "visualEvidence": {
1121
1191
  "type": ["object", "null"],
1122
1192
  "additionalProperties": false,
@@ -1193,10 +1263,23 @@
1193
1263
  },
1194
1264
  "description": "Captured in Phase 3 after the build+test gate, because Phase 5 is dropped by every autopilot and --local entry."
1195
1265
  },
1266
+ "host": {
1267
+ "type": ["string", "null"],
1268
+ "enum": ["jira", "github-public", "github-private", "none", null],
1269
+ "description": "Where the artefacts are published, resolved in Phase 6. `jira` attaches both stills and video. `github-public` pushes the stills to the evidence branch and embeds them in the PR body. `github-private` pushes the same stills but the PR carries a blob permalink instead of an inline image, because GitHub's image proxy cannot fetch a private repo's raw URL and an embedded one renders broken for every reader. `none` publishes nothing and records the gap. Video is Jira-only by decision: without an attachment host there is nothing a recording can be attached to."
1270
+ },
1271
+ "hostReason": {
1272
+ "type": ["string", "null"],
1273
+ "description": "Why this host and not the one above it in the order. A host of `none` with no reason is the silence the Phase 6 blocker exists to catch."
1274
+ },
1196
1275
  "videoTier": {
1197
1276
  "type": ["integer", "null"],
1198
1277
  "enum": [1, 2, 3, null],
1199
- "description": "1 = the repo's own UI test target drove the flow, 2 = MCP-driven flow, 3 = no runnable build."
1278
+ "description": "1 = the repo's own UI test target drove the flow, 2 = MCP-driven flow, 3 = no recording. Resolved from the capability probe, then RE-CHECKED at capture time: a device booted at intake can be gone by Phase 3, and a tier recorded from a stale measurement is a promise the run cannot keep."
1279
+ },
1280
+ "videoTierReason": {
1281
+ "type": ["string", "null"],
1282
+ "description": "Which rule produced the tier, and the tier it came down from when it was downgraded at capture time, e.g. 'tier 1 -> 2: simulator no longer booted'."
1200
1283
  },
1201
1284
  "video": {
1202
1285
  "type": "object",