@mmerterden/multi-agent-pipeline 20.36.0 → 20.37.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 (191) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/docs/facts.json +1 -1
  3. package/install/catalog-history.json +1 -1
  4. package/manifest.json +194 -122
  5. package/package.json +1 -1
  6. package/pipeline/commands/multi-agent/SKILL.md +33 -154
  7. package/pipeline/commands/multi-agent/analysis/SKILL.md +14 -68
  8. package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +5 -8
  9. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +38 -109
  10. package/pipeline/commands/multi-agent/channels/SKILL.md +38 -167
  11. package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +37 -144
  12. package/pipeline/commands/multi-agent/design-check/SKILL.md +27 -131
  13. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +22 -48
  14. package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +37 -180
  15. package/pipeline/commands/multi-agent/jira/SKILL.md +16 -46
  16. package/pipeline/commands/multi-agent/refactor/SKILL.md +23 -184
  17. package/pipeline/commands/multi-agent/resume/SKILL.md +30 -136
  18. package/pipeline/commands/multi-agent/review/SKILL.md +24 -199
  19. package/pipeline/commands/multi-agent/setup/SKILL.md +25 -181
  20. package/pipeline/commands/multi-agent/stack/SKILL.md +9 -53
  21. package/pipeline/commands/multi-agent/status/SKILL.md +13 -2
  22. package/pipeline/commands/multi-agent/store-ready/SKILL.md +27 -226
  23. package/pipeline/commands/multi-agent/sync/SKILL.md +35 -164
  24. package/pipeline/commands/multi-agent/test-gen/SKILL.md +2 -4
  25. package/pipeline/commands/multi-agent/update/SKILL.md +18 -60
  26. package/pipeline/contract/CHANGELOG.md +9 -0
  27. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  28. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  29. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  30. package/pipeline/contract/fixtures/runs-awaiting-question.json +1 -1
  31. package/pipeline/contract/fixtures/runs-empty.json +1 -1
  32. package/pipeline/contract/fixtures/runs-failed.json +1 -1
  33. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +1 -1
  34. package/pipeline/contract/fixtures/runs-pr-opened.json +1 -1
  35. package/pipeline/contract/fixtures/runs-running.json +1 -1
  36. package/pipeline/contract/manifest.json +5 -5
  37. package/pipeline/contract/types/index.d.ts +3 -2
  38. package/pipeline/multi-agent-refs/autopilot-on/details.md +148 -0
  39. package/pipeline/multi-agent-refs/channels/generator.md +14 -0
  40. package/pipeline/multi-agent-refs/channels/preview.md +13 -0
  41. package/pipeline/multi-agent-refs/channels/reference.md +46 -0
  42. package/pipeline/multi-agent-refs/complaint-analysis/phases.md +159 -0
  43. package/pipeline/multi-agent-refs/design-check/export.md +1 -0
  44. package/pipeline/multi-agent-refs/design-check/init-inventory.md +1 -1
  45. package/pipeline/multi-agent-refs/design-check/scope-and-ledger.md +64 -0
  46. package/pipeline/multi-agent-refs/features/analysis-command-notes.md +53 -0
  47. package/pipeline/multi-agent-refs/garbage-collect/phases.md +60 -0
  48. package/pipeline/multi-agent-refs/ios-coding-standard/plan.md +71 -0
  49. package/pipeline/multi-agent-refs/ios-coding-standard/resolve-and-scan.md +135 -0
  50. package/pipeline/multi-agent-refs/jira/picker-detail.md +71 -0
  51. package/pipeline/multi-agent-refs/orchestrator/copilot-pipeline.md +88 -0
  52. package/pipeline/multi-agent-refs/orchestrator/dispatcher.md +96 -1
  53. package/pipeline/multi-agent-refs/refactor/sweep.md +190 -0
  54. package/pipeline/multi-agent-refs/resume/details.md +115 -2
  55. package/pipeline/multi-agent-refs/review/inputs.md +33 -1
  56. package/pipeline/multi-agent-refs/review/module-guides.md +9 -1
  57. package/pipeline/multi-agent-refs/review/panel.md +75 -0
  58. package/pipeline/multi-agent-refs/review/valven.md +5 -1
  59. package/pipeline/multi-agent-refs/setup/hooks-and-plugins.md +4 -0
  60. package/pipeline/multi-agent-refs/setup/token-save-flow.md +13 -0
  61. package/pipeline/multi-agent-refs/stack/background.md +72 -0
  62. package/pipeline/multi-agent-refs/store-ready/gates.md +139 -0
  63. package/pipeline/multi-agent-refs/store-ready/report.md +40 -2
  64. package/pipeline/multi-agent-refs/sync/office.md +10 -0
  65. package/pipeline/multi-agent-refs/sync/overview.md +61 -0
  66. package/pipeline/multi-agent-refs/sync/repo.md +91 -0
  67. package/pipeline/multi-agent-refs/update/details.md +83 -0
  68. package/pipeline/schemas/runs-index.schema.json +2 -1
  69. package/pipeline/scripts/contract-server.mjs +1 -1
  70. package/pipeline/scripts/runs-index.mjs +34 -7
  71. package/pipeline/scripts/status-overview.mjs +401 -0
  72. package/pipeline/skills/.skill-manifest.json +63 -63
  73. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +7 -70
  74. package/pipeline/skills/shared/core/apple-archive-compliance/references/examples.md +67 -0
  75. package/pipeline/skills/shared/core/apple-archive-compliance/references/version-history.md +8 -0
  76. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +10 -72
  77. package/pipeline/skills/shared/core/google-play-compliance/references/examples.md +69 -0
  78. package/pipeline/skills/shared/core/google-play-compliance/references/notes.md +7 -0
  79. package/pipeline/skills/shared/core/google-play-compliance/references/version-history.md +5 -0
  80. package/pipeline/skills/shared/core/multi-agent/SKILL.md +39 -262
  81. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +35 -73
  82. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +37 -337
  83. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +27 -122
  84. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +8 -340
  85. package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +37 -180
  86. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +23 -184
  87. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +14 -82
  88. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +25 -277
  89. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +13 -2
  90. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +73 -217
  91. package/pipeline/skills/shared/external/alarmkit/SKILL.md +11 -162
  92. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-code.md +257 -0
  93. package/pipeline/skills/shared/external/android-architecture/SKILL.md +7 -58
  94. package/pipeline/skills/shared/external/android-architecture/references/code-examples.md +68 -0
  95. package/pipeline/skills/shared/external/app-intents/SKILL.md +3 -45
  96. package/pipeline/skills/shared/external/app-intents/references/code-examples.md +54 -0
  97. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +5 -81
  98. package/pipeline/skills/shared/external/app-store-optimization/references/engagement-and-localization.md +96 -0
  99. package/pipeline/skills/shared/external/app-store-review/SKILL.md +6 -112
  100. package/pipeline/skills/shared/external/app-store-review/references/monetization-and-submission.md +138 -0
  101. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +10 -117
  102. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models-code.md +186 -0
  103. package/pipeline/skills/shared/external/authentication/SKILL.md +3 -50
  104. package/pipeline/skills/shared/external/authentication/references/code-examples.md +59 -0
  105. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +3 -84
  106. package/pipeline/skills/shared/external/callkit-voip/references/code-examples.md +93 -0
  107. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +7 -263
  108. package/pipeline/skills/shared/external/ci-cd-pipelines/references/pipeline-examples.md +281 -0
  109. package/pipeline/skills/shared/external/clean-code/SKILL.md +8 -41
  110. package/pipeline/skills/shared/external/clean-code/references/code-examples.md +56 -0
  111. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +8 -146
  112. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-code.md +214 -0
  113. package/pipeline/skills/shared/external/compose-components/SKILL.md +6 -80
  114. package/pipeline/skills/shared/external/compose-components/references/code-examples.md +89 -0
  115. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +5 -64
  116. package/pipeline/skills/shared/external/compose-navigation/references/code-examples.md +70 -0
  117. package/pipeline/skills/shared/external/core-data/SKILL.md +9 -157
  118. package/pipeline/skills/shared/external/core-data/references/core-data-code.md +221 -0
  119. package/pipeline/skills/shared/external/core-nfc/SKILL.md +3 -89
  120. package/pipeline/skills/shared/external/core-nfc/references/code-examples.md +98 -0
  121. package/pipeline/skills/shared/external/coreml/SKILL.md +17 -133
  122. package/pipeline/skills/shared/external/coreml/references/coreml-code.md +208 -0
  123. package/pipeline/skills/shared/external/css-modern/SKILL.md +8 -131
  124. package/pipeline/skills/shared/external/css-modern/references/code-examples.md +142 -0
  125. package/pipeline/skills/shared/external/database-patterns/SKILL.md +6 -103
  126. package/pipeline/skills/shared/external/database-patterns/references/orm-examples.md +112 -0
  127. package/pipeline/skills/shared/external/html-semantic/SKILL.md +7 -48
  128. package/pipeline/skills/shared/external/html-semantic/references/code-examples.md +54 -0
  129. package/pipeline/skills/shared/external/humanizer/SKILL.md +6 -19
  130. package/pipeline/skills/shared/external/humanizer/references/voice.md +24 -0
  131. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +13 -170
  132. package/pipeline/skills/shared/external/ios-accessibility/references/assistive-tech-review.md +224 -0
  133. package/pipeline/skills/shared/external/ios-localization/SKILL.md +2 -24
  134. package/pipeline/skills/shared/external/ios-localization/references/code-examples.md +30 -0
  135. package/pipeline/skills/shared/external/ios-networking/SKILL.md +3 -58
  136. package/pipeline/skills/shared/external/ios-networking/references/code-examples.md +67 -0
  137. package/pipeline/skills/shared/external/ios-security/SKILL.md +4 -64
  138. package/pipeline/skills/shared/external/ios-security/references/code-examples.md +74 -0
  139. package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -90
  140. package/pipeline/skills/shared/external/live-activities/references/code-examples.md +108 -0
  141. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +9 -23
  142. package/pipeline/skills/shared/external/localization-reuse-map/references/project-settings.md +22 -0
  143. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +5 -95
  144. package/pipeline/skills/shared/external/mapkit-location/references/code-examples.md +117 -0
  145. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +7 -106
  146. package/pipeline/skills/shared/external/nextjs-app-router/references/app-router-examples.md +124 -0
  147. package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -31
  148. package/pipeline/skills/shared/external/permissionkit/references/code-examples.md +37 -0
  149. package/pipeline/skills/shared/external/play-store-review/SKILL.md +6 -74
  150. package/pipeline/skills/shared/external/play-store-review/references/signing-and-policies.md +83 -0
  151. package/pipeline/skills/shared/external/push-notifications/SKILL.md +8 -125
  152. package/pipeline/skills/shared/external/push-notifications/references/notification-code.md +176 -0
  153. package/pipeline/skills/shared/external/python-patterns/SKILL.md +7 -158
  154. package/pipeline/skills/shared/external/python-patterns/references/python-examples.md +176 -0
  155. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +7 -157
  156. package/pipeline/skills/shared/external/rest-api-design/references/api-examples.md +175 -0
  157. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +11 -230
  158. package/pipeline/skills/shared/external/swift-architecture/references/pattern-examples.md +295 -0
  159. package/pipeline/skills/shared/external/swift-codable/SKILL.md +17 -149
  160. package/pipeline/skills/shared/external/swift-codable/references/codable-recipes.md +207 -0
  161. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +12 -99
  162. package/pipeline/skills/shared/external/swift-concurrency/references/code-examples.md +100 -0
  163. package/pipeline/skills/shared/external/swift-concurrency/references/swift-6-2-additions.md +18 -0
  164. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +9 -78
  165. package/pipeline/skills/shared/external/swift-formatstyle/references/formatstyle-examples.md +113 -0
  166. package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -56
  167. package/pipeline/skills/shared/external/swift-language/references/code-examples.md +65 -0
  168. package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +1 -0
  169. package/pipeline/skills/shared/external/swiftdata/SKILL.md +6 -122
  170. package/pipeline/skills/shared/external/swiftdata/references/code-examples.md +140 -0
  171. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +12 -139
  172. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/interop-code.md +198 -0
  173. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +9 -81
  174. package/pipeline/skills/shared/external/tailwind-css/references/code-examples.md +91 -0
  175. package/pipeline/skills/shared/external/testing-backend/SKILL.md +7 -207
  176. package/pipeline/skills/shared/external/testing-backend/references/testing-examples.md +225 -0
  177. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +8 -89
  178. package/pipeline/skills/shared/external/typescript-patterns/references/code-examples.md +100 -0
  179. package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -20
  180. package/pipeline/skills/shared/external/vision-framework/references/code-examples.md +26 -0
  181. package/pipeline/skills/shared/external/vue-composition/SKILL.md +7 -169
  182. package/pipeline/skills/shared/external/vue-composition/references/vue-examples.md +187 -0
  183. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +7 -174
  184. package/pipeline/skills/shared/external/web-accessibility/references/a11y-examples.md +192 -0
  185. package/pipeline/skills/shared/external/web-performance/SKILL.md +8 -66
  186. package/pipeline/skills/shared/external/web-performance/references/code-examples.md +77 -0
  187. package/pipeline/skills/shared/external/web-testing/SKILL.md +11 -186
  188. package/pipeline/skills/shared/external/web-testing/references/testing-examples.md +213 -0
  189. /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/format-and-output.md +0 -0
  190. /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/publish-and-snapshot.md +0 -0
  191. /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/sources-and-recipes.md +0 -0
