@mmerterden/multi-agent-pipeline 17.0.0 → 17.3.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 +159 -0
- package/README.md +56 -4
- package/README.tr.md +57 -4
- package/docs/architecture.md +3 -3
- package/docs/ecosystem.md +5 -5
- package/docs/token-budget-history.md +22 -0
- package/install/_dev-only-files.mjs +1 -0
- package/install/codex.mjs +18 -1
- package/install/copilot.mjs +17 -1
- package/install/templates/multi-agent-autopilot.plist.template +79 -0
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +64 -0
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +181 -0
- package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +74 -0
- package/pipeline/commands/multi-agent/channels/SKILL.md +41 -12
- package/pipeline/commands/multi-agent/help/SKILL.md +41 -35
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/sync/SKILL.md +10 -9
- package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
- package/pipeline/lib/autopilot-activation.sh +117 -0
- package/pipeline/lib/autopilot-state.sh +184 -0
- package/pipeline/lib/issue-fetcher.sh +18 -1
- package/pipeline/lib/plan-todos.sh +18 -0
- package/pipeline/multi-agent-refs/_dev-context.md +10 -0
- package/pipeline/multi-agent-refs/analysis/redesign.md +8 -0
- package/pipeline/multi-agent-refs/analysis/review.md +9 -0
- package/pipeline/multi-agent-refs/android-guide.md +14 -0
- package/pipeline/multi-agent-refs/audit-guide.md +12 -0
- package/pipeline/multi-agent-refs/backend-guide.md +10 -0
- package/pipeline/multi-agent-refs/channels/confluence.md +11 -0
- package/pipeline/multi-agent-refs/channels/issue-comment.md +12 -0
- package/pipeline/multi-agent-refs/channels/jira.md +90 -20
- package/pipeline/multi-agent-refs/channels/pr-review-actions.md +13 -0
- package/pipeline/multi-agent-refs/channels/pr.md +76 -19
- package/pipeline/multi-agent-refs/component-dispatch.md +11 -0
- package/pipeline/multi-agent-refs/component-generation.md +11 -0
- package/pipeline/multi-agent-refs/conventions-defaults.md +15 -0
- package/pipeline/multi-agent-refs/cross-cli-contract.md +49 -5
- package/pipeline/multi-agent-refs/features/analysis-jira.md +11 -0
- package/pipeline/multi-agent-refs/features/design-conformance.md +10 -0
- package/pipeline/multi-agent-refs/features/doctor.md +10 -0
- package/pipeline/multi-agent-refs/features/external-context-injection.md +7 -0
- package/pipeline/multi-agent-refs/features/jira-context.md +9 -0
- package/pipeline/multi-agent-refs/features/model-fallback.md +10 -0
- package/pipeline/multi-agent-refs/features/skill-conformance.md +13 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +9 -0
- package/pipeline/multi-agent-refs/features/visual-evidence.md +61 -7
- package/pipeline/multi-agent-refs/generate-issue.md +7 -0
- package/pipeline/multi-agent-refs/issue-jira-triad.md +9 -0
- package/pipeline/multi-agent-refs/knowledge.md +6 -0
- package/pipeline/multi-agent-refs/multi-repo-integration-build.md +13 -0
- package/pipeline/multi-agent-refs/phases/modes.md +7 -0
- package/pipeline/multi-agent-refs/phases/operations.md +9 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +2 -2
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +17 -15
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-6-commit.md +1 -1
- package/pipeline/multi-agent-refs/phases.md +11 -0
- package/pipeline/multi-agent-refs/picker-contract.md +12 -0
- package/pipeline/multi-agent-refs/platform-parity.md +10 -0
- package/pipeline/multi-agent-refs/progress-contract.md +10 -0
- package/pipeline/multi-agent-refs/readiness-review.md +7 -1
- package/pipeline/multi-agent-refs/rules.md +3 -11
- package/pipeline/multi-agent-refs/setup/firebase.md +9 -0
- package/pipeline/multi-agent-refs/swiftui-guide.md +17 -0
- package/pipeline/multi-agent-refs/tracker-contract.md +44 -0
- package/pipeline/multi-agent-refs/web-guide.md +10 -0
- package/pipeline/multi-agent-refs/wiki-capture.md +11 -0
- package/pipeline/schemas/autopilot-config.schema.json +149 -0
- package/pipeline/schemas/prefs.schema.json +4 -0
- package/pipeline/schemas/token-budget.json +10 -19
- package/pipeline/scripts/autopilot-arming.mjs +147 -0
- package/pipeline/scripts/autopilot-intake.mjs +387 -0
- package/pipeline/scripts/autopilot-menubar.swift +361 -0
- package/pipeline/scripts/autopilot-runner.mjs +354 -0
- package/pipeline/scripts/autopilot-status.sh +213 -0
- package/pipeline/scripts/capture-evidence.sh +79 -11
- package/pipeline/scripts/gen-ref-toc.mjs +279 -0
- package/pipeline/scripts/jira-search.sh +70 -0
- package/pipeline/scripts/phase-tracker.sh +134 -12
- package/pipeline/scripts/probe-evidence-capability.sh +27 -3
- package/pipeline/scripts/run-ui-tests.sh +113 -4
- package/pipeline/skills/.skill-manifest.json +16 -4
- package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +67 -0
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +146 -0
- package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +64 -0
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +62 -11
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +9 -8
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Channel adapter - PR description
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Required body structure](#required-body-structure)
|
|
5
|
+
- [Markup dialect (per surface, not per pipeline)](#markup-dialect-per-surface-not-per-pipeline)
|
|
6
|
+
- [Behaviour by remote](#behaviour-by-remote)
|
|
7
|
+
- [Reviewer-preserving Bitbucket payload (required)](#reviewer-preserving-bitbucket-payload-required)
|
|
8
|
+
- [Multi-repo cross-links](#multi-repo-cross-links)
|
|
9
|
+
- [Version mismatch handling](#version-mismatch-handling)
|
|
10
|
+
- [Flags that affect this adapter](#flags-that-affect-this-adapter)
|
|
11
|
+
- [Hard rules (must not regress)](#hard-rules-must-not-regress)
|
|
12
|
+
<!-- /toc -->
|
|
13
|
+
|
|
3
14
|
> Detailed contract for the `pr` channel of `/multi-agent:channels`. Split out of `channels.md` in v8.0.0; the parent doc keeps a one-line summary and a link here.
|
|
4
15
|
|
|
5
16
|
The PR adapter rewrites the pull request description with the body assembled in Step 5 of `channels.md`. Default behaviour is **replace**; `--append` opt-in preserves existing content.
|
|
@@ -10,20 +21,31 @@ The PR description targets code reviewers - it stays technical. Every adapter
|
|
|
10
21
|
|
|
11
22
|
| # | Section key | Heading (`tr`) | Heading (`en`) | Required? |
|
|
12
23
|
|---|---|---|---|---|
|
|
13
|
-
| 1 | `summary` | `##
|
|
14
|
-
| 2 | `
|
|
24
|
+
| 1 | `summary` | `## Geliştirme Özeti` | `## Development Summary` | always |
|
|
25
|
+
| 2 | `technical` | `## Teknik Açıklama` | `## Technical Explanation` | always |
|
|
15
26
|
| 3 | `architecture` | `## Mimari Kararlar` | `## Architecture Decisions` | when a non-trivial design choice was made |
|
|
16
|
-
| 4 | `
|
|
17
|
-
| 5 | `
|
|
18
|
-
| 6 | `
|
|
19
|
-
| 7 | `
|
|
20
|
-
| 8 | `
|
|
27
|
+
| 4 | `impact` | `## Etki Analizi` | `## Impact Analysis` | always |
|
|
28
|
+
| 5 | `test_scenarios` | `## Test Senaryoları` | `## Test Scenarios` | always |
|
|
29
|
+
| 6 | `visuals` | `## Görsel Kanıt` | `## Visual Evidence` | when `state.visualEvidence.required` |
|
|
30
|
+
| 7 | `risk` | `## Risk ve Güvenlik` | `## Risk and Security` | when `state.diffRisk.signals` carries a high-stakes signal (`security_path`, `migration`, `public_api`, `no_test_change`, `test_lines_removed`) |
|
|
31
|
+
| 8 | `dependencies` | `## Bağımlılıklar` | `## Dependencies` | when deps added/removed/bumped |
|
|
32
|
+
| 9 | `build` | `## Build` | `## Build` | always |
|
|
33
|
+
| 10 | `related` | `## İlgili` | `## Related` | always (Jira/issue ref; never `Closes/Fixes`) |
|
|
34
|
+
|
|
35
|
+
`summary`, `impact` and `test_scenarios` carry the same three section keys the
|
|
36
|
+
Jira adapter uses, and that pairing is deliberate: the same three questions get
|
|
37
|
+
answered on both surfaces, at the register each reader needs. The PR versions name
|
|
38
|
+
symbols, files, line counts and build shas. The Jira versions name screens and
|
|
39
|
+
behaviour and nothing else (`channels/jira.md`). `technical` has no Jira twin at
|
|
40
|
+
all - it is the section whose absence over there is the point.
|
|
21
41
|
|
|
22
42
|
### Section content rules
|
|
23
43
|
|
|
24
|
-
**`summary`** -
|
|
44
|
+
**`summary`** - 2-4 sentences in `outputLanguage`. What broke or what was added, where the user meets it, and the size of the effect when it is measurable (a crash count, a share of a known total, a version range). Past tense, no marketing voice. Code identifiers stay verbatim. This is the one section a reviewer reads before deciding whether to read the rest, so it names the user-visible behaviour before the mechanism.
|
|
45
|
+
|
|
46
|
+
**`technical`** - the account for someone holding the diff: a short paragraph on the mechanism (what the code was actually doing wrong, or what the new code does), then the per-file bullets, then one line of diff stat (`2 files, 8 deletions, 0 insertions`). Where a change is safe for a reason that is not obvious from the diff - an equality relation preserved, an invariant kept, a call site left alone deliberately - that reason belongs here in a sentence, because it is the question the reviewer would otherwise ask in a comment. Tables are welcome when several symbols share a property worth listing side by side.
|
|
25
47
|
|
|
26
|
-
|
|
48
|
+
The bullet list is one item per logically distinct change. Each bullet starts with the touched component and ends with a one-line "what". The source is `$WORKTREE/.pipeline/scope-check.json` `files[].reason` (Phase 3 Step 3.7): a file the dev could not justify there is a file this list cannot describe either, so the bullet quotes the gate output instead of inventing a reason. Use the stack's native file extensions / module paths - the example below shows the **shape**, not a stack lock-in:
|
|
27
49
|
|
|
28
50
|
```markdown
|
|
29
51
|
## Changes
|
|
@@ -37,20 +59,55 @@ Across stacks the same shape produces, for example: `LoginView.swift - ...` (i
|
|
|
37
59
|
|
|
38
60
|
**`architecture`** - only when the change involves a non-trivial decision (new abstraction, pattern change, data flow shift, dependency direction). Format: short paragraph stating the decision and the alternative considered. Skip the section entirely for mechanical refactors / dependency bumps / formatting passes.
|
|
39
61
|
|
|
40
|
-
**`
|
|
62
|
+
**`impact`** - four fixed numbered parts, each answered, never a placeholder. Same four questions as the Jira `impact` section, answered here with the identifiers and numbers that section is not allowed to carry:
|
|
63
|
+
|
|
64
|
+
```markdown
|
|
65
|
+
## Impact Analysis
|
|
66
|
+
|
|
67
|
+
**1 - The problem**
|
|
68
|
+
<what was wrong, since which version, with the crash/report identifiers and counts>
|
|
69
|
+
|
|
70
|
+
**2 - What was changed**
|
|
71
|
+
<the change, and why behaviour around it is unchanged>
|
|
72
|
+
|
|
73
|
+
**3 - Affected functions**
|
|
74
|
+
<the screens, flows and symbols that must be tested, including shared components the change reaches>
|
|
75
|
+
|
|
76
|
+
**4 - Effect on other systems**
|
|
77
|
+
<none, or which service, contract or channel>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
When the change deliberately fixes part of a wider problem, a closing **Risk and remaining scope** paragraph names what is still open and why it was left - a reviewer who can see the rest of the pattern in the repo will ask otherwise, and the honest answer is cheaper written down than defended in a thread.
|
|
41
81
|
|
|
42
|
-
|
|
82
|
+
**`test_scenarios`** - the same titled-scenario shape the Jira adapter uses, so the tester reads one list on both surfaces, with symbols allowed here:
|
|
43
83
|
|
|
44
84
|
```markdown
|
|
45
|
-
##
|
|
85
|
+
## Test Scenarios
|
|
86
|
+
|
|
87
|
+
**1. <what this scenario exercises>**
|
|
88
|
+
1. <step>
|
|
89
|
+
2. **Expected:** <observable outcome>
|
|
46
90
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
- Manual: <one or more user-facing steps the reviewer can follow without setup>
|
|
91
|
+
**2. <regression scenario>**
|
|
92
|
+
1. <step>
|
|
93
|
+
2. **Expected:** <what should still behave as before>
|
|
51
94
|
```
|
|
52
95
|
|
|
53
|
-
|
|
96
|
+
Reproduction scenarios first, then regressions for whatever the change could have disturbed. When a UI test target covers a scenario, say so on the scenario line and let `## Build` carry the run result - a scenario a machine already ran is not the same request as one a human has to perform, and conflating them wastes the reviewer's time.
|
|
97
|
+
|
|
98
|
+
**`build`** - what was built, on what, and what came out. Not a promise that it builds; the recorded result of the run that happened:
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## Build
|
|
102
|
+
|
|
103
|
+
- <build command or scheme> on <base branch>@<sha>: BUILD SUCCEEDED, 0 errors
|
|
104
|
+
- Tests: <test command>: <N> passed, <M> failed
|
|
105
|
+
- UI tests: <target>: <status> | not run - <reason from state.uiTest.notRunReason>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The base sha matters because "it builds" is a claim about a merge base, and the reviewer's local tree is usually not that one. `state.uiTest` supplies the third line verbatim, including its `notRunReason` - "no UI test target in this repo" is a result, not a gap, and writing it stops the same question being asked on every PR.
|
|
109
|
+
|
|
110
|
+
Pick commands for the project's stack - the pipeline supports iOS (Swift/Xcode), Android (Gradle), web (npm/pnpm/yarn) and backend (pytest/jest/go test/etc). Multi-repo PRs (one PR per repo) emit the commands for that repo's stack only - never mix iOS + Android commands into a single PR body.
|
|
54
111
|
|
|
55
112
|
**`risk`** - only when `state.diffRisk.signals` (Phase 4 Step 1.75) contains a high-stakes signal. Four fixed lines, each answered, never left as a placeholder; the source is Phase 1 `touchedAreas` plus the signals themselves, and when a signal is present the absence of this section is a Phase 6 Step 3 blocker:
|
|
56
113
|
|
|
@@ -136,7 +193,7 @@ Never use `Closes #N`, `Fixes #N`, `Resolves PROJ-X`. Issues require 4-approval
|
|
|
136
193
|
|
|
137
194
|
```
|
|
138
195
|
1. Read agent-state.json (taskId, contextLinks, identity, language).
|
|
139
|
-
2. Build section bodies in markdown - summary first, then in the table order, skipping conditional sections that don't apply. Section order is fixed: `summary` → `
|
|
196
|
+
2. Build section bodies in markdown - summary first, then in the table order, skipping conditional sections that don't apply. Section order is fixed: `summary` → `technical` → `architecture` (cond.) → `impact` → `test_scenarios` → `visuals` (cond.) → `risk` (cond.) → `dependencies` (cond.) → `build` → `related`.
|
|
140
197
|
3. Run the assembled body through the `humanizer` skill.
|
|
141
198
|
4. Apply Multi-repo cross-links (## Related PRs prepend when projects.length > 1).
|
|
142
199
|
5. Dispatch per the Behaviour-by-remote table.
|
|
@@ -220,7 +277,7 @@ The Bitbucket REST API returns `409 Conflict` if `version` is stale. Adapter beh
|
|
|
220
277
|
## Hard rules (must not regress)
|
|
221
278
|
|
|
222
279
|
- Real newlines, no HTML entities - heredoc + `jq --rawfile` + `curl --data-binary @file`. Never embed `\n` literally; Bitbucket stores the literal `\n` characters.
|
|
223
|
-
- Section order is fixed: `summary` → `
|
|
280
|
+
- Section order is fixed: `summary` → `technical` → `architecture` (cond.) → `impact` → `test_scenarios` → `visuals` (cond.) → `risk` (cond.) → `dependencies` (cond.) → `build` → `related`. Conditional sections may be omitted but never reordered or inserted between fixed ones.
|
|
224
281
|
- Humanizer pass runs **after** body assembly and **before** dispatch - every body line carries technical, non-AI tone. References at least one symbol/file/line drawn from the diff or pipeline log.
|
|
225
282
|
- Body content language follows `prefs.global.outputLanguage`. Code identifiers, file paths, branch names, PR titles, commands, type names, and `Closes/Fixes`-style keywords stay verbatim English. The template file (this doc) is English because `promptLanguage="en"` is locked; the body is rendered in the user's language at write-time.
|
|
226
283
|
- No body markers (`<!-- channels:start -->`) - channels does a full replace each run.
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Component Dispatch (Phase 3 short-circuit)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Entry conditions](#entry-conditions)
|
|
5
|
+
- [Plugin skill resolution](#plugin-skill-resolution)
|
|
6
|
+
- [Dispatch call](#dispatch-call)
|
|
7
|
+
- [Subphase contract (dispatch-layer owned)](#subphase-contract-dispatch-layer-owned)
|
|
8
|
+
- [Multi-repo report](#multi-repo-report)
|
|
9
|
+
- [Failure + resume](#failure-resume)
|
|
10
|
+
- [Short-run behaviour](#short-run-behaviour)
|
|
11
|
+
- [Cross-CLI behaviour (intentional divergence)](#cross-cli-behaviour-intentional-divergence)
|
|
12
|
+
<!-- /toc -->
|
|
13
|
+
|
|
3
14
|
> **TLDR** - When `taskType === "component"` (Figma URL in task description or instruction-driven figma workflow), multi-agent Phase 3 **does not run the TDD loop**. It delegates the entire phase to the enabled `ai-<platform>-toolkit` **marketplace plugin's** component skill (`create-component`, falling back to `create-ui-component`) via the Skill tool. Implementation lives in the plugin; multi-agent's job is classification, dispatch, and state report. The pipeline no longer bundles its own `figma-to-component` orchestrator - component skills live in one place, the plugin marketplace.
|
|
4
15
|
|
|
5
16
|
This doc is referenced from `$HOME/.claude/multi-agent-refs/phases/phase-3-dev.md`. Keeping it separate lets `phase-3-dev.md` remain tight (it's already the largest phase doc) and gives the orchestrator-report contract a stable URL for both Claude-side and Copilot-side implementations.
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Component Generation Guide (generic)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Component Architecture: Configuration / View / Modifiers](#component-architecture-configuration-view-modifiers)
|
|
5
|
+
- [Configuration Purity Rule](#configuration-purity-rule)
|
|
6
|
+
- [View Implementation](#view-implementation)
|
|
7
|
+
- [Modifier Pattern](#modifier-pattern)
|
|
8
|
+
- [Simple vs Complex Decision](#simple-vs-complex-decision)
|
|
9
|
+
- [3-Layer Test Strategy](#3-layer-test-strategy)
|
|
10
|
+
- [Component Checklist (Before Commit)](#component-checklist-before-commit)
|
|
11
|
+
- [When a Figma URL Is Provided](#when-a-figma-url-is-provided)
|
|
12
|
+
<!-- /toc -->
|
|
13
|
+
|
|
3
14
|
> Lifted out of `core/multi-agent/SKILL.md`, where it was loaded on every
|
|
4
15
|
> run of every mode. It applies only to a task that generates a UI
|
|
5
16
|
> component from a design, so it now loads when that path is taken.
|
|
@@ -4,6 +4,21 @@ description: "Convention fallback defaults for /multi-agent:analysis Phase 2b Pa
|
|
|
4
4
|
|
|
5
5
|
# Convention Defaults - Pass B Fallback Reference
|
|
6
6
|
|
|
7
|
+
<!-- toc -->
|
|
8
|
+
- [How the fallback chain works](#how-the-fallback-chain-works)
|
|
9
|
+
- [C1 - Folder Structure](#c1---folder-structure)
|
|
10
|
+
- [C2 - Class Naming](#c2---class-naming)
|
|
11
|
+
- [C3 - UI State Model](#c3---ui-state-model)
|
|
12
|
+
- [C4 - Test Method Naming](#c4---test-method-naming)
|
|
13
|
+
- [C5 - Accessibility Identifier](#c5---accessibility-identifier)
|
|
14
|
+
- [C6 - Localization Key](#c6---localization-key)
|
|
15
|
+
- [C8 - SwiftUI Preview macro (iOS only)](#c8---swiftui-preview-macro-ios-only)
|
|
16
|
+
- [C7 - Dependency Injection](#c7---dependency-injection)
|
|
17
|
+
- [Risk row template (Section 20)](#risk-row-template-section-20)
|
|
18
|
+
- [Maintenance](#maintenance)
|
|
19
|
+
- [Locked decisions that govern this file](#locked-decisions-that-govern-this-file)
|
|
20
|
+
<!-- /toc -->
|
|
21
|
+
|
|
7
22
|
`/multi-agent:analysis` Phase 1c extracts conventions from each selected repo (folder structure, class naming, state model, test naming, accessibility identifier, localization key, DI registration). When `confidence == "none"` AND the standards binding source (`evidence.standards[]`) does not provide an explicit rule, Pass B falls back to the platform defaults catalogued here. Every applied default emits a row in Section 20 Risks of the rendered document.
|
|
8
23
|
|
|
9
24
|
> **Language**: This file is read as a system prompt. Prose stays English. Examples carry generic placeholder names (`Foo`, `Bar`); the runtime substitutes the actual feature slug.
|
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
# Cross-CLI Contract (Claude Code · Copilot CLI · Codex CLI)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [1. Command Inventory (56 commands)](#1-command-inventory-56-commands)
|
|
5
|
+
- [2. Canonical Placeholder Vocabulary](#2-canonical-placeholder-vocabulary)
|
|
6
|
+
- [2.6 Intentional structural divergence - thin dispatcher vs inlined orchestrator](#26-intentional-structural-divergence---thin-dispatcher-vs-inlined-orchestrator)
|
|
7
|
+
- [3. Frontmatter Transform Rules (Claude ↔ Copilot)](#3-frontmatter-transform-rules-claude-copilot)
|
|
8
|
+
- [4. Progress Signalling Parity](#4-progress-signalling-parity)
|
|
9
|
+
- [5. Argument Parsing Invariants](#5-argument-parsing-invariants)
|
|
10
|
+
- [6. Output Format Expectations](#6-output-format-expectations)
|
|
11
|
+
- [7. Platform Guards (macOS)](#7-platform-guards-macos)
|
|
12
|
+
- [8. Enforcement](#8-enforcement)
|
|
13
|
+
- [9. Change Control](#9-change-control)
|
|
14
|
+
<!-- /toc -->
|
|
15
|
+
|
|
3
16
|
> **Non-negotiable**. Any change that breaks this contract blocks merge. Validated by `smoke-cross-cli-behavior.sh`.
|
|
4
17
|
|
|
5
18
|
**Purpose**: every pipeline command must produce identical artifacts (state, logs, outputs) and respect identical placeholder vocabulary regardless of which of the three host CLIs invokes it. This file is the source of truth for "what must stay the same."
|
|
6
19
|
|
|
7
20
|
---
|
|
8
21
|
|
|
9
|
-
## 1. Command Inventory (
|
|
22
|
+
## 1. Command Inventory (56 commands)
|
|
10
23
|
|
|
11
24
|
```
|
|
12
|
-
analysis, analysis-jira, analysis-resolve, autopilot,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
25
|
+
analysis, analysis-jira, analysis-resolve, autopilot, autopilot-off,
|
|
26
|
+
autopilot-on, autopilot-status, build-optimize, channels, complaint-analysis,
|
|
27
|
+
create-jira, design-check, diff-explain, doctor, feedback, forget,
|
|
28
|
+
garbage-collect, graph, help, ios-coding-standard, issue, jira, kill,
|
|
29
|
+
language, local, local-autopilot, log, manual-test, prune-logs,
|
|
16
30
|
prune-prompts, purge, refactor, resume, resume-local, review,
|
|
17
31
|
review-analysis, review-issue, review-jira, routines, save, scan, search,
|
|
18
32
|
setup, stack, status, steer, store-ready, sync, test, test-accessibility,
|
|
@@ -263,6 +277,35 @@ Every phase boundary MUST call EITHER TaskCreate/Update (Claude) OR `phase-track
|
|
|
263
277
|
|
|
264
278
|
`phase-banner.sh` runs on both CLIs. Same output format, no Claude-only or Copilot-only flair.
|
|
265
279
|
|
|
280
|
+
### 4.4 Continuous mode
|
|
281
|
+
|
|
282
|
+
`autopilot-on`, `autopilot-off` and `autopilot-status` ship to all three hosts and
|
|
283
|
+
behave identically there, because the thing they control is not a CLI feature:
|
|
284
|
+
it is a launchd user agent whose tick spawns a `claude --bg` child regardless of
|
|
285
|
+
which CLI you typed the command in. Continuous mode therefore requires the
|
|
286
|
+
`claude` binary on `PATH` on every host, Copilot and Codex included, and there is
|
|
287
|
+
no Copilot or Codex equivalent of the child.
|
|
288
|
+
|
|
289
|
+
| Concept | Claude Code | Copilot CLI | Codex CLI |
|
|
290
|
+
|---|---|---|---|
|
|
291
|
+
| Turn the mode on | `/multi-agent:autopilot-on` | `/multi-agent-autopilot-on` | `multi-agent autopilot-on` via the router skill |
|
|
292
|
+
| Scripts, libs, templates | `~/.claude/{scripts,lib,templates}` | `~/.copilot/...` | `~/.codex/...` |
|
|
293
|
+
| Which one is read | `ma_ap_asset <rel>` resolves the caller's own tree first, then the other two | same | same |
|
|
294
|
+
| Queue and config state | `~/.claude/autopilot/` | `~/.claude/autopilot/` | `~/.claude/autopilot/` |
|
|
295
|
+
| In-flight rows on the widget | `autopilot-status --subjects` into `TaskUpdate` | into the reprinted card | into `update_plan` |
|
|
296
|
+
|
|
297
|
+
The state row is the one that looks wrong and is not. `~/.claude/autopilot/` is
|
|
298
|
+
shared across hosts on purpose, exactly like `logs/`, `knowledge/` and
|
|
299
|
+
`multi-agent-preferences.json` (2.6, "shared state is deliberately NOT
|
|
300
|
+
retargeted"): two CLIs on one machine must read ONE queue. A per-host state root
|
|
301
|
+
would give a Copilot session a second, invisible queue and the same ticket would
|
|
302
|
+
be taken twice.
|
|
303
|
+
|
|
304
|
+
Everything that is NOT state resolves per host, and that half had to be fixed:
|
|
305
|
+
`templates/` was laid down only by `install/claude.mjs`, so `autopilot-on` on a
|
|
306
|
+
Codex-only machine rendered a launchd job from a file the host did not have.
|
|
307
|
+
`smoke-autopilot-hosts.sh` holds the line.
|
|
308
|
+
|
|
266
309
|
---
|
|
267
310
|
|
|
268
311
|
## 5. Argument Parsing Invariants
|
|
@@ -337,6 +380,7 @@ installs on.
|
|
|
337
380
|
|
|
338
381
|
This contract is validated by:
|
|
339
382
|
|
|
383
|
+
- `smoke-autopilot-hosts.sh` - asserts continuous mode resolves its scripts, libs and plist template into whichever host tree is installed, and that the state root is NOT retargeted (4.4)
|
|
340
384
|
- `smoke-cross-cli-behavior.sh` - asserts every command behaves identically, pulls from Section 2 (placeholder vocab), Section 5 (argument parsing), Section 6 (output formats); also regression-locks the 8-persona agent deployment
|
|
341
385
|
- `smoke-commands-skills-parity.sh` (two assertions per command) - enforces colon-form command ↔ dash-form skill directory parity
|
|
342
386
|
- `smoke-compliance-skills.sh` - enforces store-compliance skill catalog + 4 consumer wiring
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# analysis-jira - an analysis document, read as work
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [The marker gate runs first, before any network call](#the-marker-gate-runs-first-before-any-network-call)
|
|
5
|
+
- [Coverage is two-way, and the second direction is the useful one](#coverage-is-two-way-and-the-second-direction-is-the-useful-one)
|
|
6
|
+
- [An unverifiable run is allowed; looking verified is not](#an-unverifiable-run-is-allowed-looking-verified-is-not)
|
|
7
|
+
- [Identity is a label, not a title](#identity-is-a-label-not-a-title)
|
|
8
|
+
- [The write is ledgered](#the-write-is-ledgered)
|
|
9
|
+
- [An existing node is skipped, never updated](#an-existing-node-is-skipped-never-updated)
|
|
10
|
+
- [Every site-specific name is a VALUE, never a schema key](#every-site-specific-name-is-a-value-never-a-schema-key)
|
|
11
|
+
- [Auth](#auth)
|
|
12
|
+
<!-- /toc -->
|
|
13
|
+
|
|
3
14
|
`/multi-agent:analysis-jira` turns a rendered analysis document into a Jira tree.
|
|
4
15
|
Two files do it, and the split is the design:
|
|
5
16
|
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Design conformance - the component walk, and why a glance is not a pass
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [1. Enumerate first, then fill every cell](#1-enumerate-first-then-fill-every-cell)
|
|
5
|
+
- [2. Measure, never read the token](#2-measure-never-read-the-token)
|
|
6
|
+
- [3. Adaptive per-component convergence](#3-adaptive-per-component-convergence)
|
|
7
|
+
- [4. Scope tags - how an item is verified](#4-scope-tags---how-an-item-is-verified)
|
|
8
|
+
- [5. The catalog](#5-the-catalog)
|
|
9
|
+
- [6. Output](#6-output)
|
|
10
|
+
- [7. What a token catalog is, and why none ships here](#7-what-a-token-catalog-is-and-why-none-ships-here)
|
|
11
|
+
<!-- /toc -->
|
|
12
|
+
|
|
3
13
|
A design audit that reads a screen top to bottom and reports what looks wrong
|
|
4
14
|
finds about one defect per element: the wrong font on a label, and not that same
|
|
5
15
|
label's wrong colour and wrong inset. This file is the catalog, and the three
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# doctor - the check registry
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [What the exit code means](#what-the-exit-code-means)
|
|
5
|
+
- [What BLOCK means, exactly](#what-block-means-exactly)
|
|
6
|
+
- [Who calls it, and what they do with the code](#who-calls-it-and-what-they-do-with-the-code)
|
|
7
|
+
- [The four severities](#the-four-severities)
|
|
8
|
+
- [The line shape](#the-line-shape)
|
|
9
|
+
- [It recommends, it never fixes](#it-recommends-it-never-fixes)
|
|
10
|
+
- [Checks](#checks)
|
|
11
|
+
<!-- /toc -->
|
|
12
|
+
|
|
3
13
|
Every check `/multi-agent:doctor` can report has a `### <id>` heading here, and
|
|
4
14
|
`doctor.mjs --list-checks` prints exactly the same set. The equality is checked
|
|
5
15
|
in both directions by `smoke-doctor.sh`: a check that ships without an entry
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Feature: External Context Injection (Phase 1 Step 1.5)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Dispatch table](#dispatch-table)
|
|
5
|
+
- [Exit code handling](#exit-code-handling)
|
|
6
|
+
- [Prompt injection shape](#prompt-injection-shape)
|
|
7
|
+
- [Log line shape](#log-line-shape)
|
|
8
|
+
<!-- /toc -->
|
|
9
|
+
|
|
3
10
|
Phase 0 Step 1b catalogued every typed external link from the task description into `state.contextLinks[]`. Phase 1 dispatches each entry to its matching fetcher and prepends the result to the analysis prompt under a **Referenced External Sources** section, so the agent doesn't re-discover what the ticket already pointed at.
|
|
4
11
|
|
|
5
12
|
```bash
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Related-issue context at intake
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [What it costs](#what-it-costs)
|
|
5
|
+
- [Shape](#shape)
|
|
6
|
+
- [Settings](#settings)
|
|
7
|
+
- [Maturity](#maturity)
|
|
8
|
+
- [Where it goes](#where-it-goes)
|
|
9
|
+
- [Not included](#not-included)
|
|
10
|
+
<!-- /toc -->
|
|
11
|
+
|
|
3
12
|
A development sub-task is often filed with no description of its own. The
|
|
4
13
|
requirement sits on the parent, and the rest of the picture - the analysis, the
|
|
5
14
|
test scope - sits on the sibling sub-tasks beside it. The fetcher already read
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Model Fallback Contract
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Tier ladder](#tier-ladder)
|
|
5
|
+
- [Prefs knob](#prefs-knob)
|
|
6
|
+
- [Turning the fable rung off](#turning-the-fable-rung-off)
|
|
7
|
+
- [Triggers (checked in this order)](#triggers-checked-in-this-order)
|
|
8
|
+
- [Logging](#logging)
|
|
9
|
+
- [Non-goals](#non-goals)
|
|
10
|
+
- [Codex CLI](#codex-cli)
|
|
11
|
+
<!-- /toc -->
|
|
12
|
+
|
|
3
13
|
> Contract last revised in **v10.6.0** (Fable 5 restored as top tier). The version tag here tracks the last substantive change to this contract, not the pipeline release.
|
|
4
14
|
|
|
5
15
|
Personas route to the top available intelligence tier they declare in
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Skill conformance - reviewing against the criteria the work was built to
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Why this exists](#why-this-exists)
|
|
5
|
+
- [The four rules that make it work](#the-four-rules-that-make-it-work)
|
|
6
|
+
- [Registry discovery is declared, never sniffed](#registry-discovery-is-declared-never-sniffed)
|
|
7
|
+
- [Scope is required, and it is what makes this stack-generic](#scope-is-required-and-it-is-what-makes-this-stack-generic)
|
|
8
|
+
- [What is deterministic here, and what is deliberately not](#what-is-deterministic-here-and-what-is-deliberately-not)
|
|
9
|
+
- [The one bespoke scan: exception markers](#the-one-bespoke-scan-exception-markers)
|
|
10
|
+
- [Dev-mode substitutes (Phases 1 and 2 never ran)](#dev-mode-substitutes-phases-1-and-2-never-ran)
|
|
11
|
+
- [Invocation](#invocation)
|
|
12
|
+
- [Handoff to the reviewers](#handoff-to-the-reviewers)
|
|
13
|
+
- [Preference](#preference)
|
|
14
|
+
<!-- /toc -->
|
|
15
|
+
|
|
3
16
|
> **TLDR** - Phase 4 Step 1.78 resolves, deterministically and before any reviewer runs, WHAT the changed code was supposed to honour: declared rule registries scoped to the diff's languages, in-repo module guides, and the toolchains those registries delegate to. The result is `criteria-manifest.json`: a bounded set of rule IDs that becomes the denominator for "was this applied completely". Reviewers answer per rule ID. An ID that is neither checked nor explicitly waived fails the stage.
|
|
4
17
|
|
|
5
18
|
## Why this exists
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Step 1b - URL Enrichment (Phase 0)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Step 1b.0 - Extract context links (always runs)](#step-1b0---extract-context-links-always-runs)
|
|
5
|
+
- [Step 1b.1 - Firebase Crashlytics deep fetch (runs when `type == "crashlytics"` present in `state.contextLinks[]`)](#step-1b1---firebase-crashlytics-deep-fetch-runs-when-type-crashlytics-present-in-statecontextlinks)
|
|
6
|
+
- [Step 1b.2 - Fortify SSC deep fetch (runs when `type == "fortify"` present in `state.contextLinks[]`)](#step-1b2---fortify-ssc-deep-fetch-runs-when-type-fortify-present-in-statecontextlinks)
|
|
7
|
+
- [Step 1b.3 - Graylog deep fetch (runs when `type == "graylog"` present in `state.contextLinks[]`)](#step-1b3---graylog-deep-fetch-runs-when-type-graylog-present-in-statecontextlinks)
|
|
8
|
+
- [Step 1b.3b - Document fetch (runs when `type == "document"` present)](#step-1b3b---document-fetch-runs-when-type-document-present)
|
|
9
|
+
- [Step 1b.4 - Other link types (catalogued only at Phase 0; fetched at Phase 1)](#step-1b4---other-link-types-catalogued-only-at-phase-0-fetched-at-phase-1)
|
|
10
|
+
<!-- /toc -->
|
|
11
|
+
|
|
3
12
|
> Loaded on demand from `phases/phase-0-init.md` Step 1b. It lives here rather
|
|
4
13
|
> than inline because it applies only to a task that carries URLs: a bare Jira
|
|
5
14
|
> ID, a GitHub issue number, or a free-text task never needs any of it, yet every
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Visual evidence - before/after screenshots and the UI flow video
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [1. When it is required](#1-when-it-is-required)
|
|
5
|
+
- [2. Before - the reporter's screenshot, or nothing](#2-before---the-reporters-screenshot-or-nothing)
|
|
6
|
+
- [3. After - Phase 3, not Phase 5](#3-after---phase-3-not-phase-5)
|
|
7
|
+
- [4. Video - the recording rides on a test run](#4-video---the-recording-rides-on-a-test-run)
|
|
8
|
+
- [5. Size, and what happens when it does not fit](#5-size-and-what-happens-when-it-does-not-fit)
|
|
9
|
+
- [5b. Where the artefacts live - the host](#5b-where-the-artefacts-live---the-host)
|
|
10
|
+
- [6. Rendering](#6-rendering)
|
|
11
|
+
- [7. Blocker](#7-blocker)
|
|
12
|
+
- [8. State](#8-state)
|
|
13
|
+
<!-- /toc -->
|
|
14
|
+
|
|
3
15
|
A UI fix that reads as three changed files in a diff is not reviewable. The
|
|
4
16
|
reviewer cannot see what was wrong, and the tester cannot see what to look for.
|
|
5
17
|
This contract makes the pipeline carry the picture: the state the reporter saw,
|
|
@@ -59,19 +71,31 @@ EVIDENCE_PLATFORM=""
|
|
|
59
71
|
case " $MA_STACKS " in
|
|
60
72
|
*" ios "*) EVIDENCE_PLATFORM=ios ;;
|
|
61
73
|
*" android "*) EVIDENCE_PLATFORM=android ;;
|
|
74
|
+
*" web "*) EVIDENCE_PLATFORM=web ;;
|
|
62
75
|
esac
|
|
63
76
|
```
|
|
64
77
|
|
|
65
78
|
iOS wins a tie, and the tie is recorded in `stackWhy`: `simctl` discovery is the
|
|
66
79
|
cheaper of the two, and a repo that is honestly both gets the same answer on
|
|
67
|
-
every run rather than one that depends on ordering.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
not
|
|
80
|
+
every run rather than one that depends on ordering. Web is last for the same
|
|
81
|
+
reason and not because it is lesser: a repo that is both iOS and web is a mobile
|
|
82
|
+
app with a marketing site, and the screen the ticket is about is the mobile one.
|
|
83
|
+
|
|
84
|
+
**Web is a device platform here.** It was not until v17.1.0, and the omission was
|
|
85
|
+
not a decision anyone made: `run-ui-tests.sh` rejected everything but
|
|
86
|
+
`ios|android`, so a repo with a full Playwright suite reported "no UI test
|
|
87
|
+
target". The PR body then said UI tests had not run, which was true of the runner
|
|
88
|
+
and false of the repo - the exact shape of claim this file exists to prevent. The
|
|
89
|
+
browser is the device, the runner is the recorder (both Playwright and Cypress
|
|
90
|
+
write their own video), and `npx --no-install` is what keeps a probe from
|
|
91
|
+
installing one behind the user's back.
|
|
92
|
+
|
|
93
|
+
**An empty value is still a real outcome, not an error.** A backend-only repo has
|
|
94
|
+
nothing to probe, and `probe-evidence-capability.sh` rejects anything but
|
|
95
|
+
`ios|android|web` with exit 2. So when `EVIDENCE_PLATFORM` is empty the probe
|
|
96
|
+
**does not run**, `platform` is written as `other` from `MA_STACKS`, and the
|
|
73
97
|
reason goes to `state.evidenceCapability.skippedReason` in the probe's own
|
|
74
|
-
`*_REASON` idiom - "no device platform in stacks [
|
|
98
|
+
`*_REASON` idiom - "no device platform in stacks [backend]". Passing an empty
|
|
75
99
|
string instead is what the probe's exit 2 exists to refuse, and swallowing that
|
|
76
100
|
exit would turn a missing value into a silent skip.
|
|
77
101
|
|
|
@@ -210,6 +234,36 @@ capture of a static screen.
|
|
|
210
234
|
`visualEvidence.enabled` turns the whole feature off - capture, upload, both
|
|
211
235
|
render sections and the Phase 6 blocker with it.
|
|
212
236
|
|
|
237
|
+
### 4.6 Web - the recorder IS the runner
|
|
238
|
+
|
|
239
|
+
Web is a real evidence platform: the schema has it in `visualEvidence.platform`,
|
|
240
|
+
the probe opens tier 1 and tier 2 for it, and `run-ui-tests.sh` has a web arm.
|
|
241
|
+
What it does NOT share with iOS and Android is the recording model, and forcing
|
|
242
|
+
it to would record the same run twice - Playwright and Cypress write the video
|
|
243
|
+
themselves.
|
|
244
|
+
|
|
245
|
+
| Step | iOS / Android | Web |
|
|
246
|
+
|---|---|---|
|
|
247
|
+
| `after` | screenshot the booted device | drive a browser at a URL |
|
|
248
|
+
| the URL | not needed, a simulator already shows something | `--url`, else `prefs.global.visualEvidence.webBaseUrl`, else a gap with that reason |
|
|
249
|
+
| `video start` | spawn a recorder, hold its pid | write a marker with the current time; spawn nothing |
|
|
250
|
+
| `video stop` | kill the recorder, pull the file | harvest the newest video under `test-results/` or `cypress/videos/` written AFTER the marker |
|
|
251
|
+
| container | mp4 already | webm re-encoded to h264, for the same reason the iOS arm re-encodes: that is what the Jira preview and the PR body play |
|
|
252
|
+
|
|
253
|
+
The marker is the part that matters and the part that is easy to leave out. Without
|
|
254
|
+
a timestamp to compare against, `stop` harvests whatever video is lying around -
|
|
255
|
+
and a video from yesterday's run attached as today's evidence is worse than no
|
|
256
|
+
video, because an artefact that is present does not get re-checked.
|
|
257
|
+
|
|
258
|
+
Two honest gaps, both exit 4 with a reason rather than a failure: no address to
|
|
259
|
+
point at, and a project whose runner config does not record video at all. Neither
|
|
260
|
+
is a phase failure; both are recorded and shown.
|
|
261
|
+
|
|
262
|
+
Every browser call goes through `npx --no-install`, never a bare `npx`. A bare one
|
|
263
|
+
DOWNLOADS the browser stack, which turns "this project has no browser tooling"
|
|
264
|
+
into a silent network fetch. `run-ui-tests.sh` carries the same rule for the same
|
|
265
|
+
reason, and it is the line that keeps the pipeline's own dependency list empty.
|
|
266
|
+
|
|
213
267
|
## 5. Size, and what happens when it does not fit
|
|
214
268
|
|
|
215
269
|
Jira's attachment ceiling is an instance setting, so it is a preference:
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Generate Issue - Shared Flow (generate)
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Hard rules (must not regress)](#hard-rules-must-not-regress)
|
|
5
|
+
- [Standard templates](#standard-templates)
|
|
6
|
+
- [Flow](#flow)
|
|
7
|
+
- [Error paths](#error-paths)
|
|
8
|
+
<!-- /toc -->
|
|
9
|
+
|
|
3
10
|
> **TLDR** - Shared 12-step flow for `/multi-agent:create-jira`. Asks the issue type (Task / Bug / Story), mines the target project's existing same-type issues to learn team conventions, detects the active sprint, drafts a standards-compliant issue from a fixed standard template with auto-sizing sections, asks the user about every genuinely unknown field, renders a full preview, and creates the Jira issue only after explicit approval. Creates exactly one Jira issue per run - no branches, no commits, no worktrees.
|
|
4
11
|
|
|
5
12
|
Consumed by `create-jira/SKILL.md`. This ref is never invoked directly.
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Issue → Jira → Wiki Triad
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [The triad at a glance](#the-triad-at-a-glance)
|
|
5
|
+
- [Phase 0 auto-create policy](#phase-0-auto-create-policy)
|
|
6
|
+
- [Phase 7 wiki → Jira comment](#phase-7-wiki-jira-comment)
|
|
7
|
+
- [Autopilot behaviour](#autopilot-behaviour)
|
|
8
|
+
- [Preferences involved](#preferences-involved)
|
|
9
|
+
- [Cross-CLI parity](#cross-cli-parity)
|
|
10
|
+
<!-- /toc -->
|
|
11
|
+
|
|
3
12
|
> **TLDR** - When a GitHub issue triggers the pipeline and has no Jira ID, the `autoJiraFromGithubIssue` policy decides whether to auto-create a Jira task (and patch the GitHub issue body with the new Jira link). Phase 7 then posts a humanizer'd wiki-content summary back as a Jira comment, closing the loop. Autopilot treats `ask` as `always`.
|
|
4
13
|
|
|
5
14
|
This doc is referenced from `$HOME/.claude/multi-agent-refs/phases/phase-0-init.md` Step 1 (GitHub issue input) and `$HOME/.claude/multi-agent-refs/phases/phase-7-report.md` Step 2 (component wiki). Keeps the phase docs tight and gives the triad contract a stable home.
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
## Project Knowledge Base
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Project Knowledge Base](#project-knowledge-base)
|
|
5
|
+
- [Retrieval order, and what each layer costs](#retrieval-order-and-what-each-layer-costs)
|
|
6
|
+
- [Skill Injection Strategy](#skill-injection-strategy)
|
|
7
|
+
<!-- /toc -->
|
|
8
|
+
|
|
3
9
|
An incrementally growing knowledge system for each project, enabling knowledge transfer across sessions.
|
|
4
10
|
|
|
5
11
|
### Directory Structure
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Multi-Repo Integration Build - Learn Once, Auto-Apply
|
|
2
2
|
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [Why this exists](#why-this-exists)
|
|
5
|
+
- [When this rule fires](#when-this-rule-fires)
|
|
6
|
+
- [Learn-once prompt (first encounter of a combo)](#learn-once-prompt-first-encounter-of-a-combo)
|
|
7
|
+
- [Auto-run steps (when host is learned)](#auto-run-steps-when-host-is-learned)
|
|
8
|
+
- [Error evaluation contract](#error-evaluation-contract)
|
|
9
|
+
- [Autopilot behavior](#autopilot-behavior)
|
|
10
|
+
- [Phase 7 knowledge capture](#phase-7-knowledge-capture)
|
|
11
|
+
- [Generic rule (for copilot-instructions.md)](#generic-rule-for-copilot-instructionsmd)
|
|
12
|
+
- [Schema](#schema)
|
|
13
|
+
- [Smoke coverage](#smoke-coverage)
|
|
14
|
+
<!-- /toc -->
|
|
15
|
+
|
|
3
16
|
> **TLDR** - When a task touches ≥2 repos that have a producer→consumer dependency (e.g. shared codegen library + consuming UI library), the pipeline MUST build the **host project** that integrates them before commit/PR. Codegen mismatches (nested vs flat keys, missing entries, overwritten files) only surface when the full dependency chain builds together. Building repos in isolation gives false confidence.
|
|
4
17
|
>
|
|
5
18
|
> The pipeline **learns** the host per repo-combo once, persists to `prefs.global.multiRepoIntegrationHosts`, and auto-applies on subsequent runs.
|
|
@@ -8,6 +8,13 @@
|
|
|
8
8
|
|
|
9
9
|
## Autopilot Mode
|
|
10
10
|
|
|
11
|
+
<!-- toc -->
|
|
12
|
+
- [Autopilot Mode](#autopilot-mode)
|
|
13
|
+
- [Pipeline depth (Full / Short)](#pipeline-depth-full-short)
|
|
14
|
+
- [Analysis Mode (`/multi-agent:analysis`)](#analysis-mode-multi-agentanalysis)
|
|
15
|
+
- [Local Mode (`--local`)](#local-mode---local)
|
|
16
|
+
<!-- /toc -->
|
|
17
|
+
|
|
11
18
|
Autopilot mode skips interactive confirmations and runs the pipeline end-to-end autonomously.
|
|
12
19
|
|
|
13
20
|
**Activation**: Add `autopilot` flag to any pipeline command:
|
|
@@ -8,6 +8,15 @@
|
|
|
8
8
|
|
|
9
9
|
## Task ID System
|
|
10
10
|
|
|
11
|
+
<!-- toc -->
|
|
12
|
+
- [Task ID System](#task-id-system)
|
|
13
|
+
- [Kill Logic](#kill-logic)
|
|
14
|
+
- [Clear Logs](#clear-logs)
|
|
15
|
+
- [Purge (Full Reset)](#purge-full-reset)
|
|
16
|
+
- [Resume Logic](#resume-logic)
|
|
17
|
+
- [Phase Pipeline](#phase-pipeline)
|
|
18
|
+
<!-- /toc -->
|
|
19
|
+
|
|
11
20
|
Every task gets an auto-incremented short ID. Counter stored at `$HOME/.claude/logs/multi-agent/{project}/.counter` (persists across sessions).
|
|
12
21
|
|
|
13
22
|
```
|
|
@@ -598,7 +598,7 @@ Decide, then probe, then ask, then run. Skipped only when `visualEvidence.enable
|
|
|
598
598
|
```bash
|
|
599
599
|
eval "$(bash $HOME/.claude/lib/stack-detect.sh "$PROJECT_ROOT")"
|
|
600
600
|
EVIDENCE_PLATFORM=""
|
|
601
|
-
case " $MA_STACKS " in *" ios "*) EVIDENCE_PLATFORM=ios ;; *" android "*) EVIDENCE_PLATFORM=android ;; esac
|
|
601
|
+
case " $MA_STACKS " in *" ios "*) EVIDENCE_PLATFORM=ios ;; *" android "*) EVIDENCE_PLATFORM=android ;; *" web "*) EVIDENCE_PLATFORM=web ;; esac
|
|
602
602
|
if [ -n "$EVIDENCE_PLATFORM" ]; then
|
|
603
603
|
eval "$(bash $HOME/.claude/scripts/probe-evidence-capability.sh \
|
|
604
604
|
--platform "$EVIDENCE_PLATFORM" --repo "$WORKTREE" \
|
|
@@ -606,7 +606,7 @@ if [ -n "$EVIDENCE_PLATFORM" ]; then
|
|
|
606
606
|
fi
|
|
607
607
|
```
|
|
608
608
|
|
|
609
|
-
Empty is an outcome, not a failure:
|
|
609
|
+
Empty is an outcome, not a failure: backend has no device, so the probe does not run and `evidenceCapability.skippedReason` says so. Web does: the browser the runner drives is the device (4.6). No `--changed` yet, by the same token.
|
|
610
610
|
|
|
611
611
|
One run, both forms: stdout is `EVIDENCE_*` (shell-quoted, so the eval is safe), and the same measurement lands as JSON.
|
|
612
612
|
|