@mmerterden/multi-agent-pipeline 12.7.0 → 12.8.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 (244) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/install/_common.mjs +48 -0
  3. package/install/_dev-only-files.mjs +125 -5
  4. package/install/claude.mjs +14 -8
  5. package/install/copilot.mjs +5 -8
  6. package/package.json +17 -2
  7. package/pipeline/commands/multi-agent/analysis/SKILL.md +1 -1
  8. package/pipeline/lib/credential-store.sh +20 -0
  9. package/pipeline/multi-agent-refs/_account-picker.md +1 -1
  10. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  11. package/pipeline/multi-agent-refs/_repo-picker.md +1 -1
  12. package/pipeline/multi-agent-refs/phases/operations.md +28 -0
  13. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -0
  14. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
  15. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
  16. package/pipeline/multi-agent-refs/phases/phase-4-review.md +49 -4
  17. package/pipeline/schemas/prefs.schema.json +6 -0
  18. package/pipeline/scripts/_smoke-root.sh +61 -0
  19. package/pipeline/scripts/audit-log.sh +25 -0
  20. package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
  21. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
  22. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
  23. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
  24. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
  25. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
  26. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
  27. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
  28. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
  29. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
  30. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
  31. package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
  32. package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
  33. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
  34. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
  35. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
  36. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
  37. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
  38. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
  39. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
  40. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
  41. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
  42. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
  43. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
  44. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
  45. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
  46. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
  47. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
  48. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
  49. package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
  50. package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
  51. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
  52. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
  53. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
  54. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
  55. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
  56. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
  57. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
  58. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
  59. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
  60. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
  61. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
  62. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
  63. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
  64. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
  65. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
  66. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
  67. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
  68. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
  69. package/pipeline/eval/golden-tasks/README.md +0 -65
  70. package/pipeline/eval/intent-cases.json +0 -40
  71. package/pipeline/eval/run-metrics-fixture.json +0 -93
  72. package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
  73. package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
  74. package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
  75. package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
  76. package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
  77. package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
  78. package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
  79. package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
  80. package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
  81. package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
  82. package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
  83. package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
  84. package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
  85. package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
  86. package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
  87. package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
  88. package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
  89. package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
  90. package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
  91. package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
  92. package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
  93. package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
  94. package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
  95. package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
  96. package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
  97. package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
  98. package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
  99. package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
  100. package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
  101. package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
  102. package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
  103. package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
  104. package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
  105. package/pipeline/eval/triage/README.md +0 -54
  106. package/pipeline/scripts/benchmark-phase-0.sh +0 -128
  107. package/pipeline/scripts/check-md-links.mjs +0 -88
  108. package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -302
  109. package/pipeline/scripts/eval-golden-tasks.mjs +0 -224
  110. package/pipeline/scripts/eval-intent.mjs +0 -107
  111. package/pipeline/scripts/eval-mine-corpus.mjs +0 -211
  112. package/pipeline/scripts/eval-triage.mjs +0 -171
  113. package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
  114. package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
  115. package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
  116. package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
  117. package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
  118. package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
  119. package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
  120. package/pipeline/scripts/lint-mcp-refs.mjs +0 -218
  121. package/pipeline/scripts/lint-skills.mjs +0 -154
  122. package/pipeline/scripts/run-smokes.mjs +0 -130
  123. package/pipeline/scripts/scorecard.mjs +0 -258
  124. package/pipeline/scripts/smoke-add-detail.sh +0 -137
  125. package/pipeline/scripts/smoke-agent-guard.sh +0 -74
  126. package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
  127. package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
  128. package/pipeline/scripts/smoke-ask-choice.sh +0 -42
  129. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
  130. package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
  131. package/pipeline/scripts/smoke-changelog-version.sh +0 -47
  132. package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
  133. package/pipeline/scripts/smoke-channels-flow.sh +0 -130
  134. package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
  135. package/pipeline/scripts/smoke-clarify.sh +0 -148
  136. package/pipeline/scripts/smoke-command-inventory.sh +0 -81
  137. package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
  138. package/pipeline/scripts/smoke-community-gates.sh +0 -75
  139. package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
  140. package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
  141. package/pipeline/scripts/smoke-context-budget.sh +0 -72
  142. package/pipeline/scripts/smoke-cost-budget.sh +0 -70
  143. package/pipeline/scripts/smoke-cost-summary.sh +0 -139
  144. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
  145. package/pipeline/scripts/smoke-description-tr.sh +0 -82
  146. package/pipeline/scripts/smoke-dev-critic.sh +0 -144
  147. package/pipeline/scripts/smoke-diff-explain.sh +0 -147
  148. package/pipeline/scripts/smoke-diff-risk.sh +0 -190
  149. package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
  150. package/pipeline/scripts/smoke-eval-live.sh +0 -136
  151. package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
  152. package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
  153. package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
  154. package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
  155. package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
  156. package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
  157. package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
  158. package/pipeline/scripts/smoke-generate-issue.sh +0 -120
  159. package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
  160. package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
  161. package/pipeline/scripts/smoke-install-layout.sh +0 -248
  162. package/pipeline/scripts/smoke-intent-guard.sh +0 -86
  163. package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
  164. package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
  165. package/pipeline/scripts/smoke-keychain.sh +0 -158
  166. package/pipeline/scripts/smoke-language-axis.sh +0 -109
  167. package/pipeline/scripts/smoke-learning-curve.sh +0 -61
  168. package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
  169. package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
  170. package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
  171. package/pipeline/scripts/smoke-md-links.sh +0 -8
  172. package/pipeline/scripts/smoke-md2confluence.sh +0 -126
  173. package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
  174. package/pipeline/scripts/smoke-migrate-state.sh +0 -102
  175. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
  176. package/pipeline/scripts/smoke-model-fallback.sh +0 -89
  177. package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
  178. package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
  179. package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -194
  180. package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
  181. package/pipeline/scripts/smoke-own-punctuation.sh +0 -103
  182. package/pipeline/scripts/smoke-pack-contents.sh +0 -140
  183. package/pipeline/scripts/smoke-pat-audit.sh +0 -128
  184. package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
  185. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
  186. package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
  187. package/pipeline/scripts/smoke-phase-banner.sh +0 -101
  188. package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
  189. package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
  190. package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
  191. package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
  192. package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
  193. package/pipeline/scripts/smoke-plan-safety.sh +0 -139
  194. package/pipeline/scripts/smoke-plan-todos.sh +0 -196
  195. package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
  196. package/pipeline/scripts/smoke-pre-commit.sh +0 -170
  197. package/pipeline/scripts/smoke-pref-migration.sh +0 -226
  198. package/pipeline/scripts/smoke-prefs-language.sh +0 -134
  199. package/pipeline/scripts/smoke-progress-contract.sh +0 -127
  200. package/pipeline/scripts/smoke-prune-logs.sh +0 -137
  201. package/pipeline/scripts/smoke-purge.sh +0 -138
  202. package/pipeline/scripts/smoke-push-retry.sh +0 -75
  203. package/pipeline/scripts/smoke-repo-map.sh +0 -300
  204. package/pipeline/scripts/smoke-review-readiness.sh +0 -92
  205. package/pipeline/scripts/smoke-review-watch.sh +0 -146
  206. package/pipeline/scripts/smoke-routines.sh +0 -84
  207. package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
  208. package/pipeline/scripts/smoke-run-metrics.sh +0 -50
  209. package/pipeline/scripts/smoke-search.sh +0 -187
  210. package/pipeline/scripts/smoke-shadow-git.sh +0 -224
  211. package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
  212. package/pipeline/scripts/smoke-skill-language.sh +0 -83
  213. package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
  214. package/pipeline/scripts/smoke-skill-scan.sh +0 -198
  215. package/pipeline/scripts/smoke-source-parity.sh +0 -85
  216. package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
  217. package/pipeline/scripts/smoke-sync-parity.sh +0 -92
  218. package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
  219. package/pipeline/scripts/smoke-telemetry.sh +0 -147
  220. package/pipeline/scripts/smoke-test-gap.sh +0 -183
  221. package/pipeline/scripts/smoke-token-budget.sh +0 -67
  222. package/pipeline/scripts/smoke-token-preflight.sh +0 -82
  223. package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
  224. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
  225. package/pipeline/scripts/smoke-triage-memory.sh +0 -174
  226. package/pipeline/scripts/smoke-update-check.sh +0 -135
  227. package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
  228. package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
  229. package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
  230. package/pipeline/scripts/smoke-validator-gates.sh +0 -164
  231. package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
  232. package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
  233. package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
  234. package/pipeline/scripts/smoke-work-summary.sh +0 -163
  235. package/pipeline/scripts/smoke-workflow-audit.sh +0 -101
  236. package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
  237. package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
  238. package/pipeline/scripts/smoke-write-state.sh +0 -159
  239. package/pipeline/scripts/sync-parity-check.sh +0 -135
  240. package/pipeline/scripts/test-gap-rules/android.json +0 -25
  241. package/pipeline/scripts/test-gap-rules/ios.json +0 -34
  242. package/pipeline/scripts/test-gap-rules/node.json +0 -29
  243. package/pipeline/scripts/test-gap-rules/python.json +0 -25
  244. package/pipeline/scripts/validate-schemas.mjs +0 -88