@@ -13,10 +13,9 @@ metadata:
13
13
  Turns on the mode that picks work up without being asked. **No repo is included
14
14
  by default and none is ever added implicitly** - you choose, here, every time.
15
15
 
16
- Why a picker rather than a label alone: measured on one machine, 66 repos grant
17
- push and a good half belong to other people. A label is a filter; anyone who can
18
- open an issue in a repo you happen to have push on could add one. The gate is
19
- this selection, and it is per machine.
16
+ The gate is this selection, per machine; a label alone is only a filter.
17
+ Reasoning and detail for every step: `$HOME/.claude/multi-agent-refs/autopilot-on/details.md`. Read it
18
+ when Jira is a source or a step's reasoning is needed.
20
19
 
21
20
  ## Steps
22
21
 
@@ -28,8 +27,7 @@ command -v jq >/dev/null 2>&1 || echo "BLOCKED: jq is required"
28
27
  node "$HOME/.claude/scripts/doctor.mjs" >/dev/null 2>&1; [ "$?" -ge 2 ] && echo "BLOCKED: doctor reports a blocking problem - fix it first"
29
28
  ```
30
29
 
31
- Any BLOCKED line stops here and is reported. Arming unattended work on an install
32
- that `doctor` calls broken produces a queue of failures, one per item.
30
+ Any BLOCKED line stops here and is reported.
33
31
 
34
32
  ### 2. The repo list, both halves of it
35
33
 
@@ -42,9 +40,7 @@ Two states come back and **both are shown**:
42
40
  - `eligible` - push rights and a checkout on this machine
43
41
  - `unavailable` - push rights, no local checkout, listed WITH that reason
44
42
 
45
- Never hide the second list. Dropping 51 of 66 rows silently looks exactly like a
46
- permissions problem, and the user goes hunting for a token fault that does not
47
- exist.
43
+ Never hide the second list.
48
44
 
49
45
  ### 3. Pick, with the current selection already checked
50
46
 
@@ -55,43 +51,29 @@ Read `~/.claude/autopilot/config.json` if it exists, then one `AskUserQuestion`
55
51
  - `header`: "Repos" (English, UI contract)
56
52
  - `options`: one per eligible repo, currently-selected ones marked "(seçili)" / "(selected)"
57
53
 
58
- **This is how repos are added and removed.** Checking a new one adds it;
59
- unchecking an existing one removes it. There is no `add-repo` / `remove-repo`
60
- command, because two entry points to one list is two lists.
54
+ **This is how repos are added and removed** (check adds, uncheck removes); there
55
+ is no `add-repo` / `remove-repo` command.
61
56
 
62
57
  Unavailable repos are printed above the question as a plain list with their
63
58
  reason, not offered as options.
64
59
 
65
60
  ### 4. Sources and label, per selected repo
66
61
 
67
- One `AskUserQuestion` per newly added repo (already-configured ones keep their
68
- answers - re-running must not re-ask what was already settled):
62
+ One `AskUserQuestion` per newly added repo (never re-ask a configured one):
69
63
 
70
64
  - Sources: `GitHub issues` / `Jira` / both
71
65
  - Label: default **`agent-queue`** on both sides, editable
72
66
 
73
- The same name works on both sides and both mechanisms already exist:
74
-
75
- | Source | Query | Extra condition |
76
- |---|---|---|
77
- | GitHub | `gh issue list --repo <r> --label <label> --assignee @me --state open` | **assigned to you** (`githubAssignee`, `"*"` for any), so a label an issue form applies is not enough |
78
- | Jira | `assignee = currentUser() AND labels = "<label>" AND resolution = EMPTY AND status not in (Done, Closed, Cancelled)` | **assigned to you**, so a label somebody else adds is not enough |
79
-
80
- Two Jira caveats worth saying out loud when Jira is selected: labels are one
81
- global namespace across the whole instance and anyone can write them, so on a
82
- shared instance prefer a qualified name (`agent-queue-<team>`); and the Labels
83
- field has to be on the edit screen for the issue types in play. An instance where
84
- neither holds is a `jiraJql` config change - a saved filter, a component - not a
85
- redesign.
67
+ Both sources pick up only items **assigned to you** that carry the label; the
68
+ query per source is in `details.md`, "Source queries". When Jira is selected,
69
+ state the two Jira caveats from that section (global label namespace, Labels
70
+ field on the edit screen).
86
71
 
87
72
  ### 5. Keep the Mac awake: display on, or allowed to sleep
88
73
 
89
- While the mode is on, the Mac is kept awake by a second launchd agent,
90
- `com.multi-agent.autopilot-awake`, which runs `/usr/bin/caffeinate -s -i` from
91
- **Start** until `autopilot-off`. Without it the machine can sleep between ticks,
92
- and launchd does not wake it for the next one: the queue stops with nothing to
93
- say so. `-s` holds system sleep off on AC power; `-i` holds idle sleep off on
94
- battery too.
74
+ While the mode is on, a second launchd agent, `com.multi-agent.autopilot-awake`,
75
+ runs `/usr/bin/caffeinate -s -i` so the Mac does not sleep between ticks (why:
76
+ `details.md`, "Keeping the Mac awake").
95
77
 
96
78
  One `AskUserQuestion` decides the display:
97
79
 
@@ -102,8 +84,7 @@ One `AskUserQuestion` decides the display:
102
84
  Branch on the option selected: **Display may sleep** writes `awake.display:
