@mmerterden/multi-agent-pipeline 20.3.1 → 20.5.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 (61) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/docs/ecosystem.md +2 -2
  3. package/docs/facts.json +1 -1
  4. package/install/claude.mjs +35 -0
  5. package/manifest.json +64 -62
  6. package/package.json +1 -1
  7. package/pipeline/agents/android-architect.md +1 -0
  8. package/pipeline/agents/backend-architect.md +1 -0
  9. package/pipeline/agents/bulk-reader.md +1 -0
  10. package/pipeline/agents/code-reviewer.md +2 -1
  11. package/pipeline/agents/dev-critic.md +1 -0
  12. package/pipeline/agents/explorer.md +1 -0
  13. package/pipeline/agents/ios-architect.md +1 -0
  14. package/pipeline/agents/plan-critic.md +1 -0
  15. package/pipeline/agents/security-auditor.md +1 -0
  16. package/pipeline/agents/task-clarifier.md +1 -0
  17. package/pipeline/commands/figma-to-swiftui.md +6 -4
  18. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +1 -1
  19. package/pipeline/commands/multi-agent/jira/SKILL.md +2 -2
  20. package/pipeline/commands/multi-agent/refactor/SKILL.md +1 -1
  21. package/pipeline/commands/multi-agent/review/SKILL.md +1 -1
  22. package/pipeline/commands/multi-agent/setup/SKILL.md +2 -2
  23. package/pipeline/commands/multi-agent/stack/SKILL.md +2 -4
  24. package/pipeline/commands/multi-agent/sync/SKILL.md +2 -2
  25. package/pipeline/commands/multi-agent/update/SKILL.md +6 -11
  26. package/pipeline/lib/redact.mjs +50 -0
  27. package/pipeline/multi-agent-refs/channels/pr.md +2 -2
  28. package/pipeline/multi-agent-refs/features/doctor.md +2 -1
  29. package/pipeline/multi-agent-refs/features/prior-fix-detection.md +1 -1
  30. package/pipeline/multi-agent-refs/features/unattended-security.md +5 -0
  31. package/pipeline/multi-agent-refs/generate-issue.md +9 -9
  32. package/pipeline/multi-agent-refs/outside-the-pipeline.md +2 -2
  33. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
  34. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +2 -1
  35. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +4 -4
  36. package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
  37. package/pipeline/schemas/autopilot-config.schema.json +5 -0
  38. package/pipeline/schemas/prefs.schema.json +1 -1
  39. package/pipeline/scripts/_autopilot-outcomes.mjs +2 -0
  40. package/pipeline/scripts/audit-log-rotate.sh +3 -0
  41. package/pipeline/scripts/audit-log.sh +10 -2
  42. package/pipeline/scripts/autopilot-intake.mjs +17 -15
  43. package/pipeline/scripts/autopilot-publish.mjs +16 -1
  44. package/pipeline/scripts/autopilot-runner.mjs +20 -0
  45. package/pipeline/scripts/capture-resume.sh +51 -37
  46. package/pipeline/scripts/check-derived-drift.mjs +1 -1
  47. package/pipeline/scripts/doctor.mjs +21 -0
  48. package/pipeline/scripts/log-metric.sh +5 -0
  49. package/pipeline/scripts/plugin-refresh.sh +92 -0
  50. package/pipeline/scripts/pr-request.mjs +9 -3
  51. package/pipeline/scripts/update-check.sh +73 -21
  52. package/pipeline/scripts/usage-report.mjs +4 -4
  53. package/pipeline/skills/.skill-manifest.json +8 -8
  54. package/pipeline/skills/shared/core/multi-agent/SKILL.md +6 -4
  55. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +1 -1
  56. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +2 -2
  57. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -2
  58. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +1 -1
  59. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -4
  60. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +1 -1
  61. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +1 -1
@@ -525,7 +525,7 @@ Lets the user test the code before the PR. The prompt MUST say that yes **remove
525
525
  6. **Issue body update** (if GitHub Issue exists):
526
526
  - Fill PR links in issue body: `- **common:** {PR URL}`, `- **uicomponents:** {PR URL}`
527
527
  - Update Progress flags: `Implementation 🟢`, `Testing 🟢`, `Code Connect 🟢`
