@mmerterden/multi-agent-pipeline 20.23.2 → 20.25.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 +46 -0
- package/README.md +8 -6
- package/README.tr.md +7 -5
- package/docs/architecture.md +3 -3
- package/docs/ecosystem.md +5 -5
- package/docs/facts.json +7 -6
- package/docs/features.md +9 -4
- package/install/catalog-history.json +1 -1
- package/install/templates/claude-hooks.json +14 -1
- package/install/templates/codex-hooks.json +18 -0
- package/manifest.json +126 -98
- package/package.json +1 -1
- package/pipeline/agents/task-clarifier.md +1 -1
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +4 -2
- package/pipeline/commands/multi-agent/deps/SKILL.md +61 -0
- package/pipeline/commands/multi-agent/model/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/postmortem/SKILL.md +90 -0
- package/pipeline/commands/multi-agent/review/SKILL.md +5 -5
- package/pipeline/commands/multi-agent/route-on/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/setup/SKILL.md +7 -5
- package/pipeline/commands/multi-agent/sync/SKILL.md +4 -4
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +2 -3
- package/pipeline/contract/fixtures/runs-failed.json +1 -1
- package/pipeline/contract/fixtures/runs-old-schema.json +1 -1
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +1 -1
- package/pipeline/contract/fixtures/runs-pr-opened.json +1 -1
- package/pipeline/contract/fixtures/runs-running.json +1 -1
- package/pipeline/lib/analysis-jira-write.sh +70 -0
- package/pipeline/lib/credential-inventory.sh +5 -5
- package/pipeline/lib/decisions.mjs +130 -0
- package/pipeline/lib/fetch-crashlytics.sh +6 -8
- package/pipeline/lib/model-rung.sh +1 -1
- package/pipeline/lib/plan-todos.sh +177 -37
- package/pipeline/lib/post-pr-review.sh +4 -6
- package/pipeline/lib/route-state.sh +1 -1
- package/pipeline/lib/shadow-git.sh +4 -5
- package/pipeline/lib/task-graph.mjs +446 -0
- package/pipeline/lib/tdd-evidence.mjs +579 -0
- package/pipeline/multi-agent-refs/analysis-template-corporate.md +2 -0
- package/pipeline/multi-agent-refs/analysis-template.md +4 -2
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -11
- package/pipeline/multi-agent-refs/features/analysis-jira.md +42 -0
- package/pipeline/multi-agent-refs/features/autopilot-decisions.md +34 -0
- package/pipeline/multi-agent-refs/features/cost-analysis.md +4 -0
- package/pipeline/multi-agent-refs/features/dep-bump.md +176 -0
- package/pipeline/multi-agent-refs/features/model-fallback.md +21 -14
- package/pipeline/multi-agent-refs/features/mutation-probe.md +58 -0
- package/pipeline/multi-agent-refs/features/plan-checks.md +67 -0
- package/pipeline/multi-agent-refs/features/plan-todos.md +40 -1
- package/pipeline/multi-agent-refs/features/rework-escalation.md +49 -0
- package/pipeline/multi-agent-refs/features/scope-check.md +1 -0
- package/pipeline/multi-agent-refs/help/en.md +2 -0
- package/pipeline/multi-agent-refs/help/tr.md +2 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +2 -3
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +7 -7
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +18 -16
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +3 -3
- package/pipeline/multi-agent-refs/picker-contract.md +3 -2
- package/pipeline/multi-agent-refs/response-shape.md +65 -0
- package/pipeline/multi-agent-refs/tracker-contract.md +6 -6
- package/pipeline/rules/response-shape.md +18 -0
- package/pipeline/schemas/agent-state.schema.json +36 -1
- package/pipeline/schemas/phases.json +4 -0
- package/pipeline/schemas/plan-todos.schema.json +104 -3
- package/pipeline/schemas/planning-output.schema.json +46 -0
- package/pipeline/schemas/prefs.schema.json +122 -3
- package/pipeline/scripts/_code-graph.mjs +2 -2
- package/pipeline/scripts/_jsonl.mjs +151 -0
- package/pipeline/scripts/_plan-overlap.mjs +231 -0
- package/pipeline/scripts/_redact.mjs +124 -10
- package/pipeline/scripts/_transcript-hosts.mjs +406 -0
- package/pipeline/scripts/analysis-story-tree.mjs +153 -8
- package/pipeline/scripts/autopilot-publish.mjs +12 -1
- package/pipeline/scripts/build-stack-plugins.mjs +3 -3
- package/pipeline/scripts/capture-flush.sh +7 -7
- package/pipeline/scripts/code-graph-rules/android.json +1 -1
- package/pipeline/scripts/cost-analyze.mjs +32 -43
- package/pipeline/scripts/cost-table.json +35 -19
- package/pipeline/scripts/decisions-log.mjs +118 -0
- package/pipeline/scripts/dep-bump.mjs +1556 -0
- package/pipeline/scripts/edit-syntax-gate.mjs +362 -0
- package/pipeline/scripts/edit-syntax-gate.sh +32 -0
- package/pipeline/scripts/find-polluter.mjs +281 -0
- package/pipeline/scripts/gate-ledger.mjs +46 -13
- package/pipeline/scripts/gc-abandoned.sh +2 -2
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/git-path.mjs +1 -2
- package/pipeline/scripts/host-hooks.mjs +265 -0
- package/pipeline/scripts/jira-attach.sh +1 -1
- package/pipeline/scripts/keychain.py +3 -3
- package/pipeline/scripts/mutation-probe.mjs +484 -0
- package/pipeline/scripts/output-quality-check.sh +1 -1
- package/pipeline/scripts/phase-tracker.sh +5 -6
- package/pipeline/scripts/phase0-exit-gate.mjs +3 -3
- package/pipeline/scripts/plan-complexity.mjs +259 -0
- package/pipeline/scripts/pre-push-check.sh +3 -6
- package/pipeline/scripts/review-decision-gate.mjs +33 -1
- package/pipeline/scripts/rework-escalation.mjs +264 -0
- package/pipeline/scripts/test-strength.mjs +5 -3
- package/pipeline/scripts/transcript-index.mjs +1131 -0
- package/pipeline/scripts/uninstall.mjs +90 -4
- package/pipeline/scripts/update-issue-progress.sh +4 -6
- package/pipeline/scripts/usage-report.mjs +2 -2
- package/pipeline/scripts/validate-planning.mjs +48 -6
- package/pipeline/skills/.skill-manifest.json +20 -12
- package/pipeline/skills/.skills-index.json +23 -1
- package/pipeline/skills/shared/README.md +5 -3
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +6 -6
- package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +4 -2
- package/pipeline/skills/shared/core/multi-agent-deps/SKILL.md +60 -0
- package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-postmortem/SKILL.md +69 -0
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +5 -5
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +4 -4
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -3
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +15 -0
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +13 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +8 -0
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
- package/pipeline/skills/skills-index.md +3 -1
|
@@ -60,6 +60,7 @@ import {
|
|
|
60
60
|
XCODE_SKILLS_MANIFEST,
|
|
61
61
|
} from "../lib/xcode-plugin.mjs";
|
|
62
62
|
import { createInterface } from "readline";
|
|
63
|
+
import { removeHooks, templateCommands } from "./host-hooks.mjs";
|
|
63
64
|
|
|
64
65
|
const HOME = process.env.HOME;
|
|
65
66
|
|
|
@@ -104,6 +105,7 @@ export const PIPELINE_RETIRED_SKILL_DIRS = ["valven-rules"];
|
|
|
104
105
|
*/
|
|
105
106
|
export const PIPELINE_TEMPLATE_FILES = [
|
|
106
107
|
"claude-hooks.json",
|
|
108
|
+
"codex-hooks.json",
|
|
107
109
|
"codex-instructions.md",
|
|
108
110
|
"copilot-instructions.md",
|
|
109
111
|
"multi-agent-autopilot-awake.plist.template",
|
|
@@ -781,11 +783,14 @@ function stripManagedBlock(filePath, { hostFile = false } = {}) {
|
|
|
781
783
|
}
|
|
782
784
|
|
|
783
785
|
/**
|
|
784
|
-
* Remove the pipeline-added hooks + env from settings.json
|
|
785
|
-
*
|
|
786
|
+
* Remove the pipeline-added hooks + env from settings.json: the gates
|
|
787
|
+
* install/claude.mjs registers, and every handler whose full command is one
|
|
788
|
+
* claude-hooks.json registers (setup Step 8 merges those). Other hooks the
|
|
789
|
+
* user added stay intact, including one inside a group the pipeline uses.
|
|
786
790
|
* @param {string} settingsPath
|
|
791
|
+
* @param {Set<string>|null} templateCmds claude-hooks.json's commands
|
|
787
792
|
*/
|
|
788
|
-
function cleanClaudeSettings(settingsPath) {
|
|
793
|
+
function cleanClaudeSettings(settingsPath, templateCmds) {
|
|
789
794
|
if (!existsSync(settingsPath)) return;
|
|
790
795
|
let settings;
|
|
791
796
|
try {
|
|
@@ -831,6 +836,20 @@ function cleanClaudeSettings(settingsPath) {
|
|
|
831
836
|
if (settings.hooks && Object.keys(settings.hooks).length === 0) delete settings.hooks;
|
|
832
837
|
}
|
|
833
838
|
|
|
839
|
+
if (templateCmds && settings.hooks) {
|
|
840
|
+
try {
|
|
841
|
+
const { doc, removed } = removeHooks(settings, templateCmds);
|
|
842
|
+
if (removed) {
|
|
843
|
+
settings = doc;
|
|
844
|
+
touched = true;
|
|
845
|
+
}
|
|
846
|
+
} catch {
|
|
847
|
+
console.log(
|
|
848
|
+
` skipped the hook template pass (hooks not in the expected shape): ${settingsPath}`,
|
|
849
|
+
);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
|
|
834
853
|
if (touched) {
|
|
835
854
|
if (dryRun) {
|
|
836
855
|
report("would update", settingsPath);
|
|
@@ -841,6 +860,63 @@ function cleanClaudeSettings(settingsPath) {
|
|
|
841
860
|
}
|
|
842
861
|
}
|
|
843
862
|
|
|
863
|
+
/**
|
|
864
|
+
* The commands a shipped hook template registers, read from the first copy
|
|
865
|
+
* found: the host's installed templates, the package this script runs from,
|
|
866
|
+
* or the templates directory beside an installed scripts/. Null when none is
|
|
867
|
+
* readable.
|
|
868
|
+
* @param {string} name template file name
|
|
869
|
+
* @param {string[]} dirs host template directories, searched first
|
|
870
|
+
*/
|
|
871
|
+
export function shippedHookCommands(name, dirs = []) {
|
|
872
|
+
const here = import.meta.dirname;
|
|
873
|
+
const candidates = [
|
|
874
|
+
...dirs.map((d) => join(d, name)),
|
|
875
|
+
join(here, "..", "..", "install", "templates", name),
|
|
876
|
+
join(here, "..", "templates", name),
|
|
877
|
+
];
|
|
878
|
+
for (const path of candidates) {
|
|
879
|
+
if (!existsSync(path)) continue;
|
|
880
|
+
try {
|
|
881
|
+
const commands = templateCommands(JSON.parse(readFileSync(path, "utf-8")), HOME);
|
|
882
|
+
if (commands.size) return commands;
|
|
883
|
+
} catch {
|
|
884
|
+
// An unreadable copy: try the next one.
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
return null;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
/**
|
|
891
|
+
* Take the pipeline's hook handlers out of Codex's hooks.json (host-hooks.mjs
|
|
892
|
+
* merged them in), matched by the template's full commands; the user's own
|
|
893
|
+
* hooks stay. Without a template the file is left as it is.
|
|
894
|
+
* @param {string} hooksPath
|
|
895
|
+
* @param {Set<string>|null} commands
|
|
896
|
+
*/
|
|
897
|
+
function cleanCodexHooks(hooksPath, commands) {
|
|
898
|
+
if (!existsSync(hooksPath)) return;
|
|
899
|
+
if (!commands) {
|
|
900
|
+
console.log(` skipped (no codex-hooks.json template to match against): ${hooksPath}`);
|
|
901
|
+
return;
|
|
902
|
+
}
|
|
903
|
+
let doc;
|
|
904
|
+
try {
|
|
905
|
+
doc = JSON.parse(readFileSync(hooksPath, "utf-8"));
|
|
906
|
+
} catch {
|
|
907
|
+
console.log(` skipped (unparseable): ${hooksPath}`);
|
|
908
|
+
return;
|
|
909
|
+
}
|
|
910
|
+
const { doc: cleaned, removed } = removeHooks(doc, commands);
|
|
911
|
+
if (!removed) return;
|
|
912
|
+
if (dryRun) {
|
|
913
|
+
report("would update", hooksPath);
|
|
914
|
+
return;
|
|
915
|
+
}
|
|
916
|
+
atomicWrite(hooksPath, JSON.stringify(cleaned, null, 2) + "\n");
|
|
917
|
+
console.log(` removed ${removed} pipeline hook(s) from: ${hooksPath}`);
|
|
918
|
+
}
|
|
919
|
+
|
|
844
920
|
async function confirm(question) {
|
|
845
921
|
if (skipPrompt || dryRun) return true;
|
|
846
922
|
return new Promise((resolve) => {
|
|
@@ -910,6 +986,9 @@ export async function main() {
|
|
|
910
986
|
console.log(" [Claude Code] Removing...");
|
|
911
987
|
deregisterClaudeMcpServer();
|
|
912
988
|
const CLAUDE = join(HOME, ".claude");
|
|
989
|
+
const claudeHookCommands = shippedHookCommands("claude-hooks.json", [
|
|
990
|
+
join(CLAUDE, "templates"),
|
|
991
|
+
]);
|
|
913
992
|
unlinkClaudeXcodePlugin(HOME);
|
|
914
993
|
rmCommandsPreservingLocalOnly(join(CLAUDE, "commands", "multi-agent"));
|
|
915
994
|
rmIfExists(join(CLAUDE, "scripts"));
|
|
@@ -961,7 +1040,7 @@ export async function main() {
|
|
|
961
1040
|
// Agent definitions are FILES; remove only the pipeline-shipped names so
|
|
962
1041
|
// user-authored agents survive.
|
|
963
1042
|
rmMatchingFiles(join(CLAUDE, "agents"), (name) => PIPELINE_AGENT_FILES.includes(name));
|
|
964
|
-
cleanClaudeSettings(join(CLAUDE, "settings.json"));
|
|
1043
|
+
cleanClaudeSettings(join(CLAUDE, "settings.json"), claudeHookCommands);
|
|
965
1044
|
}
|
|
966
1045
|
|
|
967
1046
|
if (forCopilot && HOME) {
|
|
@@ -1071,6 +1150,13 @@ export async function main() {
|
|
|
1071
1150
|
console.log(" [Codex CLI] Removing from ~/.codex...");
|
|
1072
1151
|
const CODEX = join(HOME, ".codex");
|
|
1073
1152
|
|
|
1153
|
+
// Codex reads hooks from $CODEX_HOME when set, so host-hooks.mjs may have
|
|
1154
|
+
// registered there as well as in ~/.codex.
|
|
1155
|
+
const codexHooks = shippedHookCommands("codex-hooks.json", [join(CODEX, "templates")]);
|
|
1156
|
+
const hooksFiles = new Set([join(CODEX, "hooks.json")]);
|
|
1157
|
+
if (process.env.CODEX_HOME) hooksFiles.add(join(process.env.CODEX_HOME, "hooks.json"));
|
|
1158
|
+
for (const hooksFile of hooksFiles) cleanCodexHooks(hooksFile, codexHooks);
|
|
1159
|
+
|
|
1074
1160
|
// Wholly pipeline-owned trees.
|
|
1075
1161
|
rmIfExists(join(CODEX, "multi-agent-refs"));
|
|
1076
1162
|
rmIfExists(join(CODEX, "scripts"));
|
|
@@ -135,12 +135,10 @@ if [ "$TASK_ID" = "--rewrite" ]; then
|
|
|
135
135
|
fi
|
|
136
136
|
|
|
137
137
|
# Resolve agent-state.json. multi-repo-pipeline.sh writes it under a
|
|
138
|
-
# per-project directory ($HOME/.claude/logs/multi-agent/{project}/{taskId}/)
|
|
139
|
-
# -
|
|
140
|
-
#
|
|
141
|
-
#
|
|
142
|
-
# write flat, so on a real machine the majority of runs resolved to nothing and
|
|
143
|
-
# this script reported "no agent-state.json" for a run whose state existed.
|
|
138
|
+
# per-project directory ($HOME/.claude/logs/multi-agent/{project}/{taskId}/),
|
|
139
|
+
# while phase-tracker.sh and most Phase 0 paths write it flat; no writer uses
|
|
140
|
+
# ~/.claude/projects/*/state/. ma_resolve_run_file checks both layouts, so a
|
|
141
|
+
# run whose state exists is always found.
|
|
144
142
|
AGENT_STATE="$(ma_resolve_run_file "$TASK_ID" agent-state.json 2>/dev/null || true)"
|
|
145
143
|
|
|
146
144
|
if [ -z "$AGENT_STATE" ]; then
|
|
@@ -235,8 +235,8 @@ function invokedCalls(state, { publicPlugins, manifestPath } = {}) {
|
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
// The package declares `os: ["darwin"]` and every entry point refuses a
|
|
238
|
-
// non-darwin host, so
|
|
239
|
-
// function and the field
|
|
238
|
+
// non-darwin host, so no other platform gets a branch of its own. The
|
|
239
|
+
// function and the field exist because the panel groups by `os` and a row with the key
|
|
240
240
|
// missing reads as "unknown host" rather than "macOS".
|
|
241
241
|
function detectOs() {
|
|
242
242
|
return platform() === "darwin" ? "macos" : platform();
|
|
@@ -13,12 +13,20 @@
|
|
|
13
13
|
//
|
|
14
14
|
// Exit codes:
|
|
15
15
|
// 0 - valid
|
|
16
|
-
// 1 - invalid structure, missing field, bad enum,
|
|
16
|
+
// 1 - invalid structure, missing field, bad enum, broken dependsOn edges,
|
|
17
|
+
// or two tasks that both create the same file
|
|
18
|
+
//
|
|
19
|
+
// Output: {ok, code, errors[], warnings[], overlaps[]}. `overlaps` holds one
|
|
20
|
+
// anchored row per pair of tasks that share a file or a named symbol, and
|
|
21
|
+
// `warnings` the overlaps that look wrong without being certain to be
|
|
22
|
+
// (_plan-overlap.mjs). Warnings never change the exit code.
|
|
17
23
|
|
|
18
24
|
import { readFileSync } from "node:fs";
|
|
25
|
+
import { planOverlaps } from "./_plan-overlap.mjs";
|
|
19
26
|
|
|
20
27
|
const ALLOWED_TYPES = new Set(["test", "code", "refactor", "docs", "chore"]);
|
|
21
28
|
const TASK_ID_RE = /^T\d+$/;
|
|
29
|
+
const NAME_LISTS = ["creates", "removes", "produces", "consumes"];
|
|
22
30
|
|
|
23
31
|
function readInput() {
|
|
24
32
|
const arg = process.argv[2];
|
|
@@ -114,6 +122,29 @@ async function main() {
|
|
|
114
122
|
) {
|
|
115
123
|
errors.push(`tasks[${i}].requirements: must be an array of requirement ids if present`);
|
|
116
124
|
}
|
|
125
|
+
for (const key of NAME_LISTS) {
|
|
126
|
+
if (
|
|
127
|
+
t[key] !== undefined &&
|
|
128
|
+
!(Array.isArray(t[key]) && t[key].every((n) => typeof n === "string" && n.length > 0))
|
|
129
|
+
) {
|
|
130
|
+
errors.push(`tasks[${i}].${key}: must be an array of non-empty strings if present`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (t.complexity !== undefined) {
|
|
134
|
+
const c = t.complexity;
|
|
135
|
+
if (
|
|
136
|
+
typeof c !== "object" ||
|
|
137
|
+
c === null ||
|
|
138
|
+
!Number.isInteger(c.score) ||
|
|
139
|
+
c.score < 1 ||
|
|
140
|
+
c.score > 10 ||
|
|
141
|
+
(c.recommendSplit !== undefined && typeof c.recommendSplit !== "boolean")
|
|
142
|
+
) {
|
|
143
|
+
errors.push(
|
|
144
|
+
`tasks[${i}].complexity: must be {score: 1-10, recommendSplit?: boolean} if present`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
117
148
|
});
|
|
118
149
|
|
|
119
150
|
// Validate dependsOn edges point to real ids and don't cycle
|
|
@@ -149,13 +180,24 @@ async function main() {
|
|
|
149
180
|
}
|
|
150
181
|
}
|
|
151
182
|
|
|
183
|
+
let overlaps = [];
|
|
184
|
+
let warnings = [];
|
|
185
|
+
if (errors.length === 0) {
|
|
186
|
+
const found = planOverlaps(parsed.tasks);
|
|
187
|
+
overlaps = found.rows;
|
|
188
|
+
warnings = found.warnings;
|
|
189
|
+
errors.push(...found.contradictions);
|
|
190
|
+
}
|
|
191
|
+
|
|
152
192
|
if (errors.length > 0) {
|
|
153
|
-
emit({ ok: false, code: 1, errors });
|
|
154
|
-
process.
|
|
193
|
+
emit({ ok: false, code: 1, errors, warnings, overlaps });
|
|
194
|
+
process.exitCode = 1;
|
|
195
|
+
return;
|
|
155
196
|
}
|
|
156
197
|
|
|
157
|
-
|
|
158
|
-
|
|
198
|
+
// exitCode, not exit(): the overlap rows grow with the plan, and exit()
|
|
199
|
+
// would cut them at the pipe buffer.
|
|
200
|
+
emit({ ok: true, code: 0, errors: [], warnings, overlaps });
|
|
159
201
|
}
|
|
160
202
|
|
|
161
203
|
/**
|
|
@@ -177,7 +219,7 @@ function hasCycle(id, graph, state) {
|
|
|
177
219
|
}
|
|
178
220
|
|
|
179
221
|
function emit(result) {
|
|
180
|
-
process.stdout.write(JSON.stringify(result) + "\n");
|
|
222
|
+
process.stdout.write(JSON.stringify({ warnings: [], overlaps: [], ...result }) + "\n");
|
|
181
223
|
}
|
|
182
224
|
|
|
183
225
|
main().catch((err) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
4
|
-
"skillCount":
|
|
3
|
+
"generatedAt": "2026-10-14T08:53:17Z",
|
|
4
|
+
"skillCount": 230,
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"path": "shared/core/apple-archive-compliance/SKILL.md",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"path": "shared/core/multi-agent-analysis-jira/SKILL.md",
|
|
16
|
-
"sha256": "
|
|
16
|
+
"sha256": "485a44b117a5502ea54ff0830584cb69d7622a77f13e326e4684eb9e693de8a0"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "shared/core/multi-agent-analysis-resolve/SKILL.md",
|
|
@@ -59,6 +59,10 @@
|
|
|
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
|
+
},
|
|
62
66
|
{
|
|
63
67
|
"path": "shared/core/multi-agent-design-check/SKILL.md",
|
|
64
68
|
"sha256": "8888744fa52e935f53db9a1068e1b18c636b6c9d55b084dabfc19b9ae68bf6f8"
|
|
@@ -125,7 +129,11 @@
|
|
|
125
129
|
},
|
|
126
130
|
{
|
|
127
131
|
"path": "shared/core/multi-agent-model/SKILL.md",
|
|
128
|
-
"sha256": "
|
|
132
|
+
"sha256": "57ba710657d74176b0f19d4a97d3183df1f7b0c056eb1eef2792308914be836c"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"path": "shared/core/multi-agent-postmortem/SKILL.md",
|
|
136
|
+
"sha256": "41edd907cbaae1523eab1cd716390c9e9cd889574141cb88c33966e221b0987d"
|
|
129
137
|
},
|
|
130
138
|
{
|
|
131
139
|
"path": "shared/core/multi-agent-prune-logs/SKILL.md",
|
|
@@ -165,7 +173,7 @@
|
|
|
165
173
|
},
|
|
166
174
|
{
|
|
167
175
|
"path": "shared/core/multi-agent-review/SKILL.md",
|
|
168
|
-
"sha256": "
|
|
176
|
+
"sha256": "e3a673e13b9b7a227334afe79e20e2be837c0900e16e88003b4692a1d74dea41"
|
|
169
177
|
},
|
|
170
178
|
{
|
|
171
179
|
"path": "shared/core/multi-agent-route-off/SKILL.md",
|
|
@@ -173,7 +181,7 @@
|
|
|
173
181
|
},
|
|
174
182
|
{
|
|
175
183
|
"path": "shared/core/multi-agent-route-on/SKILL.md",
|
|
176
|
-
"sha256": "
|
|
184
|
+
"sha256": "0435bb53d8c55d20cfdb1bd5ddbd0544bace68041ab45929904d1a38d2f608c6"
|
|
177
185
|
},
|
|
178
186
|
{
|
|
179
187
|
"path": "shared/core/multi-agent-route-status/SKILL.md",
|
|
@@ -213,7 +221,7 @@
|
|
|
213
221
|
},
|
|
214
222
|
{
|
|
215
223
|
"path": "shared/core/multi-agent-setup/SKILL.md",
|
|
216
|
-
"sha256": "
|
|
224
|
+
"sha256": "28e80bacb521b3c41aac18859ca3921735970b0bf27f064bfc2b496db9f85016"
|
|
217
225
|
},
|
|
218
226
|
{
|
|
219
227
|
"path": "shared/core/multi-agent-stack/SKILL.md",
|
|
@@ -233,7 +241,7 @@
|
|
|
233
241
|
},
|
|
234
242
|
{
|
|
235
243
|
"path": "shared/core/multi-agent-sync/SKILL.md",
|
|
236
|
-
"sha256": "
|
|
244
|
+
"sha256": "76e713bb107d0fa14db67ca3fc67f420a8e831f3c2db85b21fd59acb327f0017"
|
|
237
245
|
},
|
|
238
246
|
{
|
|
239
247
|
"path": "shared/core/multi-agent-test-accessibility/SKILL.md",
|
|
@@ -257,7 +265,7 @@
|
|
|
257
265
|
},
|
|
258
266
|
{
|
|
259
267
|
"path": "shared/core/multi-agent-testflight-validation/SKILL.md",
|
|
260
|
-
"sha256": "
|
|
268
|
+
"sha256": "b6c360c330ef0094cd7e7d9624e89624446b048951e43a180766bbe67d1b725c"
|
|
261
269
|
},
|
|
262
270
|
{
|
|
263
271
|
"path": "shared/core/multi-agent-uninstall/SKILL.md",
|
|
@@ -269,7 +277,7 @@
|
|
|
269
277
|
},
|
|
270
278
|
{
|
|
271
279
|
"path": "shared/core/multi-agent/SKILL.md",
|
|
272
|
-
"sha256": "
|
|
280
|
+
"sha256": "b2435de3df518efb8ddf9ac89b3089449e46bf55f29220e07a3aa95dfc8cd083"
|
|
273
281
|
},
|
|
274
282
|
{
|
|
275
283
|
"path": "shared/external/accessibility-compliance-accessibility-audit/SKILL.md",
|
|
@@ -337,7 +345,7 @@
|
|
|
337
345
|
},
|
|
338
346
|
{
|
|
339
347
|
"path": "shared/external/app-store-optimization/SKILL.md",
|
|
340
|
-
"sha256": "
|
|
348
|
+
"sha256": "99580fe67cbe4e42bb07a95669ab10bcece0c6ba5032acf321a25e73fee1c37d"
|
|
341
349
|
},
|
|
342
350
|
{
|
|
343
351
|
"path": "shared/external/app-store-review/SKILL.md",
|
|
@@ -445,7 +453,7 @@
|
|
|
445
453
|
},
|
|
446
454
|
{
|
|
447
455
|
"path": "shared/external/debugging-strategies/SKILL.md",
|
|
448
|
-
"sha256": "
|
|
456
|
+
"sha256": "83b0a5d8a907b5704451920c488269ac88b0410aaa41ed9267946fb0e636963d"
|
|
449
457
|
},
|
|
450
458
|
{
|
|
451
459
|
"path": "shared/external/device-integrity/SKILL.md",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"skillCount":
|
|
3
|
+
"skillCount": 230,
|
|
4
4
|
"entries": [
|
|
5
5
|
{
|
|
6
6
|
"name": "accessibility-compliance-accessibility-audit",
|
|
@@ -1146,6 +1146,17 @@
|
|
|
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
|
+
},
|
|
1149
1160
|
{
|
|
1150
1161
|
"name": "multi-agent-design-check",
|
|
1151
1162
|
"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",
|
|
@@ -1333,6 +1344,17 @@
|
|
|
1333
1344
|
"triggerPaths": [],
|
|
1334
1345
|
"relativePath": "shared/core/multi-agent-model/SKILL.md"
|
|
1335
1346
|
},
|
|
1347
|
+
{
|
|
1348
|
+
"name": "multi-agent-postmortem",
|
|
1349
|
+
"description": "Post-mortem of a run from its session transcripts: loops, stalls, root-cause hypotheses on file:line, fixes. Read-only, redacted. Use when a run went wrong or ran far too long.",
|
|
1350
|
+
"platform": null,
|
|
1351
|
+
"group": "core",
|
|
1352
|
+
"plugin": null,
|
|
1353
|
+
"invokeAs": "multi-agent-postmortem",
|
|
1354
|
+
"triggerKeywords": [],
|
|
1355
|
+
"triggerPaths": [],
|
|
1356
|
+
"relativePath": "shared/core/multi-agent-postmortem/SKILL.md"
|
|
1357
|
+
},
|
|
1336
1358
|
{
|
|
1337
1359
|
"name": "multi-agent-prune-logs",
|
|
1338
1360
|
"description": "Delete per-task project logs under ~/.claude/logs/multi-agent (filter by age/project/task). Audit trail + metrics are preserved. Dry-run first; confirms before deleting. Use when task logs have built up and need trimming by age, project or task.",
|
|
@@ -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:** 230 skills (69 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/`** - 69 `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) - 69
|
|
18
18
|
- [iOS / Apple Ecosystem](#ios-apple-ecosystem) - 94
|
|
19
19
|
- [Android / Kotlin](#android-kotlin) - 16
|
|
20
20
|
- [Web](#web) - 10
|
|
@@ -40,6 +40,7 @@ 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 |
|
|
43
44
|
| [`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 |
|
|
44
45
|
| [`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 |
|
|
45
46
|
| [`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 |
|
|
@@ -57,6 +58,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
|
|
|
57
58
|
| [`multi-agent-log`](./core/multi-agent-log/) | `core` | Show the agent-log.md for the given task. With no ID, shows the most recent task. Use when asked what a task did, or to read its log. |
|
|
58
59
|
| [`multi-agent-manual-test`](./core/multi-agent-manual-test/) | `core` | Switch to the active task's branch and prepare it for manual testing in Xcode. Phase 3 user-test step, standalone (the UI Bug Hunter lives a |
|
|
59
60
|
| [`multi-agent-model`](./core/multi-agent-model/) | `core` | Turn the top model rung on or off and keep the cost ledger's pricing in step with it. Use when asked to enable or disable Fable, or which mo |
|
|
61
|
+
| [`multi-agent-postmortem`](./core/multi-agent-postmortem/) | `core` | Post-mortem of a run from its session transcripts: loops, stalls, root-cause hypotheses on file:line, fixes. Read-only, redacted. Use when a |
|
|
60
62
|
| [`multi-agent-prune-logs`](./core/multi-agent-prune-logs/) | `core` | Delete per-task project logs under ~/.claude/logs/multi-agent (filter by age/project/task). Audit trail + metrics are preserved. Dry-run fir |
|
|
61
63
|
| [`multi-agent-prune-prompts`](./core/multi-agent-prune-prompts/) | `core` | Zero-base prompt review: measure the always-on instruction footprint, classify every rule block, propose keep/trial-removal/delete; applies |
|
|
62
64
|
| [`multi-agent-purge`](./core/multi-agent-purge/) | `core` | ⚠️ Wipes every worktree, branch, log, and state file. Irreversible; asks for double confirmation. Use when every worktree, branch, log and s |
|
|
@@ -206,12 +206,12 @@ Per-project input parsing (my-ios-app / my-figma-app / generic), worktree creati
|
|
|
206
206
|
### Phase 1: Plan
|
|
207
207
|
Two halves, one phase, one approval gate.
|
|
208
208
|
|
|
209
|
-
**1a - Analysis** (claude-sonnet-5, `explorer` persona)
|
|
209
|
+
**1a - Analysis** (claude-sonnet-5-5, `explorer` persona)
|
|
210
210
|
1. Launch **explore agents** (parallel) to scan the codebase: related files, existing patterns and conventions, potential impact areas
|
|
211
211
|
2. Summarize findings
|
|
212
212
|
3. Log: `📊 Phase 1: Plan (analysis) - {N} files identified, {summary}`
|
|
213
213
|
|
|
214
|
-
**1b - Planning** (claude-fable-5)
|
|
214
|
+
**1b - Planning** (claude-fable-5-1)
|
|
215
215
|
1. Create task breakdown → todos with dependencies
|
|
216
216
|
2. Launch **ios-architect** agent for architecture review (if structural changes)
|
|
217
217
|
3. Determine development approach per todo (new file, modify, refactor)
|
|
@@ -221,7 +221,7 @@ Two halves, one phase, one approval gate.
|
|
|
221
221
|
- **5b - Approval loop**: render plan → user: `onayla`/`iptal`/free-text. A free-text edit request → the planning model (Fable) revises the plan → show it again. No iteration cap; user controls exit via `onayla` or `iptal`.
|
|
222
222
|
- Persist `clarificationRounds`, `clarificationQuestions`, `clarificationAnswers`, `planIterations`, `planApprovedAt`, `planEditRequests` to `state.phases["1"]`.
|
|
223
223
|
|
|
224
|
-
### Phase 2: Dev (claude-sonnet-5)
|
|
224
|
+
### Phase 2: Dev (claude-sonnet-5-5)
|
|
225
225
|
For each todo (respecting dependency order):
|
|
226
226
|
1. Update todo status: `in_progress`
|
|
227
227
|
2. **TDD cycle**: write failing test → verify RED; write minimal code → verify GREEN; refactor if needed
|
|
@@ -233,9 +233,9 @@ For each todo (respecting dependency order):
|
|
|
233
233
|
### Phase 3: Review (parallel + triage)
|
|
234
234
|
0. **Diff Risk Scoring (advisory)** - before reviewer dispatch run `node $HOME/.claude/scripts/diff-risk-score.mjs --base "$BASE_BRANCH" --top 5` and inject the top-N risk-ranked files as a `${PRIORITY_FILES}` block into each reviewer's prompt. Heuristic, deterministic, sub-second, never gates the pipeline. Disabled when `prefs.global.diffRiskAdvisory = false`. Signals: security paths (×3), schema migrations (×4), public API surfaces (×2), no-test-change (×2.5), complexity delta (×1.5), UI-critical paths (×1.5), loc changed (×1).
|
|
235
235
|
1. Launch **code-reviewer** agents in parallel. Reviewer set depends on which CLI is hosting the pipeline:
|
|
236
|
-
- **Claude Code** (3 reviewers): `claude-fable-5` (deep security + architecture) + `claude-opus-5` (edge cases, different perspective) + `claude-sonnet-5` (quality + correctness)
|
|
237
|
-
- **Copilot CLI** (3 reviewers): `gpt-5.4` (edge cases, different perspective) + `claude-opus-
|
|
238
|
-
- Triage: single top-tier pass over merged findings (`claude-fable-5` on Claude Code, `claude-opus-
|
|
236
|
+
- **Claude Code** (3 reviewers): `claude-fable-5-1` (deep security + architecture) + `claude-opus-5-5` (edge cases, different perspective) + `claude-sonnet-5-5` (quality + correctness)
|
|
237
|
+
- **Copilot CLI** (3 reviewers): `gpt-5.4` (edge cases, different perspective) + `claude-opus-4.7` + `claude-sonnet-4.6` (Fable is not offered on Copilot CLI)
|
|
238
|
+
- Triage: single top-tier pass over merged findings (`claude-fable-5-1` on Claude Code, `claude-opus-4.7` on Copilot CLI)
|
|
239
239
|
2. Collect findings, classify:
|
|
240
240
|
- 🔴 **Blocking** → must fix → back to Phase 2 (max 3 iterations)
|
|
241
241
|
- 🟡 **Important** → fix and re-review
|
|
@@ -25,6 +25,7 @@ Contract, severities and reasoning:
|
|
|
25
25
|
- An open `EKLENECEK`/`TBD` marker or an open Section 20 row stops planning with exit 4. Resolve them with `/multi-agent-analysis-resolve` first.
|
|
26
26
|
- The epic must already exist: stories are linked to it, never an epic created. On Server/Data Center the Epic Link field is discovered from the site; when none is found the stories are created unlinked and the writer says so.
|
|
27
27
|
- Channel clones (`issueTree.cloneByChannel`) carry their own labels and are searched like stories, so a re-run never doubles them or their links.
|
|
28
|
+
- A requirement row with `Depends on: <ids>` links the stories, prerequisite first, as `issueTree.dependencyLinkType` (default Blocks). A cycle, or a prerequisite no story covers, makes the plan `incomplete`; fix the document, not the links.
|
|
28
29
|
- Story bodies hold only document text. A body warning (no user story, fewer than 2 criteria, no negative criterion) is a gap in the document; fix the document, not the ticket.
|
|
29
30
|
|
|
30
31
|
## Phase 1 - Plan, offline
|
|
@@ -60,6 +61,7 @@ what makes a preview meaningful:
|
|
|
60
61
|
- the coverage verdict **on its own line**, and the consistency verdict below it
|
|
61
62
|
- every field beside the pref key it came from, so a wrong setting shows here
|
|
62
63
|
rather than in Jira afterwards
|
|
64
|
+
- the dependency edges between stories, prerequisite first
|
|
63
65
|
- the write count
|
|
64
66
|
- every story's full description, as it will be written, with its body
|
|
65
67
|
warnings; `--brief` gives the one-line-per-node view
|
|
@@ -102,7 +104,7 @@ A run that could not be checked is allowed. One that looks checked when it was
|
|
|
102
104
|
not is the defect, so the approval has to name it and a plain "Approve" must not
|
|
103
105
|
be reachable.
|
|
104
106
|
|
|
105
|
-
`incomplete` prints its uncovered and invented ids before the question. An
|
|
107
|
+
`incomplete` prints its uncovered and invented ids, and any dependency cycle or uncovered prerequisite, before the question. An
|
|
106
108
|
invented id means the plan cites something the document does not define - treat
|
|
107
109
|
that as a defect in the plan, not a warning to click past.
|
|
108
110
|
|
|
@@ -152,7 +154,7 @@ missing-attachment warning.
|
|
|
152
154
|
|
|
153
155
|
## Phase 5 - Report
|
|
154
156
|
|
|
155
|
-
Keys created, keys skipped, the epic linked (or none), the coverage verdict, and the ledger path. If the
|
|
157
|
+
Keys created, keys skipped, the epic linked (or none), the dependency links written, the coverage verdict, and the ledger path. If the
|
|
156
158
|
verdict was `unverifiable`, say that in the report too - not only at approval
|
|
157
159
|
time, because the report is what gets pasted elsewhere.
|
|
158
160
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multi-agent-deps
|
|
3
|
+
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."
|
|
4
|
+
user-invocable: true
|
|
5
|
+
argument-hint: "[package[@version]] [--major] - no package opens a picker over the outdated candidates; --major allows a breaking bump"
|
|
6
|
+
metadata:
|
|
7
|
+
language: en
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# multi-agent deps - bump one dependency and fix what it broke
|
|
11
|
+
|
|
12
|
+
> **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.
|
|
13
|
+
|
|
14
|
+
**Input**: $ARGUMENTS
|
|
15
|
+
|
|
16
|
+
> **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".
|
|
17
|
+
|
|
18
|
+
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.
|
|
19
|
+
|
|
20
|
+
## Steps
|
|
21
|
+
|
|
22
|
+
1. **Repo and settings.** Resolve the repo as `/multi-agent` does for a free-text task (`_account-picker.md`, `_repo-picker.md`). Then:
|
|
23
|
+
```bash
|
|
24
|
+
node "$HOME/.claude/scripts/dep-bump.mjs" config # depBump.maxFixRounds, depBump.queryRegistry
|
|
25
|
+
node "$HOME/.claude/scripts/dep-bump.mjs" detect --dir "$REPO"
|
|
26
|
+
```
|
|
27
|
+
No ecosystem detected: say so and stop.
|
|
28
|
+
|
|
29
|
+
2. **Candidates.**
|
|
30
|
+
```bash
|
|
31
|
+
node "$HOME/.claude/scripts/dep-bump.mjs" list --dir "$REPO" [--registry] # --registry when queryRegistry is true
|
|
32
|
+
```
|
|
33
|
+
Show `registry.note` and every per-package `note`: an offline listing is reported as offline, never as "nothing outdated".
|
|
34
|
+
- `package@version` given: use it. `package` alone: its `latestInMajor`, else `latest`. Not in the list: stop with the manifests that were read.
|
|
35
|
+
- 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.
|
|
36
|
+
|
|
37
|
+
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.
|
|
38
|
+
|
|
39
|
+
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:
|
|
40
|
+
- **Phase 1**: the fixed plan from the feature doc, with the changelog excerpt as evidence:
|
|
41
|
+
```bash
|
|
42
|
+
node "$HOME/.claude/scripts/dep-bump.mjs" notes --dir "$WORKTREE" --ecosystem E --name N --from A --to B
|
|
43
|
+
```
|
|
44
|
+
- **Phase 2**: apply first, then the exit gate as written:
|
|
45
|
+
```bash
|
|
46
|
+
node "$HOME/.claude/scripts/dep-bump.mjs" apply --dir "$WORKTREE" --ecosystem E --name N --to B [--allow-major]
|
|
47
|
+
```
|
|
48
|
+
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:
|
|
49
|
+
```bash
|
|
50
|
+
node "$HOME/.claude/scripts/dep-bump.mjs" scope --dir "$WORKTREE" --log "$GATE_LOG" # the round's build/test log
|
|
51
|
+
```
|
|
52
|
+
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.
|
|
53
|
+
- **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.
|
|
54
|
+
- **Phase 3**: standard review. Each `outOfScope` file without a cited error line, and each `newImporters` entry with `cited: null`, is a blocking finding.
|
|
55
|
+
- **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.
|
|
56
|
+
- **Phase 5**: channels as in every mode.
|
|
57
|
+
|
|
58
|
+
## Report
|
|
59
|
+
|
|
60
|
+
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.
|
|
@@ -44,8 +44,8 @@ because it does not mean the same thing on all three:
|
|
|
44
44
|
|
|
45
45
|
| Host | What `off` does | Why |
|
|
46
46
|
|---|---|---|
|
|
47
|
-
| Claude Code | every `preferredModel: fable` persona (architects, reviewer 1, triage) starts on `opus` | the only host where the rung is Fable 5 |
|
|
48
|
-
| Copilot CLI | nothing | Fable
|
|
47
|
+
| Claude Code | every `preferredModel: fable` persona (architects, reviewer 1, triage) starts on `opus` | the only host where the rung is Fable 5.1 |
|
|
48
|
+
| Copilot CLI | nothing | Fable is not offered there; its personas never sat on this rung |
|
|
49
49
|
| Codex CLI | nothing, deliberately | the `fable` rung there means `gpt-5.6 @ xhigh`, a different model on a different account - switching it from a knob named after an Anthropic model would surprise a Codex user |
|
|
50
50
|
|
|
51
51
|
So on two of the three hosts this command is a **status report**, not a switch,
|