103
85
  false`, **Keep display on** writes `awake.display: true`, both with
104
86
  `awake.enabled: true`. A config that already carries `awake` shows its current
105
- answer as the first option. Display sleep does not lock the keychain; system
106
- sleep can, which is the part `-s -i` prevents regardless of this answer.
87
+ answer as the first option.
107
88
 
108
89
  ### 6. Write the config
109
90
 
@@ -111,10 +92,9 @@ Validate against `schemas/autopilot-config.schema.json`, then write
111
92
  `~/.claude/autopilot/config.json` (0600, in a 0700 directory) via
112
93
  `ma_ap_write` in `lib/autopilot-state.sh`. Defaults that are not asked:
113
94
  `slots: 1`, `scanIntervalSeconds: 120`, `maxAttempts: 2`,
114
- `costCeilingUsd: 25`. `awake` carries the answer from the previous step. Keys the schema reserves and nothing reads
115
- (`askOnLowMaturity`, `reportStatus`, `sendItemKeys`) are not written. A config
116
- written by an older version may carry `depthRouter` or one of those; the schema
117
- still accepts them and nothing reads them, so drop them when rewriting the file.
95
+ `costCeilingUsd: 25`. `awake` carries the answer from the previous step. Never
96
+ write `askOnLowMaturity`, `reportStatus`, `sendItemKeys` or `depthRouter`; drop
97
+ them when rewriting an older file.
118
98
 
119
99
  ### 7. Build the menu bar indicator (best effort)
120
100
 
@@ -126,15 +106,10 @@ if command -v swiftc >/dev/null 2>&1; then
126
106
  fi
127
107
  ```