528
- - Use `gh issue edit {issueNo} --body "{updated body}"` - preserve all existing sections
528
+ - Write the updated body to a temp file and use `gh issue edit {issueNo} --body-file <file>` - preserve all existing sections
529
529
  7. Log: `📦 Phase 4: Commit {sha} - PR #{number}`
530
530
 
531
531
  ### Phase 5 Report Step 2: WIKI + Figma Screenshots (for component tasks with GitHub Issue)
@@ -541,8 +541,8 @@ Skip this sub-step if the task is NOT a component implementation (e.g., bug fix,
541
541
  3. **Fetch Figma screenshot** via REST API:
542
542
  ```bash
543
543
  FIGMA_TOKEN=$(~/.copilot/lib/credential-store.sh get "Figma_Access_Token")
544
- curl -s "https://api.figma.com/v1/images/{fileKey}?ids={nodeId}&format=png&scale=2" \
545
- -H "X-Figma-Token: $FIGMA_TOKEN"
544
+ printf 'X-Figma-Token: %s\n' "$FIGMA_TOKEN" | curl -s -H @- \
545
+ "https://api.figma.com/v1/images/{fileKey}?ids={nodeId}&format=png&scale=2"
546
546
  # Download the image URL to {wikiComponentPath}/assets/screenshot.png
547
547
  ```
548
548
  4. **Generate main wiki page** (`{ComponentName}.md`):
@@ -557,7 +557,9 @@ Skip this sub-step if the task is NOT a component implementation (e.g., bug fix,
557
557
  ```bash
558
558
  cd {wikiRoot}
559
559
  git add {wikiCategory}/{ComponentName}/
560
- git commit -m "docs({scope}): add {ComponentName} wiki pages [PROJ-{id}]"
560
+ git commit -F - <<'MA_MSG'
561
+ docs({scope}): add {ComponentName} wiki pages [PROJ-{id}]
562
+ MA_MSG
561
563
  git fetch origin && git rebase origin/master
562
564
  git push origin HEAD:master
563
565
  ```
@@ -74,7 +74,7 @@ The same name works on both sides and both mechanisms already exist:
74
74
 
75
75
  | Source | Query | Extra condition |
76
76
  |---|---|---|
77
- | GitHub | `gh issue list --repo <r> --label <label> --state open` | none - the label is the whole gate |
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
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
79
 
80
80
  Two Jira caveats worth saying out loud when Jira is selected: labels are one
@@ -79,7 +79,7 @@ Rendered in English (`promptLanguage` is locked to `en`).
79
79
  ### PR description (Bitbucket reviewer-preserving PUT)
80
80
 
81
81
  ```bash
82
- PR_JSON=$(curl -s -u "$BB_USER:$BB_TOKEN" "$PR_URL")
82
+ PR_JSON=$(curl -s --config <(printf 'user = "%s:%s"\n' "$BB_USER" "$BB_TOKEN") "$PR_URL")
83
83
  REVIEWERS=$(jq '[.reviewers[] | {user: {name: .user.name}, approved, status}]' <<< "$PR_JSON")
84
84
  VERSION=$(jq -r '.version' <<< "$PR_JSON")
85
85
  TITLE=$(jq -r '.title' <<< "$PR_JSON")
@@ -96,7 +96,7 @@ jq -n --rawfile body /tmp/channels-$TASK_ID-pr.md \
96
96
  reviewers: $reviewers, fromRef: $fromRef, toRef: $toRef, draft: $draft}' \
97
97
  > /tmp/channels-$TASK_ID-pr-payload.json
98
98
 
99
- curl -s -X PUT -u "$BB_USER:$BB_TOKEN" -H "Content-Type: application/json" \
99
+ curl -s -X PUT --config <(printf 'user = "%s:%s"\n' "$BB_USER" "$BB_TOKEN") -H "Content-Type: application/json" \
100
100
  --data-binary @/tmp/channels-$TASK_ID-pr-payload.json "$PR_URL"
101
101
  ```
102
102
 
@@ -23,8 +23,8 @@ Interactively list the user's open Jira issues, let the user pick one, and send
23
23
 
24
24
  2. **Fetch the open issues** - via the Jira REST API:
25
25
  ```bash
26
- curl -s "https://$JIRA_HOST/rest/api/2/search?jql=assignee=currentUser()+AND+status+not+in+(Done,Closed)&fields=key,summary,status" \
27
- -H "Authorization: Bearer $JIRA_TOKEN"
26
+ printf 'Authorization: Bearer %s\n' "$JIRA_TOKEN" | curl -s -H @- \
27
+ "https://$JIRA_HOST/rest/api/2/search?jql=assignee=currentUser()+AND+status+not+in+(Done,Closed)&fields=key,summary,status"
28
28
  ```
29
29
 
30
30
  3. **Let the user pick** - present the issues as options
@@ -86,7 +86,7 @@ The upstream mapping is **configuration, never hardcoded** (it can reference pri
86
86
  }
87
87
  ```
88
88
 
89
- **The plugin cache is a mirror, not the authority.** `~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/` only holds whatever the last `claude marketplace update` fetched. Reading it as the current upstream version is how this step reported "up to date" while the derivation was four releases behind: the cache sat at 0.2.1 and upstream was at 0.4.1. Resolve in the order below and never let the cache alone produce an "up to date" verdict.
89
+ **The plugin cache is a mirror, not the authority.** `~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/` only holds whatever the last `claude plugin marketplace update` fetched. Reading it as the current upstream version is how this step reported "up to date" while the derivation was four releases behind: the cache sat at 0.2.1 and upstream was at 0.4.1. Resolve in the order below and never let the cache alone produce an "up to date" verdict.
90
90
 
91
91
  **Which manifest carries the version** is `upstreamVersionSource`, default `marketplace.json`. That is what a marketplace consumer actually resolves, and some upstreams keep per-plugin `plugin.json` versions deliberately unused - reading those records a version nobody ships. An entry here was recorded at 0.7.0 from `plugin.json` while the upstream marketplace said 0.6.0 and its CHANGELOG stated in as many words that `plugin.json` is not used.
92
92
 
@@ -66,10 +66,8 @@ REPO_SETTINGS=".claude/settings.json"
66
66
  MP="multi-agent-plugins"
67
67
 
68
68
  # --- ensure the marketplace is known (idempotent) -------------------------
69
- if ! claude marketplace list 2>/dev/null | grep -q "$MP"; then
70
- claude marketplace add {owner}/multi-agent-plugins 2>/dev/null \
71
- || echo "note: add the marketplace once with: claude marketplace add {owner}/multi-agent-plugins"
72
- fi
69
+ bash "$HOME/.claude/scripts/plugin-refresh.sh" {owner} --add-only \
70
+ || echo "note: add the marketplace once with: claude plugin marketplace add {owner}/$MP"
73
71
 
74
72
  COMMON="ai-common-toolkit@${MP}"
75
73
  ANALYST="ai-analyst-toolkit@${MP}"
@@ -36,7 +36,7 @@ Update the pipeline with a single command. Preferences are preserved; only skill
36
36
  3. `git pull origin main`
37
37
  4. `node install.js --all` (Claude + Copilot)
38
38
  4b. Refresh the stack-plugin marketplace so the latest plugin versions are picked up:
39
- `claude marketplace update multi-agent-plugins` (or `claude marketplace add {owner}/multi-agent-plugins` if not yet added)
39
+ `bash "$HOME/.claude/scripts/plugin-refresh.sh" {owner}` (adds the marketplace if needed, refreshes it, then runs `claude plugin update` for every installed plugin)
40
40
  5. `node migrate-prefs.mjs` (if there is a schema upgrade)
41
41
  5b. `node "$HOME/.claude/scripts/usage-register.mjs"` - operational reporting.
42
42
  It requests a per-machine **write-only** token when none resolves, stores it in
@@ -770,7 +770,7 @@ def upload_curl(slug, m):
770
770
  "# Equivalent by hand (curl, Server/DC Bearer PAT - NOT Cloud user:token).\n"
771
771
  "# $CONFLUENCE_BASE_URL / $CONFLUENCE_SPACE / $CONFLUENCE_PARENT are your wiki's target:\n"
772
772
  '# TOKEN=$(security find-generic-password -s CONFLUENCE_API_TOKEN -w)\n'
773
- '# curl -sS -H "Authorization: Bearer $TOKEN" -X POST '
773
+ '# printf \'Authorization: Bearer %s\\n\' "$TOKEN" | curl -sS -H @- -X POST '
774
774
  '"$CONFLUENCE_BASE_URL/rest/api/content" \\\n'
775
775
  '# -H "Content-Type: application/json" -d @- <<JSON\n'
776
776
  f'# {{"type":"page","title":{json.dumps(PAGE_TITLE_PREFIX + "-" + screen)},'