@mmerterden/multi-agent-pipeline 20.25.0 → 20.26.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 +18 -0
- package/README.md +6 -7
- package/README.tr.md +6 -7
- package/docs/architecture.md +3 -3
- package/docs/ecosystem.md +5 -5
- package/docs/facts.json +4 -5
- package/install/catalog-history.json +1 -1
- package/manifest.json +36 -37
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/channels/SKILL.md +4 -2
- package/pipeline/commands/multi-agent/sync/SKILL.md +3 -3
- package/pipeline/lib/_jira-auth.sh +3 -1
- package/pipeline/lib/jira-family-write.sh +339 -0
- package/pipeline/lib/jira-publish.sh +28 -1
- package/pipeline/multi-agent-refs/channels/jira.md +2 -0
- package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
- package/pipeline/multi-agent-refs/features/jira-family.md +175 -0
- package/pipeline/multi-agent-refs/help/en.md +0 -1
- package/pipeline/multi-agent-refs/help/tr.md +0 -1
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +3 -1
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +0 -2
- package/pipeline/schemas/agent-state.schema.json +36 -5
- package/pipeline/schemas/phases.json +0 -4
- package/pipeline/schemas/prefs.schema.json +23 -23
- package/pipeline/scripts/jira-family.mjs +947 -0
- package/pipeline/scripts/jira-wiki-escape.mjs +3 -3
- package/pipeline/skills/.skill-manifest.json +5 -9
- package/pipeline/skills/.skills-index.json +1 -12
- package/pipeline/skills/shared/README.md +3 -4
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +5 -0
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
- package/pipeline/skills/skills-index.md +1 -2
- package/pipeline/commands/multi-agent/deps/SKILL.md +0 -61
- package/pipeline/multi-agent-refs/features/dep-bump.md +0 -176
- package/pipeline/scripts/dep-bump.mjs +0 -1556
- package/pipeline/skills/shared/core/multi-agent-deps/SKILL.md +0 -60
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
import { invokedDirectly } from "../lib/invoked-directly.mjs";
|
|
4
5
|
|
|
5
6
|
const SEQUENCES = [
|
|
6
7
|
":)",
|
|
@@ -118,8 +119,7 @@ async function readStdin() {
|
|
|
118
119
|
return Buffer.concat(chunks).toString("utf8");
|
|
119
120
|
}
|
|
120
121
|
|
|
121
|
-
|
|
122
|
-
if (isMain) {
|
|
122
|
+
if (invokedDirectly(import.meta.url)) {
|
|
123
123
|
const args = process.argv.slice(2);
|
|
124
124
|
const check = args.includes("--check");
|
|
125
125
|
const file = args.find((a) => !a.startsWith("--"));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
4
|
-
"skillCount":
|
|
3
|
+
"generatedAt": "2026-10-14T16:29:25Z",
|
|
4
|
+
"skillCount": 229,
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"path": "shared/core/apple-archive-compliance/SKILL.md",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"path": "shared/core/multi-agent-channels/SKILL.md",
|
|
52
|
-
"sha256": "
|
|
52
|
+
"sha256": "cb5e1f9e82f3fd3e7d9ad20bff7a066cafff75323044a08726e3af368738b123"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"path": "shared/core/multi-agent-complaint-analysis/SKILL.md",
|
|
@@ -59,10 +59,6 @@
|
|
|
59
59
|
"path": "shared/core/multi-agent-create-jira/SKILL.md",
|
|
60
60
|
"sha256": "5aad0d841e9e5b7140bb441e07819209ca64c5b6fc209d6ad586b5fbb353e377"
|
|
61
61
|
},
|
|
62
|
-
{
|
|
63
|
-
"path": "shared/core/multi-agent-deps/SKILL.md",
|
|
64
|
-
"sha256": "1c583a47a1c1d66f37a581f0436861e511d1272b5014e1bd15397a4b4d6a8553"
|
|
65
|
-
},
|
|
66
62
|
{
|
|
67
63
|
"path": "shared/core/multi-agent-design-check/SKILL.md",
|
|
68
64
|
"sha256": "8888744fa52e935f53db9a1068e1b18c636b6c9d55b084dabfc19b9ae68bf6f8"
|
|
@@ -241,7 +237,7 @@
|
|
|
241
237
|
},
|
|
242
238
|
{
|
|
243
239
|
"path": "shared/core/multi-agent-sync/SKILL.md",
|
|
244
|
-
"sha256": "
|
|
240
|
+
"sha256": "1e418fe472a93cc7b4b5bc19ff9e9b8b9d89b545e45d343a643f17a492cb0624"
|
|
245
241
|
},
|
|
246
242
|
{
|
|
247
243
|
"path": "shared/core/multi-agent-test-accessibility/SKILL.md",
|
|
@@ -277,7 +273,7 @@
|
|
|
277
273
|
},
|
|
278
274
|
{
|
|
279
275
|
"path": "shared/core/multi-agent/SKILL.md",
|
|
280
|
-
"sha256": "
|
|
276
|
+
"sha256": "079b49a1981c63d90798089a343b7f324571c4f7cc6ad3fb757e82719c35eb0a"
|
|
281
277
|
},
|
|
282
278
|
{
|
|
283
279
|
"path": "shared/external/accessibility-compliance-accessibility-audit/SKILL.md",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"skillCount":
|
|
3
|
+
"skillCount": 229,
|
|
4
4
|
"entries": [
|
|
5
5
|
{
|
|
6
6
|
"name": "accessibility-compliance-accessibility-audit",
|
|
@@ -1146,17 +1146,6 @@
|
|
|
1146
1146
|
"triggerPaths": [],
|
|
1147
1147
|
"relativePath": "shared/core/multi-agent-create-jira/SKILL.md"
|
|
1148
1148
|
},
|
|
1149
|
-
{
|
|
1150
|
-
"name": "multi-agent-deps",
|
|
1151
|
-
"description": "Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when a library needs updating.",
|
|
1152
|
-
"platform": null,
|
|
1153
|
-
"group": "core",
|
|
1154
|
-
"plugin": null,
|
|
1155
|
-
"invokeAs": "multi-agent-deps",
|
|
1156
|
-
"triggerKeywords": [],
|
|
1157
|
-
"triggerPaths": [],
|
|
1158
|
-
"relativePath": "shared/core/multi-agent-deps/SKILL.md"
|
|
1159
|
-
},
|
|
1160
1149
|
{
|
|
1161
1150
|
"name": "multi-agent-design-check",
|
|
1162
1151
|
"description": "Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module, gate on mock support, enumerate every state driver into a countable target set, build Debug in a worktree, launch in mock mode, fetch Figma variants, compare each pixel + px-spacing + typography + color, and export a si",
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Single source of truth for skills delivered to both Claude Code (`~/.claude/skills/`) and Copilot CLI (`~/.copilot/skills/`) by the installer.
|
|
4
4
|
|
|
5
|
-
**Total:**
|
|
5
|
+
**Total:** 229 skills (68 core + 161 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
|
|
6
6
|
|
|
7
7
|
## Directory layout
|
|
8
8
|
|
|
9
|
-
- **`core/`** -
|
|
9
|
+
- **`core/`** - 68 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
|
|
10
10
|
- **`external/`** - 161 iOS / Android / generic skills that ship into the stack plugins. Each names its origin in `metadata.source`: `multi-agent-pipeline` when written here, or the upstream and license a `NOTICE-*.md` in this directory covers.
|
|
11
11
|
- Install destinations (ADR-0009): Claude Code gets NO local copy of `external/` - it loads those skills from the `multi-agent-plugins` marketplace, namespaced (`ai-<stack>-toolkit:<name>`); only the two compliance catalogs from `core/` land in `~/.claude/skills/`. Copilot CLI and Codex CLI receive a flat copy filtered to the enabled stacks. `external/` remains the single authoring source that `build-stack-plugins.mjs` publishes from.
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
|
|
|
14
14
|
|
|
15
15
|
## Categories
|
|
16
16
|
|
|
17
|
-
- [Pipeline Orchestration](#pipeline-orchestration) -
|
|
17
|
+
- [Pipeline Orchestration](#pipeline-orchestration) - 68
|
|
18
18
|
- [iOS / Apple Ecosystem](#ios-apple-ecosystem) - 94
|
|
19
19
|
- [Android / Kotlin](#android-kotlin) - 16
|
|
20
20
|
- [Web](#web) - 10
|
|
@@ -40,7 +40,6 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
|
|
|
40
40
|
| [`multi-agent-channels`](./core/multi-agent-channels/) | `core` | Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbuck |
|
|
41
41
|
| [`multi-agent-complaint-analysis`](./core/multi-agent-complaint-analysis/) | `core` | Customer-complaint triage. Ingests complaints (paste, csv/xlsx/txt/json file, Jira issue, Confluence URL), fetches Graylog evidence per trx/ |
|
|
42
42
|
| [`multi-agent-create-jira`](./core/multi-agent-create-jira/) | `core` | Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with |
|
|
43
|
-
| [`multi-agent-deps`](./core/multi-agent-deps/) | `core` | Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when |
|
|
44
43
|
| [`multi-agent-design-check`](./core/multi-agent-design-check/) | `core` | Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module, gate on mock support, enumerate every state driver into a c |
|
|
45
44
|
| [`multi-agent-diff-explain`](./core/multi-agent-diff-explain/) | `core` | Map Phase 3 triage findings to branch diff lines. Read-only post-hoc command, used after review to answer 'which finding lines up with which |
|
|
46
45
|
| [`multi-agent-doctor`](./core/multi-agent-doctor/) | `core` | Health check for the installed pipeline: layout, preferences, credentials, hooks and host capabilities, each with one actionable step. Exit |
|
|
@@ -203,6 +203,11 @@ Per-project input parsing (my-ios-app / my-figma-app / generic), worktree creati
|
|
|
203
203
|
|
|
204
204
|
**IMPORTANT**: Update `agent-state.json` at EVERY phase transition. This file is the resume source of truth.
|
|
205
205
|
|
|
206
|
+
**Issue family** (Jira input, once `agent-state.json` exists): run
|
|
207
|
+
`bash "$HOME/.copilot/lib/jira-family-write.sh" resolve --state "$STATE_FILE"`. It records the
|
|
208
|
+
story, dev and test sub-tasks and the story format check in `state.jiraFamily`, and asks and writes nothing;
|
|
209
|
+
the channels Jira step writes to them.
|
|
210
|
+
|
|
206
211
|
### Phase 1: Plan
|
|
207
212
|
Two halves, one phase, one approval gate.
|
|
208
213
|
|
|
@@ -169,6 +169,13 @@ argv. Jira turns `:)` `(x)` `(!)` `(/)` into emoticon images, including inside
|
|
|
169
169
|
`{{monospace}}`; an escape that has to be remembered is one that is eventually
|
|
170
170
|
forgotten, and that is how the selector above shipped.
|
|
171
171
|
|
|
172
|
+
**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[]`:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
bash "$HOME/.copilot/lib/jira-family-write.sh" plan --state "$STATE_FILE" --dev-body "$F"
|
|
176
|
+
bash "$HOME/.copilot/lib/jira-family-write.sh" apply --state "$STATE_FILE"
|
|
177
|
+
```
|
|
178
|
+
|
|
172
179
|
### Confluence page
|
|
173
180
|
|
|
174
181
|
1. Token from `keychainMapping.confluence` via `~/.copilot/lib/credential-store.sh get` - missing→Token Save Flow from setup skill.
|
|
@@ -33,7 +33,7 @@ Run all steps automatically:
|
|
|
33
33
|
```
|
|
34
34
|
Step 0: DOCTOR node $HOME/.claude/scripts/doctor.mjs - exit 2 or 4 STOPS the sync
|
|
35
35
|
Step 1: DETECT Compare timestamps, find stale targets
|
|
36
|
-
Step 2: COPILOT Claude Code -> Copilot CLI (instructions +
|
|
36
|
+
Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 65 sub-command skills)
|
|
37
37
|
Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + sub-command specs as refs + agent TOML)
|
|
38
38
|
Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
|
|
39
39
|
Step 3d: DEV-TOOLKIT Companion MCP server -> detect movement, ship gates, commit + publish
|
|
@@ -229,12 +229,12 @@ When invoked with the `release` argument:
|
|
|
229
229
|
|-------------|-------------|
|
|
230
230
|
| `~/.claude/commands/multi-agent/{cmd}/SKILL.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
|
|
231
231
|
|
|
232
|
-
**
|
|
232
|
+
**65 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
|
|
233
233
|
|
|
234
234
|
```
|
|
235
235
|
analysis, analysis-jira, analysis-resolve, autopilot, autopilot-off,
|
|
236
236
|
autopilot-on, autopilot-status, bug-bash, build-optimize, channels, complaint-analysis,
|
|
237
|
-
create-jira,
|
|
237
|
+
create-jira, design-check, diff-explain, doctor, estimate, feedback, forget,
|
|
238
238
|
garbage-collect, graph, help, ios-coding-standard, issue, jira, kill,
|
|
239
239
|
language, log, manual-test, model, postmortem, prune-logs,
|
|
240
240
|
prune-prompts, purge, refactor, research, resume, review,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Auto-generated by `pipeline/scripts/build-skills-index.mjs` - do not hand-edit.
|
|
4
4
|
> Regenerate with `node pipeline/scripts/build-skills-index.mjs`.
|
|
5
5
|
|
|
6
|
-
**
|
|
6
|
+
**229 skills** across 2 groups.
|
|
7
7
|
|
|
8
8
|
| Group | Name | Platform | Description |
|
|
9
9
|
|-------|------|----------|-------------|
|
|
@@ -111,7 +111,6 @@
|
|
|
111
111
|
| core | `multi-agent-channels` | - | Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbuck |
|
|
112
112
|
| core | `multi-agent-complaint-analysis` | - | Customer-complaint triage. Ingests complaints (paste, csv/xlsx/txt/json file, Jira issue, Confluence URL), fetches Graylog evidence per trx/ |
|
|
113
113
|
| core | `multi-agent-create-jira` | - | Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with |
|
|
114
|
-
| core | `multi-agent-deps` | - | Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when |
|
|
115
114
|
| core | `multi-agent-design-check` | - | Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module, gate on mock support, enumerate every state driver into a c |
|
|
116
115
|
| core | `multi-agent-diff-explain` | - | Map Phase 3 triage findings to branch diff lines. Read-only post-hoc command, used after review to answer 'which finding lines up with which |
|
|
117
116
|
| core | `multi-agent-doctor` | - | Health check for the installed pipeline: layout, preferences, credentials, hooks and host capabilities, each with one actionable step. Exit |
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when a library needs updating."
|
|
3
|
-
description-tr: "Tek bağımlılığı yükseltir, yalnızca yükseltmenin kırdığını düzeltir, review edip PR açar; düzeltme turu sınırında geri alır. SwiftPM, Gradle, npm, pip. Bir kütüphaneyi güncellemek için kullanılır."
|
|
4
|
-
argument-hint: "[package[@version]] [--major] - no package opens a picker over the outdated candidates; --major allows a breaking bump"
|
|
5
|
-
parameters: [{"name":"package","kind":"text"},{"name":"--major","kind":"flag"}]
|
|
6
|
-
gui: form
|
|
7
|
-
destructive: false
|
|
8
|
-
confirm: none
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# multi-agent deps - bump one dependency and fix what it broke
|
|
12
|
-
|
|
13
|
-
> **Pickers follow** `$HOME/.claude/multi-agent-refs/picker-contract.md`: never a one-option call, and branch on the option selected, not on its text.
|
|
14
|
-
|
|
15
|
-
**Input**: $ARGUMENTS
|
|
16
|
-
|
|
17
|
-
> **Language (read FIRST)**: read `prefs.global.outputLanguage` and render every conversational line in it. `AskUserQuestion` renders `question`, option `label`s and `description`s in `outputLanguage`; only `header` stays English (<=12-char chip). Commit messages and branch names stay English. Full contract: `$HOME/.claude/multi-agent-refs/rules.md` "Language Application".
|
|
18
|
-
|
|
19
|
-
The normal pipeline with a fixed task. Read `$HOME/.claude/multi-agent-refs/features/dep-bump.md` first: it is the contract for every step below (run shape, scope rule, rollback). `dep-bump.mjs` does every deterministic step; never edit a version string or a lockfile by hand.
|
|
20
|
-
|
|
21
|
-
## Steps
|
|
22
|
-
|
|
23
|
-
1. **Repo and settings.** Resolve the repo as `/multi-agent` does for a free-text task (`_account-picker.md`, `_repo-picker.md`). Then:
|
|
24
|
-
```bash
|
|
25
|
-
node "$HOME/.claude/scripts/dep-bump.mjs" config # depBump.maxFixRounds, depBump.queryRegistry
|
|
26
|
-
node "$HOME/.claude/scripts/dep-bump.mjs" detect --dir "$REPO"
|
|
27
|
-
```
|
|
28
|
-
No ecosystem detected: say so and stop.
|
|
29
|
-
|
|
30
|
-
2. **Candidates.**
|
|
31
|
-
```bash
|
|
32
|
-
node "$HOME/.claude/scripts/dep-bump.mjs" list --dir "$REPO" [--registry] # --registry when queryRegistry is true
|
|
33
|
-
```
|
|
34
|
-
Show `registry.note` and every per-package `note`: an offline listing is reported as offline, never as "nothing outdated".
|
|
35
|
-
- `package@version` given: use it. `package` alone: its `latestInMajor`, else `latest`. Not in the list: stop with the manifests that were read.
|
|
36
|
-
- No package: a single-select picker over the candidates with a newer version, non-breaking first, each option `name current -> target (risk)`. Two or more options per the picker contract; one candidate is confirmed with a yes/no, none means report "nothing newer found" with the registry note.
|
|
37
|
-
|
|
38
|
-
3. **Major gate.** Risk `major` or `unknown`, or a prerelease target (`prerelease: true`), needs `--major` in the input or an explicit confirmation naming the versions (`Bump anyway` / `Take {latestInMajor} instead` when one exists / `Cancel`). An autopilot run without `--major` takes `latestInMajor` or stops.
|
|
39
|
-
|
|
40
|
-
4. **Run the pipeline** with `state.mode = "deps"`, `state.taskType = "chore"`, the free-text task `chore(deps): bump {name} from {current} to {target}` and the branch `chore/deps-{name}-{target}` (kebab rules from Phase 0 Step 4). Phase 0 intake, worktree and tracker run as in `/multi-agent`. Then:
|
|
41
|
-
- **Phase 1**: the fixed plan from the feature doc, with the changelog excerpt as evidence:
|
|
42
|
-
```bash
|
|
43
|
-
node "$HOME/.claude/scripts/dep-bump.mjs" notes --dir "$WORKTREE" --ecosystem E --name N --from A --to B
|
|
44
|
-
```
|
|
45
|
-
- **Phase 2**: apply first, then the exit gate as written:
|
|
46
|
-
```bash
|
|
47
|
-
node "$HOME/.claude/scripts/dep-bump.mjs" apply --dir "$WORKTREE" --ecosystem E --name N --to B [--allow-major]
|
|
48
|
-
```
|
|
49
|
-
Exit 1: report `error` and `lock.output` (or `dirty`: the worktree had uncommitted changes), stop with nothing to commit. Persist the output to `state.depBump`. Green: no dev agent, on to Phase 3. Red: fix rounds, at most `depBump.maxFixRounds`, each dispatched with the failing log tail, `surface` output, the changelog excerpt and the scope rule (feature doc section 4); after each round:
|
|
50
|
-
```bash
|
|
51
|
-
node "$HOME/.claude/scripts/dep-bump.mjs" scope --dir "$WORKTREE" --log "$GATE_LOG" # the round's build/test log
|
|
52
|
-
```
|
|
53
|
-
Only the surface recorded by `apply` is in scope. A file listed in `newImporters` with `cited: null` started importing the dependency without an error line behind it: revert it before the next round.
|
|
54
|
-
- **Cap reached and still red** (or still out of scope): `dep-bump.mjs rollback --dir "$WORKTREE"` (restores the manifest, lockfile and fix files; anything under `kept` is reported, not discarded), set `state.depBump.rolledBack = true`, and end with the report from feature doc section 5. No commit, no push, no PR.
|
|
55
|
-
- **Phase 3**: standard review. Each `outOfScope` file without a cited error line, and each `newImporters` entry with `cited: null`, is a blocking finding.
|
|
56
|
-
- **Phase 4**: commit with `commitMessage` from `apply` (plus ` [{jiraId}]` when present). PR body per the feature doc; `Ref:` or `Related:`, never `Closes`, `Fixes` or `Resolves`, and never close an issue.
|
|
57
|
-
- **Phase 5**: channels as in every mode.
|
|
58
|
-
|
|
59
|
-
## Report
|
|
60
|
-
|
|
61
|
-
In `outputLanguage`, at most 10 lines: the dependency, from and to, risk, lockfile command and result, rounds taken against the cap, files changed (in scope / justified), review verdict, and the PR URL or the rollback reason.
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
# Feature: Dependency Bump and Fix
|
|
2
|
-
|
|
3
|
-
<!-- toc -->
|
|
4
|
-
- [1. Shape of a run](#1-shape-of-a-run)
|
|
5
|
-
- [2. The script](#2-the-script)
|
|
6
|
-
- [3. What each phase does](#3-what-each-phase-does)
|
|
7
|
-
- [4. Scope of a fix round](#4-scope-of-a-fix-round)
|
|
8
|
-
- [5. Rollback](#5-rollback)
|
|
9
|
-
- [6. Settings](#6-settings)
|
|
10
|
-
- [7. Never](#7-never)
|
|
11
|
-
<!-- /toc -->
|
|
12
|
-
|
|
13
|
-
**Pattern**: bump one dependency, build and test, and when the bump breaks
|
|
14
|
-
something, fix only that breakage. A bump PR that also refactors, reformats or
|
|
15
|
-
"while I was here" fixes unrelated code cannot be reviewed as a bump, and a fix
|
|
16
|
-
loop with no cap turns a version bump into an open-ended rewrite.
|
|
17
|
-
|
|
18
|
-
Entry: `/multi-agent:deps [package[@version]] [--major]`. It is the normal
|
|
19
|
-
pipeline with a fixed task, not a second flow: same Phase 0 intake, worktree,
|
|
20
|
-
branch rules, Phase 2 dev agent and exit gate, Phase 3 review gates, Phase 4
|
|
21
|
-
commit and PR rules, Phase 5 channels.
|
|
22
|
-
|
|
23
|
-
## 1. Shape of a run
|
|
24
|
-
|
|
25
|
-
| Field | Value |
|
|
26
|
-
|---|---|
|
|
27
|
-
| `state.mode` | `"deps"` |
|
|
28
|
-
| `state.taskType` | `chore` |
|
|
29
|
-
| Branch | `chore/deps-{kebab(name)}-{kebab(to)}`, kebab and collision rules from Phase 0 Step 4 |
|
|
30
|
-
| Commit | `chore(deps): bump {name} from {from} to {to}`, taken verbatim from `dep-bump.mjs apply` (`commitMessage`), plus ` [{jiraId}]` when the run carries one |
|
|
31
|
-
| PR body | the bump, its risk, the lockfile command, `alsoMoves`, the changelog excerpt, each fix and the error line it answers; `Ref:` / `Related:`, never `Closes` / `Fixes` / `Resolves` |
|
|
32
|
-
| `state.depBump` | the apply output plus `rounds`, `scope` and, on rollback, `rolledBack` and `stillFailing` |
|
|
33
|
-
|
|
34
|
-
## 2. The script
|
|
35
|
-
|
|
36
|
-
`$HOME/.claude/scripts/dep-bump.mjs` owns every deterministic step; the model
|
|
37
|
-
never edits a version string by hand. JSON on stdout.
|
|
38
|
-
|
|
39
|
-
| Command | Does |
|
|
40
|
-
|---|---|
|
|
41
|
-
| `detect --dir D` | Ecosystems and manifests: SwiftPM `Package.swift`, Gradle `gradle/*.versions.toml`, npm `package.json`, pip `requirements*.txt` / `pyproject.toml`, each with its lockfile |
|
|
42
|
-
| `list --dir D [--registry]` | Candidates: `current` (lockfile, else declared), `latest`, `latestInMajor` (highest non-breaking), `risk`, `riskInMajor`, `source` |
|
|
43
|
-
| `apply --dir D --ecosystem E --name N --to V [--allow-major]` | One bump: manifest edit plus the lockfile through the ecosystem tool; writes `.pipeline/dep-bump.json` |
|
|
44
|
-
| `surface --dir D --ecosystem E --name N` | Files that import or reference the dependency |
|
|
45
|
-
| `scope --dir D [--log L]` | Files changed since the recorded base, split into `inScope` (manifest, lockfile and the surface recorded at apply), `newImporters` and `outOfScope`; exit 1 when anything is out of scope or a new importer has no cited error line |
|
|
46
|
-
| `notes --dir D --ecosystem E --name N --from A --to B` | The local changelog sections between the two versions, else the repository URL to read release notes from |
|
|
47
|
-
| `rollback --dir D` | Restores what the bump owns (manifest, lockfile, the files `scope` saw the fix touch in scope) from the recorded base and removes those the base lacks; every other change is left in place and listed under `kept` |
|
|
48
|
-
| `config` | The resolved `depBump.*` settings |
|
|
49
|
-
|
|
50
|
-
SwiftPM identities compare case-insensitively (`--name Alamofire` and
|
|
51
|
-
`alamofire` are one package). The surface covers every module name the package
|
|
52
|
-
is imported under: the identity, the repository name in the url, the products
|
|
53
|
-
named by `.product(name:package:)` and by-name target dependencies in the
|
|
54
|
-
package manifests. Packages an Xcode project adds through File > Packages keep
|
|
55
|
-
their pins in `*.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved`
|
|
56
|
-
or `*.xcworkspace/xcshareddata/swiftpm/Package.resolved` and their requirement
|
|
57
|
-
in `project.pbxproj`. `detect` and `list` report them with `readOnly: true` and
|
|
58
|
-
a note; `apply` refuses them (exit 1), because dep-bump does not edit
|
|
59
|
-
`project.pbxproj`. Such a bump is made in Xcode.
|
|
60
|
-
|
|
61
|
-
For Gradle the surface is the build scripts that name the catalog alias and
|
|
62
|
-
the Kotlin and Java files whose imports start at the Maven group
|
|
63
|
-
(`com.google.code.gson`), the artifact id or the alias stem, each with an
|
|
64
|
-
optional major suffix (`okhttp3` for `com.squareup.okhttp3:okhttp`, `retrofit2`
|
|
65
|
-
for `retrofit`). A library whose package root is none of these (Gson's
|
|
66
|
-
`com.google.gson`) is not found by `surface`, so a fix in such a file is out of
|
|
67
|
-
scope and needs the error line that names it, cited per file (section 4).
|
|
68
|
-
|
|
69
|
-
Offline listing reads what is already on disk: the lockfile for the current
|
|
70
|
-
version, SwiftPM `.build/checkouts/<id>` tags and the Gradle module cache for
|
|
71
|
-
newer ones. `--registry` asks the ecosystem's own tool (`npm view`,
|
|
72
|
-
`git ls-remote --tags`, Maven or PyPI metadata over `curl`); a failed query is
|
|
73
|
-
a `note` on that package, never a failed listing. Registry and lockfile tools
|
|
74
|
-
run in the manifest's directory (a workspace member's lockfile tool in the
|
|
75
|
-
workspace root), so the repo's own `.npmrc` registries and scopes apply. A
|
|
76
|
-
name or url that does not fit its ecosystem's grammar (a url that is not
|
|
77
|
-
http(s), ssh, git, file or `git@host:`, a name starting with `-`) is never
|
|
78
|
-
passed to a tool; the package gets a `registry query skipped` note.
|
|
79
|
-
|
|
80
|
-
Risk follows semver: a major step is breaking, and so is a minor step under
|
|
81
|
-
`0.x` and any step under `0.0.x`. `+build` metadata is ignored, and for Gradle
|
|
82
|
-
a Maven release qualifier (`-jre`, `-android`, `.Final`, `-RELEASE`, `.GA`,
|
|
83
|
-
`.SP1`) is part of a stable version, not a prerelease. A version that does not
|
|
84
|
-
parse is `unknown` and is treated as major, and so is a prerelease target.
|
|
85
|
-
`apply` exits 3 on a major, unknown or prerelease bump without `--allow-major`,
|
|
86
|
-
and touches nothing.
|
|
87
|
-
|
|
88
|
-
A pip requirement with several clauses (`foo>=1.0,<2.0`) is bumped on its
|
|
89
|
-
primary clause, the first `==`, `===`, `~=`, `>=` or `>`; `<`, `<=` and `!=`
|
|
90
|
-
are never primary, and a requirement made only of them is not listed. When
|
|
91
|
-
another clause would exclude the target (`<2.0` against `2.1`), `apply` exits 1
|
|
92
|
-
and changes nothing: rewriting a bound the repo set is a decision, not part of
|
|
93
|
-
the bump.
|
|
94
|
-
|
|
95
|
-
`apply` refuses a worktree with uncommitted changes to tracked files (exit 1,
|
|
96
|
-
`dirty` lists them), so the base it records holds no work of anyone else's.
|
|
97
|
-
|
|
98
|
-
`apply` is atomic. When the lockfile tool fails, the manifest and the lockfile
|
|
99
|
-
are restored byte for byte and the tool's output tail is in `lock.output`.
|
|
100
|
-
Lockfile tools: `swift package resolve`, `./gradlew dependencies --write-locks`
|
|
101
|
-
(only with a `gradle.lockfile`), the resolved npm-family manager with scripts
|
|
102
|
-
disabled (`package-manager.mjs`; yarn 2 and later take `--mode=skip-build`, yarn
|
|
103
|
-
1 `--ignore-scripts`), `poetry lock` on Poetry 2 and `poetry lock --no-update`
|
|
104
|
-
before it, `uv lock --upgrade-package`. A workspace member's lockfile is the
|
|
105
|
-
workspace root's (the nearest directory above it with a lockfile and a
|
|
106
|
-
`workspaces` field or `pnpm-workspace.yaml`), and the tool runs there; a
|
|
107
|
-
lockfile above the manifest in a directory that declares no workspaces fails
|
|
108
|
-
the bump rather than letting it go ahead with no lockfile. Membership is not
|
|
109
|
-
matched against the `workspaces` globs. A shared Gradle `version.ref` moves every module bound to
|
|
110
|
-
it; `alsoMoves` names them and they join the surface.
|
|
111
|
-
|
|
112
|
-
## 3. What each phase does
|
|
113
|
-
|
|
114
|
-
| Phase | In a deps run |
|
|
115
|
-
|---|---|
|
|
116
|
-
| 0 Init | Candidate pick and the major gate happen in the command before Phase 0. Then the normal intake (account, repo, base branch, workspace) with the free-text task `chore(deps): bump {name} from {from} to {to}`, `taskType` `chore`, branch from section 1 |
|
|
117
|
-
| 1 Plan | No analysis document (`chore`). The plan is fixed: one todo, "apply the bump", plus one per failing area once Phase 2 has a red run. `notes` output and the `list` record are the plan's evidence. The approval gate shows the bump, its risk and `alsoMoves` |
|
|
118
|
-
| 2 Dev | `apply` in the worktree first, before any agent runs. Then the Phase 2 exit gate as written (build, lint, tests, evidence gates). Green: straight to Phase 3 with no dev agent. Red: fix rounds (section 4) |
|
|
119
|
-
| 3 Review | The standard gates and reviewers over the whole diff. `scope` runs first; every `outOfScope` file is a blocking finding unless the round's report ties it to a build or test error line |
|
|
120
|
-
| 4 Commit | `commitMessage` from `apply`, the PR body from section 1. Never auto-close an issue |
|
|
121
|
-
| 5 Report | Channels as in every mode |
|
|
122
|
-
|
|
123
|
-
## 4. Scope of a fix round
|
|
124
|
-
|
|
125
|
-
A round is one Phase 2 dev dispatch, given exactly this:
|
|
126
|
-
|
|
127
|
-
- the failing build or test log tail, from the exit gate;
|
|
128
|
-
- `surface` output: the files that use the dependency;
|
|
129
|
-
- the `notes` excerpt (breaking changes, migration notes). With no local
|
|
130
|
-
changelog, read the release notes for the versions in between from the
|
|
131
|
-
repository URL it returns (`gh release view`, the releases page) when
|
|
132
|
-
reachable, and say when they were not;
|
|
133
|
-
- the rule: change only what the bump broke. A file outside the surface may be
|
|
134
|
-
touched only when a compile or test error names it, and the report cites that
|
|
135
|
-
error line per file.
|
|
136
|
-
|
|
137
|
-
The surface is the one `apply` recorded. A file that starts importing the
|
|
138
|
-
dependency during a fix round does not join it: `scope` reports it under
|
|
139
|
-
`newImporters`, and each one passes only when the build or test log handed to
|
|
140
|
-
`scope --log` has an error line naming that file. The line is returned as
|
|
141
|
-
`cited`; a new importer with `cited: null` fails scope like an out-of-scope
|
|
142
|
-
file.
|
|
143
|
-
|
|
144
|
-
After each round: `scope --log <exit-gate log>`, then the exit gate again. Out-of-scope files with no
|
|
145
|
-
cited error are reverted before the next round. Green ends the loop. Every round
|
|
146
|
-
is recorded in `state.depBump.rounds[]` with the files it touched and the
|
|
147
|
-
errors it answered.
|
|
148
|
-
|
|
149
|
-
## 5. Rollback
|
|
150
|
-
|
|
151
|
-
A run still red after `depBump.maxFixRounds` rounds (default 2), or out of
|
|
152
|
-
scope after its last round, is not committed: `dep-bump.mjs rollback` returns
|
|
153
|
-
the manifest, the lockfile and the files the fix rounds touched to the recorded
|
|
154
|
-
base, removes the ones the base did not have, and leaves every other change in
|
|
155
|
-
place (`kept`); the run ends with a report instead of a PR. The report names the bump, each round, the errors still failing with their
|
|
156
|
-
log lines, the files that would need to change and the changelog section that
|
|
157
|
-
explains it. `state.depBump.rolledBack` is `true`. The branch is left with no
|
|
158
|
-
commit; nothing is pushed.
|
|
159
|
-
|
|
160
|
-
## 6. Settings
|
|
161
|
-
|
|
162
|
-
| Key | Default | Effect |
|
|
163
|
-
|---|---|---|
|
|
164
|
-
| `depBump.maxFixRounds` | 2 | Fix rounds before rollback; 0 rolls back any bump that is not green as-is |
|
|
165
|
-
| `depBump.queryRegistry` | true | `list` gets `--registry`; false lists offline only |
|
|
166
|
-
|
|
167
|
-
Read through `node "$HOME/.claude/scripts/dep-bump.mjs" config`. Asserted by
|
|
168
|
-
`test/dep-bump.test.mjs` and `smoke-dep-bump.sh`.
|
|
169
|
-
|
|
170
|
-
## 7. Never
|
|
171
|
-
|
|
172
|
-
- A major, unparseable or prerelease bump without `--major` or an explicit confirmation.
|
|
173
|
-
- A version edit by hand, or a lockfile edited as text.
|
|
174
|
-
- More than one dependency per run (a shared `version.ref` is one bump).
|
|
175
|
-
- A fix outside the bump's surface with no error line behind it.
|
|
176
|
-
- A commit after the round cap is reached red.
|