128
108
 
129
- Built from source on demand, never shipped as a binary: the package contains only
130
- text today, and a compiled artifact in it would need signing and notarization to
131
- be distributable. No `swiftc` means no indicator and nothing else changes - say
132
- so in one line rather than failing. `autopilot-status` works either way.
133
-
134
- The compiled binary is the one thing an update does not replace, so the runner
135
- rebuilds it on the first tick after `autopilot-menubar.swift` becomes newer than
136
- `bin/menubar`. A machine that is already on picks up a new indicator without
137
- running this command again.
109
+ Built from source on demand, never shipped as a binary. No `swiftc` means no
110
+ indicator and nothing else changes - say so in one line rather than failing.
111
+ `autopilot-status` works either way. The runner rebuilds it when the source is
112
+ newer.
138
113
 
139
114
  ### 8. Confirm the schedule, naming the file
140
115
 
@@ -148,10 +123,7 @@ node "$HOME/.claude/scripts/autopilot-arming.mjs" probe
148
123
  `PROBE_READY=false` removes **Start** from the question below: each
149
124
  `PROBE_PROBLEM=` line names the logical key (or GitHub) and the fix, and is shown
150
125
  as it is. "Configure only" stays available. `PROBE_WARNING=` lines are shown and
151
- do not block: a login keychain that locks on sleep or after a timeout is readable
152
- now and locked for the tick after the Mac slept, which every tick checks again
153
- and refuses with the same message. `features/autopilot-operations.md` has the
154
- probe's rules.
126
+ do not block (why: `details.md`, "Probe warnings").
155
127
 
156
128
  Render `templates/multi-agent-autopilot.plist.template` and show the resolved
157
129
  **path** and interval, then `AskUserQuestion`:
@@ -159,22 +131,17 @@ Render `templates/multi-agent-autopilot.plist.template` and show the resolved
159
131
  - `question`: install the schedule at `~/Library/LaunchAgents/com.multi-agent.autopilot.plist`, and the awake agent at `~/Library/LaunchAgents/com.multi-agent.autopilot-awake.plist`, and start picking work up?
160
132
  - options: `{ label: "Start" }` / `{ label: "Configure only", description: "Save the repo selection, do not schedule anything yet" }`
161
133
 
162
- "Configure only" is a real answer and the safe default to offer first: the queue
163
- can be watched with `autopilot-status` for a while before anything runs.
134
+ "Configure only" is a real answer and the safe default to offer first.
164
135
 
165
- On **Start**, load the schedule and the awake agent with the same script the
166
- office panel's `POST /v1/autopilot/on` calls, naming every repo selected in step 3:
136
+ On **Start**, load the schedule and the awake agent, naming every repo selected
137
+ in step 3:
167
138
 
168
139
  ```bash
169
140
  node "$HOME/.claude/scripts/autopilot-control.mjs" on --repo <owner/name> [--repo <owner/name>...]
170
141
  ```
171
142
 
172
- It keeps exactly those repos in `config.json`, probes their credentials again
173
- (`autopilot-arming.mjs probeCredentials`), renders
174
- `templates/multi-agent-autopilot.plist.template` with its seven placeholders
175
- (NODE, TICK, LABEL, ROOT, INTERVAL, HOME, CLAUDE), loads it with `launchctl
176
- bootstrap` (falling back to `load`) and installs the awake agent with the
177
- `awake.display` answer saved above. `scheduled: false` with probe problems means
143
+ It re-probes credentials, renders and loads the plist and installs the awake
144
+ agent (detail: `details.md`). `scheduled: false` with probe problems means
178
145
  nothing was loaded; say so with the problems. Exit 1 with `launchd refused`
179
146
  means launchd refused the job: say so, with its path, and say the Mac may sleep
180
147
  between ticks until it is fixed. "Configure only" is `--configure-only`, which
@@ -182,21 +149,16 @@ saves the selection and installs neither.
182
149
 
183
150
  ### 9. Report what is now true
184
151
 
185
- Say all five, because each one is something a user has asked about after the
186
- fact: which repos and which labels; that it survives a restart with no command to
187
- run (launchd loads at **login** - not boot, and that is correct, because the login
188
- keychain is what unlocks the tokens, so a run before login could not reach Jira or
189
- GitHub anyway); that the machine is kept awake for as long as the mode is on (system sleep on AC, idle sleep on battery too) and whether the display is kept on; the slot count
152
+ Say all five: which repos and which labels; that it survives a restart with no
153
+ command to run (launchd loads at **login**, not boot); that the machine is kept awake while the mode is on and whether the display is kept on; the slot count
190
154
  and the ceiling this machine would allow (`ma_ap_slot_ceiling`); and that
191
155
  `/multi-agent:autopilot-off` is the only way to stop it.
192
156
 
193
157
  ## What this does not do
194
158
 
195
- - **No cap on PRs.** As many items as carry the label become as many PRs. The
196
- bounds are `costCeilingUsd` over a rolling 24 hours and what the machine can
197
- hold - never a daily count.
159
+ - **No cap on PRs.** Every labelled item becomes a PR; the bounds are
160
+ `costCeilingUsd` over a rolling 24 hours and machine capacity, never a daily count.
198
161
  - **Does not merge.** The runner stops at an open PR; the merge decision stays
199
162
  yours.
200
- - **Does not touch an attended run.** Both are worktrees and per-repo concurrency
201
- is 1, so the queue skips a repo you are working in rather than competing for
202
- `.git/index.lock`.
163
+ - **Does not touch an attended run.** Per-repo concurrency is 1: the queue skips
164
+ a repo you are working in.
@@ -7,362 +7,62 @@ metadata:
7
7
  language: en
8
8
  ---
9
9
 
10
- # multi-agent-channels - Multi-Channel Reporter
10
+ # multi-agent-channels - Multi-Channel Reporter
11
11
 