@@ -1,156 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-per-repo-memory.sh - v6.2.E
3
- #
4
- # Verifies the per-repo memory layer contract:
5
- # 1. memory-load.sh exits silently when pref is off
6
- # 2. memory-load.sh prints the wrapped block when pref is on + MEMORY.md exists
7
- # 3. memory-save.sh writes the file + .gitignore + index entry
8
- # 4. memory-save.sh overwrites existing slug idempotently (no duplicate index row)
9
- # 5. memory-save.sh rejects invalid type + invalid slug
10
- # 6. prefs schema exposes perRepoMemory toggle
11
- #
12
- # Exit 0 = all pass, 1 = any failure.
13
-
14
- set -euo pipefail
15
-
16
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
17
- LOAD="$ROOT/pipeline/scripts/memory-load.sh"
18
- SAVE="$ROOT/pipeline/scripts/memory-save.sh"
19
- SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
20
-
21
- pass=0
22
- fail=0
23
- failures=()
24
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
25
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
26
-
27
- printf '→ smoke-per-repo-memory (v6.2.E): opt-in memory layer contract\n'
28
-
29
- # Fresh sandbox + fake prefs
30
- sandbox=$(mktemp -d)
31
- mkdir -p "$sandbox/.claude"
32
- HOME_SAVE="$HOME"
33
- export HOME="$sandbox"
34
- repo="$sandbox/repo"
35
- mkdir -p "$repo"
36
-
37
- # --- 1: pref off → silent exit 0 ---
38
- printf '{"global":{"perRepoMemory":false}}' > "$HOME/.claude/multi-agent-preferences.json"
39
- out=$(bash "$LOAD" "$repo" 2>&1 || true)
40
- if [ -z "$out" ]; then
41
- record_pass "load exits silent when pref off"
42
- else
43
- record_fail "load should be silent when pref off (got: $out)"
44
- fi
45
-
46
- # --- 2: pref on + no memory → silent exit 0 ---
47
- printf '{"global":{"perRepoMemory":true}}' > "$HOME/.claude/multi-agent-preferences.json"
48
- out=$(bash "$LOAD" "$repo" 2>&1 || true)
49
- if [ -z "$out" ]; then
50
- record_pass "load exits silent when pref on but no memory present"
51
- else
52
- record_fail "load should be silent with pref on + no memory (got: $out)"
53
- fi
54
-
55
- # --- 3: save writes file + index + gitignore ---
56
- body=$(mktemp)
57
- cat > "$body" <<'BODY'
58
- ---
59
- name: audit-exhaustiveness
60
- description: Audits must grep all surfaces before stating counts
61
- type: feedback
62
- ---
63
-
64
- Lead rule.
65
- BODY
66
-
67
- bash "$SAVE" "$repo" feedback audit-exhaustiveness "$body" >/dev/null
68
-
69
- if [ -f "$repo/.multi-agent/memory/feedback_audit-exhaustiveness.md" ]; then
70
- record_pass "save wrote memory file"
71
- else
72
- record_fail "save did not create memory file"
73
- fi
74
-
75
- if [ -f "$repo/.multi-agent/.gitignore" ]; then
76
- record_pass "save created .gitignore"
77
- else
78
- record_fail "save did not create .gitignore"
79
- fi
80
-
81
- if grep -q 'feedback_audit-exhaustiveness.md' "$repo/.multi-agent/memory/MEMORY.md"; then
82
- record_pass "save added index entry to MEMORY.md"
83
- else
84
- record_fail "save did not add index entry"
85
- fi
86
-
87
- # --- 2 (second leg): pref on + memory present → emits block ---
88
- out=$(bash "$LOAD" "$repo" 2>&1)
89
- if grep -q '<repo-memory' <<< "$out" && grep -q 'audit-exhaustiveness' <<< "$out"; then
90
- record_pass "load emits wrapped block + pointer"
91
- else
92
- record_fail "load should emit wrapped block with pref on + memory present"
93
- fi
94
-
95
- # --- 4: idempotent save (no duplicate index row) ---
96
- cat > "$body" <<'BODY'
97
- ---
98
- name: audit-exhaustiveness
99
- description: Updated rule text (v2)
100
- type: feedback
101
- ---
102
-
103
- Updated body.
104
- BODY
105
- bash "$SAVE" "$repo" feedback audit-exhaustiveness "$body" >/dev/null
106
-
107
- idx_count=$(grep -c 'feedback_audit-exhaustiveness.md' "$repo/.multi-agent/memory/MEMORY.md" || true)
108
- if [ "$idx_count" = "1" ]; then
109
- record_pass "idempotent save keeps index at 1 entry"
110
- else
111
- record_fail "idempotent save produced $idx_count entries (expected 1)"
112
- fi
113
-
114
- if grep -q 'Updated body' "$repo/.multi-agent/memory/feedback_audit-exhaustiveness.md"; then
115
- record_pass "idempotent save overwrote body"
116
- else
117
- record_fail "idempotent save did not update body"
118
- fi
119
-
120
- # --- 5: invalid type / slug rejected ---
121
- set +e
122
- bash "$SAVE" "$repo" invalid-type bad-slug "$body" >/dev/null 2>&1
123
- rc_type=$?
124
- bash "$SAVE" "$repo" feedback "Bad Slug With Spaces" "$body" >/dev/null 2>&1
125
- rc_slug=$?
126
- set -e
127
- if [ "$rc_type" != "0" ]; then
128
- record_pass "save rejects invalid type"
129
- else
130
- record_fail "save should reject invalid type"
131
- fi
132
- if [ "$rc_slug" != "0" ]; then
133
- record_pass "save rejects invalid slug"
134
- else
135
- record_fail "save should reject invalid slug"
136
- fi
137
-
138
- # --- 6: schema exposes pref ---
139
- if jq -e '.properties.global.properties.perRepoMemory.default == false' "$SCHEMA" >/dev/null 2>&1; then
140
- record_pass "prefs schema exposes perRepoMemory with default false"
141
- else
142
- record_fail "prefs schema missing perRepoMemory or wrong default"
143
- fi
144
-
145
- # cleanup
146
- rm -f "$body"
147
- rm -rf "$sandbox"
148
- export HOME="$HOME_SAVE"
149
-
150
- printf '\n══ per-repo-memory smoke: %d passed, %d failed ══\n' "$pass" "$fail"
151
- if [ "$fail" -gt 0 ]; then
152
- printf '\nFailures:\n'
153
- for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
154
- exit 1
155
- fi
156
- exit 0
@@ -1,170 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-phase-0-multi-repo.sh - asserts the v2.1.0+ multi-repo + identity-routing
3
- # + fetch-fail contract is fully documented in phase-0-init.md.
4
- #
5
- # This is a doc-shape smoke (Phase 0 is spec-driven; the executable behavior
6
- # lives in the orchestrator, not a single .sh). Failures here mean the spec
7
- # diverged from the schema or feedback memory.
8
-
9
- set -uo pipefail
10
-
11
- # Source-tree read (authoritative). Installed tree may lag behind.
12
- HERE="$(cd "$(dirname "$0")" && pwd)"
13
- ROOT="$(cd "$HERE/../.." && pwd)"
14
- PHASE0="$ROOT/pipeline/multi-agent-refs/phases/phase-0-init.md"
15
- PREFS_SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
16
- STATE_SCHEMA="$ROOT/pipeline/schemas/agent-state.schema.json"
17
-
18
- PASS=0
19
- FAIL=0
20
- pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
21
- fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
22
-
23
- if [ ! -f "$PHASE0" ]; then
24
- fail "phase-0-init.md missing at $PHASE0"
25
- echo "══ phase-0-multi-repo smoke: aborted ══"
26
- exit 2
27
- fi
28
-
29
- # ──────────────────────────────────────────────────────────────────────────
30
- echo "→ 1. Multi-repo project-selection contract"
31
- grep -q "v2.1.0+ Multi-Repo Mode" "$PHASE0" \
32
- && pass "Step 2 has 'v2.1.0+ Multi-Repo Mode' subsection" \
33
- || fail "Step 2 missing v2.1.0+ multi-repo subsection"
34
- grep -q "state.projects\[\]" "$PHASE0" \
35
- && pass "Step 2 references state.projects[] population" \
36
- || fail "Step 2 missing state.projects[] reference"
37
- grep -q "recentGroups" "$PHASE0" \
38
- && pass "Step 2 mentions recentGroups (LRU bump)" \
39
- || fail "Step 2 missing recentGroups reference"
40
- grep -q "settings.multiRepoEnabled" "$PHASE0" \
41
- && pass "Step 2 multi-repo gated by settings.multiRepoEnabled flag" \
42
- || fail "Step 2 missing settings.multiRepoEnabled gate"
43
-
44
- # ──────────────────────────────────────────────────────────────────────────
45
- echo ""
46
- echo "→ 2. Branch TTL + collision detection"
47
- grep -q "branchTtlDays" "$PHASE0" \
48
- && pass "TTL filter references settings.branchTtlDays" \
49
- || fail "TTL filter not anchored to settings.branchTtlDays"
50
- grep -q "default 15" "$PHASE0" \
51
- && pass "TTL default 15d documented" \
52
- || fail "TTL default 15d not documented"
53
- grep -qE "Collision handling|Branch-collision" "$PHASE0" \
54
- && pass "Collision handling section present" \
55
- || fail "Collision handling section missing"
56
- # Post-10caff1: collision handling is automatic (`-v2`, `-v3` suffix), no prompt.
57
- grep -qE "append \`-v2\`|append -v2" "$PHASE0" \
58
- && pass "Collision handling appends -v2/-v3 suffix automatically" \
59
- || fail "Collision automatic-suffix rule missing"
60
- grep -qE "ls-remote --exit-code --heads" "$PHASE0" \
61
- && pass "Remote collision probe uses ls-remote --exit-code" \
62
- || fail "Remote collision probe missing ls-remote --exit-code"
63
-
64
- # ──────────────────────────────────────────────────────────────────────────
65
- echo ""
66
- echo "→ 3. Fetch-fail flow (4 options per feedback memory)"
67
- grep -q "Fetch-fail handling" "$PHASE0" \
68
- && pass "Fetch-fail handling subsection present" \
69
- || fail "Fetch-fail handling subsection missing"
70
- for opt in "Connect VPN" "Use cached origin" "Use local branch" "Abort"; do
71
- grep -q "$opt" "$PHASE0" \
72
- && pass "Fetch-fail option present: $opt" \
73
- || fail "Fetch-fail option missing: $opt"
74
- done
75
- grep -q '"baseFetchStatus"' "$PHASE0" \
76
- && pass "baseFetchStatus state field documented" \
77
- || fail "baseFetchStatus state field missing"
78
- for v in "fresh" "cached-stale" "local-branch" "aborted"; do
79
- grep -qE "\"$v\"" "$PHASE0" \
80
- && pass "baseFetchStatus enum value: $v" \
81
- || fail "baseFetchStatus enum value missing: $v"
82
- done
83
-
84
- # ──────────────────────────────────────────────────────────────────────────
85
- echo ""
86
- echo "→ 4. Branch-naming kebab rules + multi-repo shared name"
87
- grep -q "Kebab rules" "$PHASE0" \
88
- && pass "Kebab rules block present" \
89
- || fail "Kebab rules block missing"
90
- grep -q "shared across all repos" "$PHASE0" \
91
- && pass "Multi-repo shared-name rule documented" \
92
- || fail "Multi-repo shared-name rule missing"
93
-
94
- # ──────────────────────────────────────────────────────────────────────────
95
- echo ""
96
- echo "→ 5. Identity routing (Step 6 v2.1.0+)"
97
- grep -q "platformIdentityRouting" "$PHASE0" \
98
- && pass "Step 6 references platformIdentityRouting" \
99
- || fail "Step 6 missing platformIdentityRouting reference"
100
- # Post-10caff1: identity routing is ALWAYS on (no gate); previous
101
- # settings.identityRoutingEnabled is obsolete. Verify no stale gate remains.
102
- if grep -q "settings.identityRoutingEnabled" "$PHASE0"; then
103
- fail "legacy settings.identityRoutingEnabled gate still present (should be removed)"
104
- else
105
- pass "no legacy settings.identityRoutingEnabled gate"
106
- fi
107
- grep -q "longest-prefix wins\|Most-specific" "$PHASE0" \
108
- && pass "Glob match semantics: longest-prefix / most-specific wins" \
109
- || fail "Glob match semantics not documented"
110
- # Schema renamed gitIdentities → identities in v2.1.0. Step 6 must not use
111
- # the legacy name.
112
- if grep -q "gitIdentities" "$PHASE0"; then
113
- fail "Step 6 still reading legacy gitIdentities path"
114
- else
115
- pass "no legacy gitIdentities reference"
116
- fi
117
- grep -qE "per repo( independently)?" "$PHASE0" \
118
- && pass "Multi-repo: identity routed per-repo" \
119
- || fail "Multi-repo per-repo routing not stated"
120
-
121
- # ──────────────────────────────────────────────────────────────────────────
122
- echo ""
123
- echo "→ 6. Step 8 multi-repo worktree setup"
124
- grep -q "v2.1.0+ Multi-Repo Worktree Setup" "$PHASE0" \
125
- && pass "Step 8 has multi-repo worktree subsection" \
126
- || fail "Step 8 missing multi-repo worktree subsection"
127
- grep -q "serially per repo" "$PHASE0" \
128
- && pass "Multi-repo worktrees created serially (not parallel)" \
129
- || fail "Serial worktree creation rule missing"
130
- grep -q "roll back already-created worktrees" "$PHASE0" \
131
- && pass "Atomicity: rollback on partial failure documented" \
132
- || fail "Atomicity rollback rule missing"
133
- grep -q "worktree remove --force" "$PHASE0" \
134
- && pass "Rollback uses git worktree remove --force" \
135
- || fail "Rollback command not specified"
136
-
137
- # ──────────────────────────────────────────────────────────────────────────
138
- echo ""
139
- echo "→ 7. Recents update map (Step 0 v2.1.0+)"
140
- grep -q "v2.1.0+ Recents update map" "$PHASE0" \
141
- && pass "Recents update map table present" \
142
- || fail "Recents update map table missing"
143
- for path in recentProjects recentGroups recentBranches serviceStatus; do
144
- grep -q "\`global\.$path" "$PHASE0" \
145
- && pass "Recents map covers global.$path" \
146
- || fail "Recents map missing global.$path"
147
- done
148
-
149
- # ──────────────────────────────────────────────────────────────────────────
150
- echo ""
151
- echo "→ 8. Schema cross-reference sanity"
152
- if [ -f "$STATE_SCHEMA" ]; then
153
- if grep -q "projects" "$STATE_SCHEMA"; then
154
- pass "agent-state.schema.json has projects field"
155
- else
156
- fail "agent-state.schema.json missing projects field"
157
- fi
158
- fi
159
- if [ -f "$PREFS_SCHEMA" ]; then
160
- for f in platformIdentityRouting recentGroups recentBranches serviceStatus settings; do
161
- grep -q "\"$f\":" "$PREFS_SCHEMA" \
162
- && pass "prefs schema declares $f" \
163
- || fail "prefs schema missing $f"
164
- done
165
- fi
166
-
167
- # ──────────────────────────────────────────────────────────────────────────
168
- echo ""
169
- echo "══ phase-0-multi-repo smoke: $PASS passed, $FAIL failed ══"
170
- [ "$FAIL" -eq 0 ]
@@ -1,79 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-phase-6-multi.sh - asserts Phase 6 multi-repo commit + per-repo PR
3
- # + cross-link contract is documented.
4
-
5
- set -uo pipefail
6
-
7
- PHASE6="$HOME/.claude/multi-agent-refs/phases/phase-6-commit.md"
8
-
9
- PASS=0; FAIL=0
10
- pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
11
- fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
12
-
13
- if [ ! -f "$PHASE6" ]; then
14
- fail "phase-6-commit.md missing"; echo "══ aborted ══"; exit 2
15
- fi
16
-
17
- echo "→ 1. v2.1.0+ Multi-Repo Mode subsection present"
18
- grep -q "v2.1.0+ Multi-Repo Mode" "$PHASE6" \
19
- && pass "Phase 6 has v2.1.0+ Multi-Repo Mode subsection" \
20
- || fail "Phase 6 missing v2.1.0+ Multi-Repo Mode subsection"
21
-
22
- echo "→ 2. Per-repo commit (shared subject + per-repo scope)"
23
- grep -q "shared subject" "$PHASE6" \
24
- && pass "Shared subject across repos documented" \
25
- || fail "Shared subject rule missing"
26
- grep -q "per-repo scope" "$PHASE6" \
27
- && pass "Per-repo scope rule documented" \
28
- || fail "Per-repo scope rule missing"
29
- grep -q "Part of multi-repo change" "$PHASE6" \
30
- && pass "Body mentions sibling repos in commit message" \
31
- || fail "Sibling repo mention missing from commit body"
32
- grep -q "state.projects\[i\].commit" "$PHASE6" \
33
- && pass "Per-repo commit sha persisted to state" \
34
- || fail "Per-repo commit sha persistence missing"
35
-
36
- echo "→ 3. Per-repo PR with sibling cross-links"
37
- grep -q "Sibling PRs (multi-repo task)" "$PHASE6" \
38
- && pass "PR body has Sibling PRs section" \
39
- || fail "PR body Sibling PRs section missing"
40
- grep -q "update_sibling_links" "$PHASE6" \
41
- && pass "Idempotent sibling-link update documented" \
42
- || fail "Sibling-link update missing"
43
- grep -q "version+1\|version +1" "$PHASE6" \
44
- && pass "Bitbucket version-bump for PR update mentioned" \
45
- || fail "Bitbucket PUT version-bump missing"
46
- grep -q "gh pr edit --body-file" "$PHASE6" \
47
- && pass "GitHub gh pr edit for sibling-link update" \
48
- || fail "GitHub PR update command missing"
49
-
50
- echo "→ 4. GitHub issue body - multi-repo PR list"
51
- grep -q "one row per repo" "$PHASE6" \
52
- && pass "Issue body lists one row per repo" \
53
- || fail "Issue body multi-repo expansion missing"
54
- grep -q '\*\*common:\*\*\|\*\*uicomponents:\*\*' "$PHASE6" \
55
- && pass "Per-repo row format example present" \
56
- || fail "Per-repo row example missing"
57
-
58
- echo "→ 5. recentGroups update on success"
59
- grep -q "recentGroups\` update on success" "$PHASE6" \
60
- && pass "recentGroups update section present" \
61
- || fail "recentGroups update section missing"
62
- grep -q "order-independent compare" "$PHASE6" \
63
- && pass "Group dedup by order-independent compare" \
64
- || fail "Order-independent compare rule missing"
65
- grep -q '"skipped"' "$PHASE6" \
66
- && pass "Skipped repos excluded from LRU bump" \
67
- || fail "LRU bump exclusion for skipped repos missing"
68
-
69
- echo "→ 6. Telemetry per-repo"
70
- grep -q "commit.created.*repo=\|push.attempted.*repo=" "$PHASE6" \
71
- && pass "Per-repo commit/push telemetry documented" \
72
- || fail "Per-repo telemetry missing"
73
- grep -q "multi_repo.completed" "$PHASE6" \
74
- && pass "Aggregate multi_repo.completed metric present" \
75
- || fail "multi_repo.completed metric missing"
76
-
77
- echo ""
78
- echo "══ phase-6-multi smoke: $PASS passed, $FAIL failed ══"
79
- [ "$FAIL" -eq 0 ]
@@ -1,101 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-phase-banner.sh - contract check for phase-banner.sh.
3
- #
4
- # Verifies:
5
- # 1. start/end/sub render with phase + name
6
- # 2. status enum on `end` is enforced (done|failed|skipped only)
7
- # 3. plain-text mode (no TTY, TERM=dumb) strips ANSI codes
8
- # 4. bad action / bad status → non-zero exit
9
- # 5. minimal args allowed (no name, no detail)
10
-
11
- set -uo pipefail
12
-
13
- HERE="$(cd "$(dirname "$0")" && pwd)"
14
- ROOT="$(cd "$HERE/../.." && pwd)"
15
- SCRIPT="$ROOT/pipeline/scripts/phase-banner.sh"
16
-
17
- PASS=0
18
- FAIL=0
19
- pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
20
- fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
21
-
22
- # Capture in plain-text mode (no TTY, TERM=dumb so colors are off).
23
- run_plain() {
24
- TERM=dumb "$SCRIPT" "$@" 2>/tmp/banner-err
25
- }
26
- run_plain_status() {
27
- local rc=0
28
- TERM=dumb "$SCRIPT" "$@" >/dev/null 2>/tmp/banner-err || rc=$?
29
- echo "$rc"
30
- }
31
-
32
- echo "→ 1. start renders phase + name"
33
- OUT=$(run_plain start 4 "Review" "demo")
34
- echo "$OUT" | grep -q "Phase 4: Review" && pass "start banner contains phase + name" || fail "start banner missing phase or name"
35
- echo "$OUT" | grep -q "demo" && pass "start banner contains detail" || fail "missing detail"
36
-
37
- echo ""
38
- echo "→ 2. end renders phase + status glyph"
39
- OUT_DONE=$(run_plain end 4 done "Review")
40
- echo "$OUT_DONE" | grep -q "✓ done" && pass "end done shows ✓" || fail "missing ✓ on done"
41
- OUT_FAIL=$(run_plain end 3 failed "Dev")
42
- echo "$OUT_FAIL" | grep -q "✗ failed" && pass "end failed shows ✗" || fail "missing ✗ on failed"
43
- OUT_SKIP=$(run_plain end 5 skipped "Test")
44
- echo "$OUT_SKIP" | grep -q "↷ skipped" && pass "end skipped shows ↷" || fail "missing ↷ on skipped"
45
-
46
- echo ""
47
- echo "→ 3. sub renders Sub <phase>.<sub>"
48
- OUT_SUB=$(run_plain sub 4 2 "Triage" "validating")
49
- echo "$OUT_SUB" | grep -q "Sub 4.2 Triage" && pass "sub line correct" || fail "sub line wrong: $OUT_SUB"
50
-
51
- echo ""
52
- echo "→ 4. plain-text mode strips ANSI"
53
- if echo "$OUT" | grep -q $'\033\['; then
54
- fail "ANSI escape codes leaked into TERM=dumb output"
55
- else
56
- pass "no ANSI escapes when TERM=dumb"
57
- fi
58
-
59
- echo ""
60
- echo "→ 5. bad status → exit 64"
61
- RC=$(run_plain_status end 4 unknownstatus "name")
62
- [ "$RC" = "64" ] && pass "bad status rejected (exit 64)" || fail "bad status didn't fail (rc=$RC)"
63
-
64
- echo ""
65
- echo "→ 6. bad action → exit 64"
66
- RC=$(run_plain_status flapdoodle 4)
67
- [ "$RC" = "64" ] && pass "bad action rejected (exit 64)" || fail "bad action didn't fail (rc=$RC)"
68
-
69
- echo ""
70
- echo "→ 7. missing args → exit 64"
71
- RC=$(run_plain_status start)
72
- [ "$RC" = "64" ] && pass "missing args rejected (exit 64)" || fail "missing args didn't fail (rc=$RC)"
73
-
74
- echo ""
75
- echo "→ 8. minimal args (no name, no detail) work"
76
- RC=$(run_plain_status start 0)
77
- [ "$RC" = "0" ] && pass "minimal start works (just phase)" || fail "minimal start failed (rc=$RC)"
78
-
79
- echo ""
80
- echo "→ 9. label action prints canonical EN name"
81
- OUT_LBL=$(TERM=dumb "$SCRIPT" label 4)
82
- [ "$OUT_LBL" = "Review" ] && pass "label 4 en → Review" || fail "label 4 en unexpected: '$OUT_LBL'"
83
-
84
- echo ""
85
- echo "→ 10. PHASE_LANG=tr resolves TR label"
86
- OUT_TR=$(TERM=dumb PHASE_LANG=tr "$SCRIPT" label 4)
87
- [ "$OUT_TR" = "İnceleme" ] && pass "label 4 tr → İnceleme" || fail "label 4 tr unexpected: '$OUT_TR'"
88
-
89
- echo ""
90
- echo "→ 11. auto sentinel resolves from table (en)"
91
- OUT_AUTO=$(run_plain start 3 auto)
92
- echo "$OUT_AUTO" | grep -q "Phase 3: Dev" && pass "auto en → Phase 3: Dev" || fail "auto en unexpected: $OUT_AUTO"
93
-
94
- echo ""
95
- echo "→ 12. auto sentinel + PHASE_LANG=tr → Faz N: <tr-label>"
96
- OUT_AUTO_TR=$(TERM=dumb PHASE_LANG=tr "$SCRIPT" start 3 auto)
97
- echo "$OUT_AUTO_TR" | grep -q "Faz 3: Geliştirme" && pass "auto tr → Faz 3: Geliştirme" || fail "auto tr unexpected: $OUT_AUTO_TR"
98
-
99
- echo ""
100
- echo "══ phase-banner smoke: $PASS passed, $FAIL failed ══"
101
- [ "$FAIL" -eq 0 ]