12
- > **TLDR** - Single entry point for posting task reports to external channels. Supports Jira, Confluence, Wiki (component-only), and PR description updates. Multi-select channels × multi-select content sources. Phase 5 of the pipeline delegates to this skill; users can also invoke it post-hoc by Jira ID / PR URL / branch.
13
- >
14
- > **Replaces the old enrich skill in v5.7+** - all enrich capabilities (diff auto-summarize, manual mode, reviewer-preserving Bitbucket PR PUT) are preserved and extended with two additional channels (Confluence, Wiki).
12
+ Single entry point for posting a task report to Jira, Confluence, Wiki (component-only) and the PR description. Phase 5 delegates here; users also invoke it post-hoc by Jira ID / PR URL / branch. Copilot CLI: `multi-agent-channels <target>`; Claude Code: `/multi-agent:channels <target>`. Prompts are byte-identical between the two (`smoke-cross-cli-behavior.sh`).
15
13
 
16
- **Copilot CLI invocation:** `multi-agent-channels <target>` (top-level skill, dash-separated per Copilot no-namespace convention).
17
- **Claude Code equivalent:** `/multi-agent:channels <target>` (slash namespace).
18
-
19
- Both CLIs read the same underlying logic - see `~/.claude/commands/multi-agent/channels/SKILL.md` (Claude) or this file (Copilot). Prompts MUST be byte-identical; `smoke-cross-cli-behavior.sh` asserts parity.
20
-
21
- ## Input
22
-
23
- ```
24
- multi-agent-channels # cwd + current branch
25
- multi-agent-channels PROJ-12345 # Jira ID
26
- multi-agent-channels #42 # GitHub issue/PR number
27
- multi-agent-channels https://github.com/<org>/<repo>/pull/N
28
- multi-agent-channels https://<bitbucket-host>/projects/.../pull-requests/N
29
- multi-agent-channels https://<jira-host>/browse/PROJ-12345
30
-
31
- multi-agent-channels PROJ-12345 --channels jira,confluence # non-interactive channel
32
- multi-agent-channels PROJ-12345 --content auto-diff # non-interactive content
33
- multi-agent-channels PROJ-12345 --message "root: ..." # manual source
34
- multi-agent-channels PROJ-12345 --message-file notes.md # manual, long
35
- multi-agent-channels PROJ-12345 --dry-run # preview, no POST
36
- ```
14
+ References under `$HOME/.claude/multi-agent-refs/channels/` are installed with Claude Code. Before step 1, read `reference.md` there: input forms, flags, target resolution, the mode table, error handling, examples and the Phase 5 delegation contract.
37
15
 
38
16
  ## Flow
39
17
 
40
- 1. **Target resolution** - Parse argument, classify (Jira-id, Jira-url, PR-url GitHub or Bitbucket, GitHub-issue-number, empty→cwd+branch). Resolve linked entities (Jira→PR, PR→Jira). Detect remote type.
41
- 2. **Context source detection** - auto-pick best available: pipeline log (`$HOME/.claude/logs/multi-agent/<project>/<task-id>/agent-log.md` matching jiraId), PR diff (`gh pr diff` or Bitbucket `/diff?contextLines=5`), or manual `--message`.
42
- 3. **Menu (multi-select)** - channel + content, previous selections pre-ticked from `prefs.global.reportChannels` + `prefs.global.reportContent`. Greyed-out rules per context availability.
43
- 4. **Mode short-circuit** - `--channels X,Y` + `--content A,B` flags skip menu. Autopilot ALWAYS pauses at the menu (v5.7+ Phase 5 exception). Under `MULTI_AGENT_UNATTENDED=1` nothing is posted: see "Unattended" below.
44
- 5. **Generator** - for each selected content source, produce a section body. Humanizer pass per channel separately.
45
- 6. **Body preview + approval gate** - interactive runs render every selected channel's final body and ask Approve & post / Edit (loop) / Skip channels / Cancel BEFORE any external write. Skipped only by autopilot and `--dry-run`. What is posted is byte-identical to the approved preview.
46
- 7. **Channel dispatch** - parallel adapter calls, never before the gate resolves: PR description (reviewer-preserving PUT on Bitbucket), Jira comment (wiki markup), Confluence page (storage format + parent page), Wiki (component adapter - Case A scope multi-select or Case B precondition menu).
47
- 8. **Summary** - per-adapter status line, persist selections to prefs.
48
-
49
- ## Multi-select menu
50
-
51
- Rendered in English (`promptLanguage` is locked to `en`).
52
-
53
- ```
54
- ┌─ Kanallar ────────────────────────────────────────────
55
- │ [x] PR description (replace / append)
56
- │ [x] Jira comment (jiraId: PROJ-12345)
57
- │ [ ] Confluence page
58
- │ [ ] Wiki (taskType=component + wiki.enabled gerekli)
59
- └───────────────────────────────────────────────────────
60
-
61
- ┌─ İçerik ──────────────────────────────────────────────
62
- │ [x] Normal analiz (Phase 1+2+4'ten - high-level impact + risks)
63
- │ [ ] Teknik analiz (Changes · Architecture · Dependencies)
64
- │ [x] Test senaryoları (Phase 1+2+4'ten)
65
- │ [ ] Test Koşumu (Xray) (flow runner history.jsonl)
66
- │ [ ] PR diff'ten auto-gen (PR varsa diff'i summarize eder)
67
- │ [ ] Manuel not (--message / --message-file)
68
- └───────────────────────────────────────────────────────
69
- ```
70
-
71
- **Greyed-out rules:**
72
- - Wiki unselectable unless `state.taskType === "component"` AND `figmaConfig.wiki.enabled === true`.
73
- - Normal analiz + Test senaryoları unselectable if no pipeline log found.
74
- - Teknik analiz unselectable if no Phase 1 planning log AND no PR diff.
75
- - Auto-diff unselectable if no PR found.
76
- - Manuel not always available.
77
- - Test Koşumu (Xray) unselectable when `render-flow-run.mjs --json` reports `available: false`; its `reason` is shown.
18
+ 1. **Target resolution**: classify the argument (Jira id / url, GitHub or Bitbucket PR URL, `#N`, empty = cwd + branch), resolve Jira <-> PR, detect the remote type. A Phase 5 call passes a state bundle and skips this step.
19
+ 2. **Context source**: pipeline log (`$HOME/.claude/logs/multi-agent/<project>/<task-id>/agent-log.md`), PR diff, or `--message`. Read `channels/menu.md`.
20
+ 3. **Menu (multi-select)**: channels + content, pre-ticked from `prefs.global.reportChannels` / `prefs.global.reportContent`; unavailable rows greyed with a reason (`menu.md`).
21
+ 4. **Mode short-circuit**: `--channels` + `--content` skip the menu. Autopilot always pauses at the menu.
22
+ 5. **Generator**: one section per content source, humanizer per channel. Read `channels/generator.md`.
23
+ 6. **Body preview + approval gate**: interactive runs render every final body and ask Approve & post / Edit (loop) / Skip channels / Cancel BEFORE any external write. Skipped only by autopilot and `--dry-run`. What is posted is byte-identical to the approved preview. Read `channels/preview.md`.
24
+ 7. **Dispatch**: parallel adapters, never before the gate resolves.
25
+ 8. **Summary**: one status line per adapter; persist the selections to prefs.
78
26
 
79
27
  ## Channel adapters
80
28
 
81
- ### PR description (Bitbucket reviewer-preserving PUT)
82
-
83
- ```bash
84
- PR_JSON=$(curl -s --config <(printf 'user = "%s:%s"\n' "$BB_USER" "$BB_TOKEN") "$PR_URL")
85
- REVIEWERS=$(jq '[.reviewers[] | {user: {name: .user.name}, approved, status}]' <<< "$PR_JSON")
86
- VERSION=$(jq -r '.version' <<< "$PR_JSON")
87
- TITLE=$(jq -r '.title' <<< "$PR_JSON")
88
- FROM_REF=$(jq '.fromRef | {id, repository}' <<< "$PR_JSON")
89
- TO_REF=$(jq '.toRef | {id, repository}' <<< "$PR_JSON")
90
- DRAFT=$(jq -r '.draft // false' <<< "$PR_JSON")
91
-
92
- jq -n --rawfile body /tmp/channels-$TASK_ID-pr.md \
93
- --argjson version "$VERSION" --arg title "$TITLE" \
94
- --argjson reviewers "$REVIEWERS" \
95
- --argjson fromRef "$FROM_REF" --argjson toRef "$TO_REF" \
96
- --argjson draft "$DRAFT" \
97
- '{version: $version, title: $title, description: $body,
98
- reviewers: $reviewers, fromRef: $fromRef, toRef: $toRef, draft: $draft}' \
99
- > /tmp/channels-$TASK_ID-pr-payload.json
100
-
101
- curl -s -X PUT --config <(printf 'user = "%s:%s"\n' "$BB_USER" "$BB_TOKEN") -H "Content-Type: application/json" \
102
- --data-binary @/tmp/channels-$TASK_ID-pr-payload.json "$PR_URL"
103
- ```
104
-
105
- **(strict):** every Bitbucket PR PUT MUST include `reviewers`, `fromRef`, `toRef`, `draft`. Omitting any resets that field server-side (default reviewers wiped, branch link broken).
106
-
107
- GitHub uses `gh pr edit --body-file` - reviewers independent, no risk.
108
-
109
- ### Jira comment (wiki markup)
110
-
111
- Four sections in this fixed order, the PR link on line 1. Jira is read by the
112
- person who filed the ticket and by whoever tests it, so the comment carries the
113
- development summary, the scenarios to run and the impact - never class names,
114
- never file paths, never a diff walk. The technical view lives in the PR, one
115
- click away through that first line.
116
-
117
- ```
118
- PR: {prUrl}
119
-
120
- h2. Geliştirme Özeti
121
-
122
- {2-5 sentences: what changed, where the user meets it, and the size of the
123
- effect when it is measurable}
124
-
125
- h2. Test Senaryoları
126
-
127
- *1. {what this scenario exercises}*
128
- # {step the tester performs, in the app's own words}
129
- # {step}
130
- # *Beklenen:* {what they should see}
131
-
132
- *2. {regression scenario}*
133
- # {step}
134
- # *Beklenen:* {what should still behave as before}
135
-
136
- h2. Etki Analizi
137
-
138
- *1 - Problemin Tanımı*
139
- {what was wrong and since when}
140
-
141
- *2 - Yapılan Geliştirme*
142
- {what the change does, and why the behaviour around it is unchanged}
143
-
144
- *3 - Etkilenen Fonksiyonlar*
145
- {the screens and flows that must be tested}
146
-
147
- *4 - Diğer Sistemlere Etkisi*
148
- {none, or which service, contract or channel}
149
-
150
- h2. Bağlantılar
151
-
152
- * Crashlytics / Confluence / Figma: {url}
153
- ```
154
-
155
- Reproduction scenarios first, then regressions for whatever the change could
156
- have disturbed. Full contract: `channels/jira.md`.
157
-
158
- `{{file.ext → func}}`, `*Root cause:*` and `*Changed files:*` are deliberately
159
- NOT this template. That shape puts a hash-table mutation walk in front of a
160
- tester, and `{{file → func}}` is exactly where a Swift selector like
161
- `hash(into:)` ends up - whose trailing `:)` Jira renders as a smiley.
162
-
163
- **Post through the publisher, never a hand-rolled `curl`:**
164
-
165
- ```bash
166
- bash "$HOME/.claude/lib/jira-publish.sh" --issue "$JIRA_ID" --body-file "$F" --target comment
167
- ```
168
-
169
- It escapes every body unconditionally before sending and keeps the token off
170
- argv. Jira turns `:)` `(x)` `(!)` `(/)` into emoticon images, including inside
171
- `{{monospace}}`; an escape that has to be remembered is one that is eventually
172
- forgotten, and that is how the selector above shipped.
173
-
174
- **Issue family** (`state.jiraFamily` set by Phase 0): the same body goes to the development sub-task, the test scenarios to the test sub-task (or, with none, the story) and a reformat of a story outside the story format to the story. `plan` prints one grouped confirmation ("3 yazma: story açıklaması, dev yorumu, test yorumu") and any question; show every write's body from `jira-family/plan.json` as one multi-select, re-run `plan` with `--skip <deselected ids>` (or `--dev-task` / `--test-task` for a question), then `apply`. Autopilot runs both back to back and records its choices in `state.decisions[]`:
175
-
176
- ```bash
177
- bash "$HOME/.copilot/lib/jira-family-write.sh" plan --state "$STATE_FILE" --dev-body "$F"
178
- bash "$HOME/.copilot/lib/jira-family-write.sh" apply --state "$STATE_FILE"
179
- ```
29
+ - **PR description**: Bitbucket uses a reviewer-preserving PUT built with `jq -n --rawfile`; every PUT includes `reviewers`, `fromRef`, `toRef`, `draft` (and `version`), or the server resets them. GitHub uses `gh pr edit --body-file`. Payload snippet and retry: `channels/pr.md`.
30
+ - **Jira comment**: PR link on line 1, then `h2. Geliştirme Özeti`, `h2. Test Senaryoları`, `h2. Etki Analizi`, `h2. Bağlantılar` in that order: never class names, file paths or a diff walk; the technical view stays in the PR. Template: `channels/jira.md`. Post through the publisher, never a hand-rolled `curl`:
180
31
 
181
- ### Confluence page
32
+ ```bash
33
+ bash "$HOME/.claude/lib/jira-publish.sh" --issue "$JIRA_ID" --body-file "$F" --target comment
34
+ ```
182
35
 
183
- 1. Token from `keychainMapping.confluence` via `~/.copilot/lib/credential-store.sh get` - missing→Token Save Flow from setup skill.
184
- 2. Parent page URL prompt; recent URLs from `prefs.projects[<project>].confluenceUrls` (LRU, max 5).
185
- 3. Extract `spaceKey` + `parentId` from URL.
186
- 4. Auto-suggest page title `"{jiraId} - {taskTitle}"`, editable.
187
- 5. POST `/rest/api/content` - humanizer'd storage-format body.
188
- 6. Save URL to prefs for next run.
36
+ Issue family (`state.jiraFamily` set): show every write from `jira-family/plan.json` as one multi-select, re-plan with `--skip` for deselected ids, then apply (`$HOME/.claude/multi-agent-refs/features/jira-family.md`):
189
37
 
190
- ### Wiki (component tasks only)
38
+ ```bash
39
+ bash "$HOME/.copilot/lib/jira-family-write.sh" plan --state "$STATE_FILE" --dev-body "$F"
40
+ bash "$HOME/.copilot/lib/jira-family-write.sh" apply --state "$STATE_FILE"
41
+ ```
191
42
 
192
- **Case A - preconditions met** (`taskType=component` + `wiki.enabled=true`): scope multi-select menu offers Main page / iOS sub-page / Screenshots / Index updates / Other. Adapter dispatches with selected scope.
43
+ - **Confluence page**: token from `keychainMapping.confluence` via `~/.copilot/lib/credential-store.sh get` (missing: Token Save Flow from the setup skill); parent page from recents or a pasted URL. Contract: `channels/confluence.md`.
44
+ - **Wiki** (component tasks only): Case A scope multi-select when `taskType=component` and `wiki.enabled=true`, otherwise the Case B menu in `refs/wiki-capture.md`. Contract: `channels/wiki.md`.
193
45
 
194
- **Case B - preconditions missing**: actionable menu - [1] setup Figma config, [2] skip this run, [3] disable forever, [4] manual note. Full contract in `refs/wiki-capture.md`.
46
+ ## Store compliance
195
47
 
196
- ## Output template (aggregated across selected content)
197
-
198
- ```markdown
199
- ### Analysis ← if "Normal analiz" selected
200
- {impact summary, risks - high-level}
201
-
202
- ### Technical Details ← if "Teknik analiz" selected
203
- #### Changes
204
- {Per changed-file-group, what changed + why - from Phase 2 dev log}
205
- #### Architecture
206
- {Structural decisions, pattern changes - from Phase 1 plan}
207
- #### Dependencies
208
- {New imports / frameworks / packages - from git diff --stat, or "None"}
209
-
210
- ### Root Cause ← if "Auto-diff" selected
211
- {single paragraph - from diff}
212
-
213
- - `path/to/File.ext → funcName`: {why it broke}
214
-
215
- ### Solution ← if "Auto-diff" selected
216
- - `path/to/File.ext:LINE-LINE` - {change, one line}
217
-
218
- ### Changed Files ← if "Auto-diff" selected
219
- | File | +/- |
220
- |------|-----|
221
- | `path/to/File.ext` | +N / -M |
222
-
223
- ### Test Scenarios ← if "Test senaryoları" OR "Auto-diff"
224
- **1. {what this scenario exercises}**
225
- 1. {step the tester performs}
226
- 2. **Expected:** {what they should see}
227
-
228
- **2. {regression scenario}**
229
- 1. {step}
230
- 2. **Expected:** {what should still behave as before}
231
-
232
- ### Test Koşumu ← if "Test Koşumu (Xray)" selected
233
- {`render-flow-run.mjs` output, unedited: Xray Test Execution, Test Set / Plan, run, results, one row per scenario. Read-only; a key the run history does not record is never written. Full contract: `channels/test-run.md`.}
234
-
235
- ### Notes ← if "Manuel not" selected
236
- {user message}
237
-
238
- ### Store compliance ← auto-appended if cached compliance report exists
239
- {summary line - see below}
240
-
241
- Ref: {jiraId}
242
- ```
243
-
244
- **Store compliance auto-augmentation:**
245
-
246
- After content sections are generated, check for cached compliance reports from recent `multi-agent-test "store-ready"` runs:
247
-
248
- ```bash
249
- find /tmp -maxdepth 1 \( -name 'archiveguard-*.json' -o -name 'play-compliance-*.json' \) \
250
- -newermt "-6 hours" -print 2>/dev/null | head -1
251
- ```
252
-
253
- If cached report exists AND any selected channel is PR / Jira / Confluence, append:
254
-
255
- | Blocker count | Output |
256
- |---|---|
257
- | `errors > 0` | `### Store compliance` + `⚠️ {N} blocker(s), {M} warning(s)` + per-blocker `- \`{ruleID}\` - {ref}: {message}` (cap 5 rows, rest `+N more`) |
258
- | `errors == 0, warnings > 0` | `### Store compliance` + `✅ No blockers. {M} warning(s) - see multi-agent-test "store-ready" for detail.` |
259
- | `errors == 0, warnings == 0` | Skip - don't pollute PR body |
260
-
261
- `ruleID` + policy ref stay verbatim (apple-archive-compliance / google-play-compliance catalog identifiers - no translation).
262
-
263
- If no cached report: skip silently. Augmentation, not a gate.
264
-
265
- Target length: < 80 lines (fits one screen). Auto-diff capped at 5 lines per section.
266
-
267
- ## Flags
268
-
269
- | Flag | Effect |
270
- |------|--------|
271
- | `--channels pr,jira,confluence,wiki` | Non-interactive channel selection. |
272
- | `--content normal,test,auto-diff,note,test-run` | Non-interactive content selection. |
273
- | `--flow-run <runId>[,<runId>...]` | Runs reported by the Test Koşumu (Xray) block; wins over `state.evidence.flowRuns[]` and discovery. |
274
- | `--message "..."` | Manual mode - user text as source. Forces `content=note`. |
275
- | `--message-file path` | Manual mode, long message from file. |
276
- | `--append` | PR description: append instead of replace. |
277
- | `--dry-run` | Generate + print, no POST. |
278
- | `--lang=tr\|en\|both` | Output language override (default: `en`; `promptLanguage` is locked to `en`). |
279
- | `--ready` | If PR draft, promote to READY after dispatch. |
48
+ After the content sections, a cached `archiveguard-*.json` or `play-compliance-*.json` report from the last 6 hours appends a `### Store compliance` block when a PR / Jira / Confluence channel is selected; none found: skip silently. Augmentation, not a gate. Table and wording: `channels/generator.md`.
280
49
 
281
50
  ## Required rules
282
51
 
283
- - Bitbucket reviewer preservation - every PR PUT MUST carry current `reviewers`, `fromRef`, `toRef`, `draft`.
284
- - Default is **replace** (not append) for PR description; `--append` opt-in.
285
- - Real newlines + no HTML entities in ALL bodies (Jira, Confluence, PR).
286
- - Humanizer per-channel - each body runs humanizer independently (tones differ).
287
- - No markers - full replace each run, no `<!-- channels:start -->` bookmarks.
288
- - Every body item references a file/symbol/line from diff or pipeline log. No generic sentences.
289
- - Adapter failures are non-blocking - one channel failing does NOT abort others.
290
- - Approval before post - interactive runs never write to an external channel without the step 6 preview + approval. Autopilot and `--dry-run` are the only bypasses.
291
-
292
- ## Error handling
293
-
294
- | Condition | Behavior |
295
- |-----------|----------|
296
- | No target resolvable | Error, exit 1 |
297
- | PR not found + Jira selected | Proceed Jira-only, log reason |
298
- | PR merged/closed | Warn, confirm continue |
299
- | Author bot / dependabot | Skip entire run |
300
- | Diff > 2 MB | Ask: skip / top-20-files / cancel |
301
- | No pipeline log + Normal analiz selected | Greyed at menu; error if `--content` forces it |
302
- | Bitbucket version mismatch | Refetch once, retry; fail on second |
303
- | Jira token missing/expired | Token Save Flow inline; skip on user-skip |
304
- | Wiki preconditions not met | Case B menu per `refs/wiki-capture.md` |
305
-
306
- ## Phase 5 delegation contract
307
-
308
- Phase 5 builds a state bundle and invokes this skill internally. Responsibilities:
309
-
310
- | Who | What |
311
- |---|---|
312
- | Phase 5 | Progress tracker (3 sub-steps), agent-log finalization, knowledge+memory capture, telemetry emission |
313
- | `multi-agent-channels` | All external delivery: PR description update, Jira comment, Confluence page, Wiki pages |
314
-
315
- **State bundle** passed from Phase 5:
316
- ```json
317
- {
318
- "jiraId": "PROJ-12345",
319
- "prUrl": "https://.../pull/42",
320
- "remoteType": "github" | "bitbucket",
321
- "taskType": "component" | "bugfix" | "feature" | "refactor",
322
- "figmaConfig": { /* or null */ },
323
- "agentState": { /* agent-state.json */ },
324
- "pipelineLogPath": "$HOME/.claude/logs/multi-agent/...",
325
- "invokedFrom": "phase-5"
326
- }
327
- ```
328
-
329
- **Autopilot pause contract:** Phase 5 ALWAYS pauses at the channels menu - 30-min timeout → session ends cleanly → resumable via `/multi-agent:resume`. Full contract in `refs/phases/modes.md` + `refs/phases/phase-5-report.md`.
330
-
331
- **Unattended (`MULTI_AGENT_UNATTENDED=1`): channels posts nothing.** A run nobody watches does not call it: Phase 5 skips Step 1 and records `step1.status = "deferred-to-runner"`, and a direct invocation stops before the menu with that status. After the run exits the autopilot runner verifies `pr-request.json`, pushes, opens the draft PR, and only then, when `~/.claude/autopilot/config.json` sets `reportChannels: true`, runs channels itself with the `channels.mode` / `channels.targets` selection from that file. Without the opt-in nothing beyond the draft PR is published. The guard enforces it: every publisher script and every `gh` / `curl` write is blocked under the variable. Contract: `$HOME/.claude/multi-agent-refs/features/unattended-security.md`.
332
-
333
- ## Cross-CLI parity
334
-
335
- Prompts MUST be byte-identical between Claude and Copilot. `smoke-cross-cli-behavior.sh` asserts spacing, brackets, numbering, log-line format.
336
-
337
- Progress emission on Copilot (no native TaskCreate UI):
338
-
339
- ```bash
340
- bash ~/.copilot/scripts/phase-tracker.sh sub 5 1 "Channels dispatch" in_progress
341
- # ... adapter runs ...
342
- bash ~/.copilot/scripts/phase-tracker.sh sub 5 1 "Channels dispatch" completed
343
- ```
344
-
345
- Same shape as Phase 5 sub-step tracking.
52
+ - Bitbucket reviewer preservation: every PR PUT carries current `reviewers`, `fromRef`, `toRef`, `draft`.
53
+ - Default is **replace** for the PR description; `--append` opt-in.
54
+ - Real newlines + no HTML entities in every body.
55
+ - Humanizer per channel; no `<!-- channels:start -->` markers; every body item cites a file / symbol / line.
56
+ - Adapter failures are non-blocking.
57
+ - Approval before post: autopilot and `--dry-run` are the only bypasses.
58
+ - Target length under 80 lines; auto-diff capped at 5 lines per section.
346
59
 
347
- ## Examples
60
+ ## Autopilot and unattended
348
61
 
349
- ```
350
- multi-agent-channels
351
- → resolves from cwd+branch → PROJ-12345 + PR #3433
352
- → menu: PR ✓ Jira ✓ / Normal analiz ✓ Test senaryoları ✓
353
- → PR description replaced (v3→4, 23 reviewers preserved)
354
- → Jira comment posted (id 2484780)
62
+ Phase 5 always pauses at the channels menu: a 30-min timeout ends the session cleanly, resumable via `/multi-agent:resume` (`refs/phases/modes.md`).
355
63
 
356
- multi-agent-channels PROJ-12345 --channels confluence --content note --message-file notes.md
357
- → non-interactive: only Confluence, content from notes.md
358
- → asks: parent page URL (or recent [1] / [2])
359
- → page created → https://<host>/pages/12345
64
+ **Unattended (`MULTI_AGENT_UNATTENDED=1`): channels posts nothing.** Phase 5 records `step1.status = "deferred-to-runner"`, and a direct invocation stops before the menu with that status. The autopilot runner publishes only through its own opt-in, and the guard blocks every publisher script and `gh` / `curl` write under the variable. Contract: `$HOME/.claude/multi-agent-refs/features/unattended-security.md`.
360
65
 
361
- multi-agent-channels https://<bitbucket>/.../pull-requests/42 --dry-run
362
- → resolves → PROJ-67890
363
- → prints Jira + PR body preview to stdout, no POST
66
+ ## Progress on Copilot
364
67
 
365
- multi-agent-channels --message "root: order id empty, UI silent. fix: length>0 guard in HomeVC.m"
366
- → auto-diff from cwd+branch PR + user note combined
367
- → posts to default channels (PR + Jira)
368
- ```
68
+ No native TaskCreate UI: `bash ~/.copilot/scripts/phase-tracker.sh sub 5 1 "Channels dispatch" in_progress`, then `completed` after the adapters run.