@mmerterden/multi-agent-pipeline 20.35.0 → 20.37.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 +26 -0
- package/README.md +6 -5
- package/README.tr.md +6 -5
- package/docs/architecture.md +3 -3
- package/docs/ecosystem.md +5 -5
- package/docs/facts.json +4 -4
- package/install/catalog-history.json +1 -1
- package/manifest.json +210 -136
- package/package.json +5 -1
- package/pipeline/commands/multi-agent/SKILL.md +33 -154
- package/pipeline/commands/multi-agent/analysis/SKILL.md +14 -68
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +5 -8
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +38 -109
- package/pipeline/commands/multi-agent/channels/SKILL.md +38 -167
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +37 -144
- package/pipeline/commands/multi-agent/design-check/SKILL.md +27 -131
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +22 -48
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +37 -180
- package/pipeline/commands/multi-agent/jira/SKILL.md +16 -46
- package/pipeline/commands/multi-agent/office-pair/SKILL.md +66 -0
- package/pipeline/commands/multi-agent/office-status/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/refactor/SKILL.md +23 -184
- package/pipeline/commands/multi-agent/resume/SKILL.md +30 -136
- package/pipeline/commands/multi-agent/review/SKILL.md +24 -199
- package/pipeline/commands/multi-agent/setup/SKILL.md +25 -181
- package/pipeline/commands/multi-agent/stack/SKILL.md +9 -53
- package/pipeline/commands/multi-agent/status/SKILL.md +13 -2
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +27 -226
- package/pipeline/commands/multi-agent/sync/SKILL.md +38 -167
- package/pipeline/commands/multi-agent/test-gen/SKILL.md +2 -4
- package/pipeline/commands/multi-agent/update/SKILL.md +18 -60
- package/pipeline/contract/CHANGELOG.md +9 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
- package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
- package/pipeline/contract/fixtures/error-unsigned.json +1 -1
- package/pipeline/contract/fixtures/runs-awaiting-question.json +1 -1
- package/pipeline/contract/fixtures/runs-empty.json +1 -1
- package/pipeline/contract/fixtures/runs-failed.json +1 -1
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +1 -1
- package/pipeline/contract/fixtures/runs-pr-opened.json +1 -1
- package/pipeline/contract/fixtures/runs-running.json +1 -1
- package/pipeline/contract/manifest.json +5 -5
- package/pipeline/contract/types/index.d.ts +3 -2
- package/pipeline/lib/qr-code.mjs +26 -0
- package/pipeline/multi-agent-refs/autopilot-on/details.md +148 -0
- package/pipeline/multi-agent-refs/channels/generator.md +14 -0
- package/pipeline/multi-agent-refs/channels/preview.md +13 -0
- package/pipeline/multi-agent-refs/channels/reference.md +46 -0
- package/pipeline/multi-agent-refs/complaint-analysis/phases.md +159 -0
- package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
- package/pipeline/multi-agent-refs/design-check/export.md +1 -0
- package/pipeline/multi-agent-refs/design-check/init-inventory.md +1 -1
- package/pipeline/multi-agent-refs/design-check/scope-and-ledger.md +64 -0
- package/pipeline/multi-agent-refs/features/analysis-command-notes.md +53 -0
- package/pipeline/multi-agent-refs/garbage-collect/phases.md +60 -0
- package/pipeline/multi-agent-refs/help/en.md +1 -0
- package/pipeline/multi-agent-refs/help/tr.md +1 -0
- package/pipeline/multi-agent-refs/ios-coding-standard/plan.md +71 -0
- package/pipeline/multi-agent-refs/ios-coding-standard/resolve-and-scan.md +135 -0
- package/pipeline/multi-agent-refs/jira/picker-detail.md +71 -0
- package/pipeline/multi-agent-refs/orchestrator/copilot-pipeline.md +88 -0
- package/pipeline/multi-agent-refs/orchestrator/dispatcher.md +96 -1
- package/pipeline/multi-agent-refs/refactor/sweep.md +190 -0
- package/pipeline/multi-agent-refs/resume/details.md +115 -2
- package/pipeline/multi-agent-refs/review/inputs.md +33 -1
- package/pipeline/multi-agent-refs/review/module-guides.md +9 -1
- package/pipeline/multi-agent-refs/review/panel.md +75 -0
- package/pipeline/multi-agent-refs/review/valven.md +5 -1
- package/pipeline/multi-agent-refs/setup/hooks-and-plugins.md +4 -0
- package/pipeline/multi-agent-refs/setup/token-save-flow.md +13 -0
- package/pipeline/multi-agent-refs/stack/background.md +72 -0
- package/pipeline/multi-agent-refs/store-ready/gates.md +139 -0
- package/pipeline/multi-agent-refs/store-ready/report.md +40 -2
- package/pipeline/multi-agent-refs/sync/office.md +10 -0
- package/pipeline/multi-agent-refs/sync/overview.md +61 -0
- package/pipeline/multi-agent-refs/sync/repo.md +91 -0
- package/pipeline/multi-agent-refs/update/details.md +83 -0
- package/pipeline/schemas/runs-index.schema.json +2 -1
- package/pipeline/scripts/contract-server.mjs +1 -1
- package/pipeline/scripts/office-pair.mjs +40 -9
- package/pipeline/scripts/runs-index.mjs +34 -7
- package/pipeline/scripts/status-overview.mjs +401 -0
- package/pipeline/skills/.skill-manifest.json +69 -65
- package/pipeline/skills/.skills-index.json +15 -4
- package/pipeline/skills/shared/README.md +4 -3
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +8 -71
- package/pipeline/skills/shared/core/apple-archive-compliance/references/examples.md +67 -0
- package/pipeline/skills/shared/core/apple-archive-compliance/references/version-history.md +8 -0
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +11 -73
- package/pipeline/skills/shared/core/google-play-compliance/references/examples.md +69 -0
- package/pipeline/skills/shared/core/google-play-compliance/references/notes.md +7 -0
- package/pipeline/skills/shared/core/google-play-compliance/references/version-history.md +5 -0
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +39 -262
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +35 -73
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +37 -337
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +27 -122
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +8 -340
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +37 -180
- package/pipeline/skills/shared/core/multi-agent-office-pair/SKILL.md +19 -0
- package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +23 -184
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +14 -82
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +25 -277
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +13 -2
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +75 -219
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +11 -162
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-code.md +257 -0
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +7 -58
- package/pipeline/skills/shared/external/android-architecture/references/code-examples.md +68 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +3 -45
- package/pipeline/skills/shared/external/app-intents/references/code-examples.md +54 -0
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +5 -81
- package/pipeline/skills/shared/external/app-store-optimization/references/engagement-and-localization.md +96 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +6 -112
- package/pipeline/skills/shared/external/app-store-review/references/monetization-and-submission.md +138 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +10 -117
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models-code.md +186 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +3 -50
- package/pipeline/skills/shared/external/authentication/references/code-examples.md +59 -0
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +3 -84
- package/pipeline/skills/shared/external/callkit-voip/references/code-examples.md +93 -0
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +7 -263
- package/pipeline/skills/shared/external/ci-cd-pipelines/references/pipeline-examples.md +281 -0
- package/pipeline/skills/shared/external/clean-code/SKILL.md +8 -41
- package/pipeline/skills/shared/external/clean-code/references/code-examples.md +56 -0
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +8 -146
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-code.md +214 -0
- package/pipeline/skills/shared/external/compose-components/SKILL.md +6 -80
- package/pipeline/skills/shared/external/compose-components/references/code-examples.md +89 -0
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +5 -64
- package/pipeline/skills/shared/external/compose-navigation/references/code-examples.md +70 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +9 -157
- package/pipeline/skills/shared/external/core-data/references/core-data-code.md +221 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +3 -89
- package/pipeline/skills/shared/external/core-nfc/references/code-examples.md +98 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +17 -133
- package/pipeline/skills/shared/external/coreml/references/coreml-code.md +208 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +8 -131
- package/pipeline/skills/shared/external/css-modern/references/code-examples.md +142 -0
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +6 -103
- package/pipeline/skills/shared/external/database-patterns/references/orm-examples.md +112 -0
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +7 -48
- package/pipeline/skills/shared/external/html-semantic/references/code-examples.md +54 -0
- package/pipeline/skills/shared/external/humanizer/SKILL.md +6 -19
- package/pipeline/skills/shared/external/humanizer/references/voice.md +24 -0
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +13 -170
- package/pipeline/skills/shared/external/ios-accessibility/references/assistive-tech-review.md +224 -0
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +2 -24
- package/pipeline/skills/shared/external/ios-localization/references/code-examples.md +30 -0
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +3 -58
- package/pipeline/skills/shared/external/ios-networking/references/code-examples.md +67 -0
- package/pipeline/skills/shared/external/ios-security/SKILL.md +4 -64
- package/pipeline/skills/shared/external/ios-security/references/code-examples.md +74 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -90
- package/pipeline/skills/shared/external/live-activities/references/code-examples.md +108 -0
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +9 -23
- package/pipeline/skills/shared/external/localization-reuse-map/references/project-settings.md +22 -0
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +5 -95
- package/pipeline/skills/shared/external/mapkit-location/references/code-examples.md +117 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +7 -106
- package/pipeline/skills/shared/external/nextjs-app-router/references/app-router-examples.md +124 -0
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -31
- package/pipeline/skills/shared/external/permissionkit/references/code-examples.md +37 -0
- package/pipeline/skills/shared/external/play-store-review/SKILL.md +6 -74
- package/pipeline/skills/shared/external/play-store-review/references/signing-and-policies.md +83 -0
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +8 -125
- package/pipeline/skills/shared/external/push-notifications/references/notification-code.md +176 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +7 -158
- package/pipeline/skills/shared/external/python-patterns/references/python-examples.md +176 -0
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +7 -157
- package/pipeline/skills/shared/external/rest-api-design/references/api-examples.md +175 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +11 -230
- package/pipeline/skills/shared/external/swift-architecture/references/pattern-examples.md +295 -0
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +17 -149
- package/pipeline/skills/shared/external/swift-codable/references/codable-recipes.md +207 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +12 -99
- package/pipeline/skills/shared/external/swift-concurrency/references/code-examples.md +100 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swift-6-2-additions.md +18 -0
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +9 -78
- package/pipeline/skills/shared/external/swift-formatstyle/references/formatstyle-examples.md +113 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -56
- package/pipeline/skills/shared/external/swift-language/references/code-examples.md +65 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +1 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +6 -122
- package/pipeline/skills/shared/external/swiftdata/references/code-examples.md +140 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +12 -139
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/interop-code.md +198 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +9 -81
- package/pipeline/skills/shared/external/tailwind-css/references/code-examples.md +91 -0
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +7 -207
- package/pipeline/skills/shared/external/testing-backend/references/testing-examples.md +225 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +8 -89
- package/pipeline/skills/shared/external/typescript-patterns/references/code-examples.md +100 -0
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -20
- package/pipeline/skills/shared/external/vision-framework/references/code-examples.md +26 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +7 -169
- package/pipeline/skills/shared/external/vue-composition/references/vue-examples.md +187 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +7 -174
- package/pipeline/skills/shared/external/web-accessibility/references/a11y-examples.md +192 -0
- package/pipeline/skills/shared/external/web-performance/SKILL.md +8 -66
- package/pipeline/skills/shared/external/web-performance/references/code-examples.md +77 -0
- package/pipeline/skills/shared/external/web-testing/SKILL.md +11 -186
- package/pipeline/skills/shared/external/web-testing/references/testing-examples.md +213 -0
- package/pipeline/skills/skills-index.md +2 -1
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/format-and-output.md +0 -0
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/publish-and-snapshot.md +0 -0
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/sources-and-recipes.md +0 -0
|
@@ -30,6 +30,13 @@ shorten the time to first productive PR, or close a real risk?"
|
|
|
30
30
|
Render assistant-facing prose in `outputLanguage`. External payloads (branch names, plan file,
|
|
31
31
|
dev task) stay English.
|
|
32
32
|
|
|
33
|
+
Procedure detail, read when the phase starts:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
$HOME/.claude/multi-agent-refs/ios-coding-standard/resolve-and-scan.md (Phases 2 and 3)
|
|
37
|
+
$HOME/.claude/multi-agent-refs/ios-coding-standard/plan.md (Phase 4)
|
|
38
|
+
```
|
|
39
|
+
|
|
33
40
|
---
|
|
34
41
|
|
|
35
42
|
## Phase 1 - Discover and pick the module
|
|
@@ -40,9 +47,7 @@ dev task) stay English.
|
|
|
40
47
|
`Features/`, `Core/`, `Common/`, top-level module dirs) one level deep, then two if empty.
|
|
41
48
|
3. Record per module: name · path · Swift files · lines · governance docs present · SPM targets.
|
|
42
49
|
Keep this **module registry** for the whole run - `MOD-*` greps every import against it.
|
|
43
|
-
Classify each module's role
|
|
44
|
-
**feature** · **core/common** · **seam** (cross-module contracts/bridges/navigation) ·
|
|
45
|
-
**composition root** (legitimately knows every module).
|
|
50
|
+
Classify each module's role: **feature** · **core/common** · **seam** · **composition root**.
|
|
46
51
|
4. If `$ARGUMENTS` resolves to a module, skip the prompt. Otherwise `AskUserQuestion`
|
|
47
52
|
(single-select, `outputLanguage`), documented modules first, each option showing file/line
|
|
48
53
|
counts and `docs: yes/no`. If the list exceeds the question limit, group the smallest into an
|
|
@@ -51,189 +56,43 @@ dev task) stay English.
|
|
|
51
56
|
|
|
52
57
|
## Phase 2 - Resolve what applies to THIS module
|
|
53
58
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
1. **`modules/<Module>.yml`** beside the project's own config carries what code cannot state: the vocabulary
|
|
68
|
-
bindings, the module's role, prohibitions that currently have **zero** instances, deliberate
|
|
69
|
-
carve-outs, name locks, and the real verification command. Registry-backed, so its findings may
|
|
70
|
-
be `blocking`.
|
|
71
|
-
*Why prohibitions need to be written down:* inference reads dominant patterns, and a rule
|
|
72
|
-
obeyed everywhere has no counter-example to infer from. A ban at 100% compliance is invisible
|
|
73
|
-
to a scan - it survives only if the overlay states it.
|
|
74
|
-
2. **Repo-level rules** (root `CLAUDE.md`, contributing docs) apply to every module.
|
|
75
|
-
3. **The module's own dominant pattern is its de-facto convention.** Count variants per dimension;
|
|
76
|
-
the minority instances are the finding. Internal consistency beats conformity to a sibling.
|
|
77
|
-
4. No majority (even split, single instance) → not a finding. Record an Open Question.
|
|
78
|
-
|
|
79
|
-
Findings from step 3 are tagged `inferred` and capped at **suggestion**. Only registry- or
|
|
80
|
-
overlay-backed rules may be `blocking`.
|
|
81
|
-
|
|
82
|
-
**When the overlay is missing**, generate a draft from code evidence, print it for confirmation,
|
|
83
|
-
and mark every slot it could not derive - a frozen UI target, a name lock, a carve-out and an
|
|
84
|
-
operational constraint all look like ordinary code from the outside. Do not guess them; list them
|
|
85
|
-
as Open Questions.
|
|
86
|
-
|
|
87
|
-
### 2c. Vocabulary
|
|
88
|
-
|
|
89
|
-
Bind each slot to a real symbol by grepping the module, then the reference module. **An unbound
|
|
90
|
-
slot disables its rules** - never invent a name, never import a sibling's.
|
|
91
|
-
|
|
92
|
-
`HandlerName` · `EventParam` · `CoordinatorType` · `ResultType` / `ErrorType` / `ErrorFactory` ·
|
|
93
|
-
`DIResolver` / `DIConfigurator` · `RequestModelSuffix` / `ResponseModelSuffix` / `TransportSuffix` ·
|
|
94
|
-
`MapperShape` · `SafeEnumProtocol` / `UnknownCase` · `CopySurface` · `AnalyticsSurface` ·
|
|
95
|
-
`A11yIdentifierSource` · `GeneratedServiceRoot` · `SharedComponentsDir` / `SharedEntitiesDir` ·
|
|
96
|
-
`MicroComponentLibrary` · `FrozenUITarget` · `DesignTokenNamespaces` · `CalendarDayHelper` ·
|
|
97
|
-
`LoggerAPI` · `FileHeaderShape` · `ScreenRoot` · `ScreenRoleSuffixes` · `AsyncStyle` ·
|
|
98
|
-
`CompositionRoot` · `SeamLayer` · `ModuleEntrySurface` · `ConcurrencyPosture` · `LintToolchain` ·
|
|
99
|
-
`CredentialStore` (the module's Keychain wrapper, if any).
|
|
100
|
-
|
|
101
|
-
Print the resolved table before scanning so a wrong binding is caught early.
|
|
102
|
-
|
|
103
|
-
### 2d. Sensitive-data inventory - required before any SEC rule runs
|
|
104
|
-
|
|
105
|
-
The `SEC-*` rules are written against the **data classes** in `references/rules.yml →
|
|
106
|
-
sensitive_data_classes`, never against one module's field names. Resolve the module's concrete
|
|
107
|
-
instances of each class: grep entities, request/response models, storage calls and analytics
|
|
108
|
-
events for the values the module actually handles, and map each to its class.
|
|
109
|
-
|
|
110
|
-
Produce the inventory as a table - **class · concrete symbols · where it enters · required
|
|
111
|
-
lifetime (transient / survives-restart / survives-reinstall) · where it is actually stored ·
|
|
112
|
-
where it is logged · where it leaves (network, analytics, pasteboard, another module)**.
|
|
113
|
-
|
|
114
|
-
The **lifetime column is the one that decides SEC-01**, and it is filled by walking
|
|
115
|
-
`references/rules.yml → persistence_decision`, not by looking at what the code currently does. Compare it
|
|
116
|
-
against the storage column and report both mismatches:
|
|
117
|
-
- required transient but persisted anywhere (including the Keychain) → **over-persistence**;
|
|
118
|
-
- required to survive a restart but stored outside the Keychain → **under-protection**.
|
|
119
|
-
|
|
120
|
-
Then generate the SEC lint patterns *from this inventory*, so the checks match this module's real
|
|
121
|
-
vocabulary. A class with no instance here yields no finding; a symbol you cannot classify, or one
|
|
122
|
-
whose required lifetime nobody can state, is an Open Question, not a silent pass.
|
|
123
|
-
|
|
124
|
-
This table is a deliverable in its own right, independent of whether any violation is found.
|
|
59
|
+
- **The registry is the standard.** `references/rules.yml` (+ a project `modules/<Module>.yml`
|
|
60
|
+
overlay) is the single source of truth. **Do not read, cite, or derive rules from a module's own
|
|
61
|
+
`*-CLAUDE.md`, `docs/` set or any other in-repo prose.** A file that contradicts the registry is a
|
|
62
|
+
finding against the file. The only in-repo inputs are code and manifests.
|
|
63
|
+
- **Overlay, then inference.** Overlay- and registry-backed findings may be `blocking`; findings
|
|
64
|
+
inferred from the module's dominant pattern are tagged `inferred` and capped at **suggestion**.
|
|
65
|
+
No majority → Open Question, not a finding. A missing overlay gets a draft from code evidence,
|
|
66
|
+
printed for confirmation, with every slot it could not derive listed as an Open Question.
|
|
67
|
+
- **Vocabulary.** Bind each slot to a real symbol by grepping. **An unbound slot disables its
|
|
68
|
+
rules** - never invent a name, never import a sibling's. Print the resolved table before scanning.
|
|
69
|
+
- **Sensitive-data inventory, required before any SEC rule runs.** Map the module's real symbols to
|
|
70
|
+
`sensitive_data_classes`; the lifetime column, filled from `persistence_decision`, decides
|
|
71
|
+
SEC-01. A symbol you cannot classify is an Open Question, not a silent pass.
|
|
125
72
|
|
|
126
73
|
## Phase 3 - Scan
|
|
127
74
|
|
|
128
|
-
Apply the rules
|
|
129
|
-
|
|
130
|
-
onboarding impact (high/medium/low)**.
|
|
131
|
-
|
|
132
|
-
### Coverage gate - on disk, not in memory
|
|
133
|
-
|
|
134
|
-
Before scanning, write `.<module>-audit-coverage.tsv` to the scratch dir: one row per target
|
|
135
|
-
(every screen under `ScreenRoot`, every shared component, every entity, every file in every
|
|
136
|
-
target) with columns `path · status · rules-applied`. Mark rows as you go.
|
|
137
|
-
|
|
138
|
-
- Each target is **audited** or **explicitly skipped with a reason** (generated, fixture,
|
|
139
|
-
vendored). No third state.
|
|
140
|
-
- **The run is incomplete while any row is unmarked** - and the file, not a claim, is the proof.
|
|
141
|
-
Chunk the module if it is too large for one pass; the checklist survives a context reset.
|
|
142
|
-
- No sampling. A partial audit reported as complete certifies the unscanned screens as clean.
|
|
75
|
+
Apply the rules that survived Phase 2 binding, plus the module's own `validation` gate. Tag every
|
|
76
|
+
finding: **rule ID · severity · source (`registry` / `doc` / `inferred`) · onboarding impact**.
|
|
143
77
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
post-verification counts separately; a table padded with comment matches destroys trust.
|
|
150
|
-
|
|
151
|
-
### Judgement rules need evidence, not assertion
|
|
152
|
-
|
|
153
|
-
For any rule marked `enforcement: judgement`, a finding must carry the measurement its `check`
|
|
154
|
-
names - a reference count, a call-site count, a consumer count, a file list. **No count, no
|
|
155
|
-
finding.** This is what keeps a subjective rule from becoming an opinion.
|
|
156
|
-
|
|
157
|
-
Every judgement rule has a worked ✗/✓ pair in `EXAMPLES.md`, keyed by ID. Cite it in the finding's
|
|
158
|
-
proposed fix rather than re-describing the shape - the developer applying the fix should be
|
|
159
|
-
reading the same picture the audit used.
|
|
160
|
-
|
|
161
|
-
### Module-specific overrides
|
|
162
|
-
|
|
163
|
-
The module's own docs win over the registry, including where they contradict a sibling module.
|
|
164
|
-
Never apply one module's dialect to another. List every override honoured, so the reader sees why
|
|
165
|
-
a registry rule was not raised.
|
|
78
|
+
- **Coverage gate on disk**: `.<module>-audit-coverage.tsv`, one row per target, each **audited**
|
|
79
|
+
or **explicitly skipped with a reason**. The run is incomplete while any row is unmarked. No
|
|
80
|
+
sampling.
|
|
81
|
+
- **Grep hygiene**: filter comment lines, confirm every hit, report pre-filter and verified counts.
|
|
82
|
+
- **Judgement rules**: no count, no finding; cite the `EXAMPLES.md` pair by ID.
|
|
166
83
|
|
|
167
84
|
## Phase 4 - Produce the plan
|
|
168
85
|
|
|
169
86
|
No findings → report compliant and stop. Otherwise write
|
|
170
87
|
`<ModulePath>/ios-coding-standard-plan-<module>.md` (or the repo's scratch/docs dir if the module
|
|
171
|
-
tree must stay clean)
|
|
172
|
-
|
|
173
|
-
1. **Coverage ledger** - total targets · audited · skipped with reasons. Not 100% accounted for
|
|
174
|
-
means the plan is not deliverable.
|
|
175
|
-
2. **Summary** - counts by severity and source, resolved vocabulary, branch to create.
|
|
176
|
-
3. **Sensitive-data inventory** (Phase 2d) - first, because it is the highest-risk content.
|
|
177
|
-
4. **Screen × role matrix** `[STRUCT-02]` - screens as rows, manifest roles as columns, cells
|
|
178
|
-
`✓ / missing / misplaced`. The structural map a newcomer reads first.
|
|
179
|
-
5. **Type placement table** `[STRUCT-05]` - type · location · consumer count · correct tier ·
|
|
180
|
-
move required. Paired with the nested-type list `[STRUCT-01]`: owner · nested type · kind ·
|
|
181
|
-
reference count · verdict.
|
|
182
|
-
6. **Visibility report** `[VIS-01, VIS-02]` - over-exposed declarations per file, non-final
|
|
183
|
-
classes with no subclass.
|
|
184
|
-
7. **Boundary report** `[MOD-*]` - import graph (allowed vs forbidden, with coupling depth) ·
|
|
185
|
-
manifest graph (declared vs legal for the role, plus dead edges) · **removability delta**
|
|
186
|
-
("removing X touches N files: ...") · inbound test (tests compile with no sibling present).
|
|
187
|
-
8. **Testability seam report** `[TEST-*]` - types reaching for the environment, logic requiring a
|
|
188
|
-
view to execute, doubles whose signatures have drifted.
|
|
189
|
-
9. **Change-cost probe** `[FLEX-*]` - pick two plausible upcoming changes (a new variant of an
|
|
190
|
-
existing screen; a new field on a shared entity) and state what each costs in files today.
|
|
191
|
-
10. **Findings table** - rule ID · `file:line` · current state · proposed fix · severity · source ·
|
|
192
|
-
onboarding impact.
|
|
193
|
-
11. **Per-file work** - grouped per file, blocking → important → suggestion; within a severity,
|
|
194
|
-
highest onboarding impact first.
|
|
195
|
-
12. **Behaviour-preservation guard** - splitting files, adding MARKs, extracting extensions and
|
|
196
|
-
moving types must not change behaviour. Anything requiring a behaviour change (a missing
|
|
197
|
-
analytics event, a wrong result type, a timezone fix, a storage migration) goes in a
|
|
198
|
-
**separate group**, reviewed and tested on its own, never inside a mechanical split commit.
|
|
199
|
-
13. **Tooling delegation & the ratchet** - the section that decides whether any of this survives.
|
|
200
|
-
- Classify each applied rule by its registry `enforcement`. For every `lint` / `format` /
|
|
201
|
-
`scan` rule, state the concrete mechanism and whether that toolchain exists in the repo
|
|
202
|
-
(`LintToolchain`). **When it does not exist, saying so is a finding**, ranked above most
|
|
203
|
-
individual violations it would have caught.
|
|
204
|
-
- Recommend **baseline-and-ratchet, never big-bang**: grandfather existing violations, surface
|
|
205
|
-
only new ones, drain the backlog behind a green build. Order the plan the same way - stop
|
|
206
|
-
the bleeding, then clean up.
|
|
207
|
-
- Custom lint rule identifiers **are** the registry IDs (`sec_01_no_plaintext_persistence`,
|
|
208
|
-
`mod_01_no_sibling_import`) so a violation points straight at the rule entry.
|
|
209
|
-
- **Linting is local-only by decision** - the skill's `references/lint-local.sh` with `references/swiftlint.draft.yml`, config
|
|
210
|
-
and baseline kept outside the repository; no committed config, no build phase, no CI job.
|
|
211
|
-
State this honestly in the plan rather than describing a gate that does not exist: a
|
|
212
|
-
pre-PR habit catches less than a wall, so the residual risk is real and belongs in the
|
|
213
|
-
report. Adopting it project-wide remains an open decision - record it as one so it stays
|
|
214
|
-
visible instead of quietly lapsing.
|
|
215
|
-
- Never imply the audit substitutes for the linter, or the linter for a gate. The audit finds
|
|
216
|
-
the debt once; the linter keeps a developer honest; only a gate stops it returning.
|
|
217
|
-
14. **Numeric exit criteria** - target and today's measured value side by side: lint violations
|
|
218
|
-
per 1k lines (<1) · public-surface ratio, public declarations ÷ externally consumed symbols
|
|
219
|
-
(≈1) · forbidden cross-module imports (0) · removability delta · files over threshold and
|
|
220
|
-
files >120 lines with no sectioning (0) · screens missing a manifest role (0) · escape-hatch
|
|
221
|
-
count `[CONC-03]` (flat or falling) · exception-marker count (flat or falling) · dead code (0)
|
|
222
|
-
· screens with logic and no mirrored tests (0) · unclassified sensitive symbols (0).
|
|
223
|
-
15. **Exception ledger** - every `// standard:exception(<ID>)` in the module: rule · reason ·
|
|
224
|
-
expiry · expired yes/no.
|
|
225
|
-
16. **Open Questions** - Phase 2b dimensions with no majority, and unclassifiable symbols.
|
|
226
|
-
17. **Suggested commit slicing** - one commit per file-group / concern.
|
|
227
|
-
18. **Scope guard** - only this module is touched; definition of done is the module's own
|
|
228
|
-
verification path.
|
|
88
|
+
tree must stay clean) with the 18 sections of `plan.md`, in order. Hard rules from it:
|
|
229
89
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
this page is the actual deliverable, and the audit is how you earn the right to write it
|
|
235
|
-
accurately. Derive it from `references/STANDARD.md section 0`, do not re-invent it.
|
|
90
|
+
- A coverage ledger short of 100% accounted for means the plan is not deliverable.
|
|
91
|
+
- Behaviour changes go in a **separate group**, never inside a mechanical split commit.
|
|
92
|
+
- Linting is **local-only by decision**; never describe a gate that does not exist, and never imply
|
|
93
|
+
the audit substitutes for the linter or the linter for a gate.
|
|
236
94
|
|
|
95
|
+
Then write the one-page onboarding summary beside the plan (`plan.md`, "Onboarding summary").
|
|
237
96
|
Show a concise version of the plan to the user too.
|
|
238
97
|
|
|
239
98
|
## Phase 5 - Hand off
|
|
@@ -252,11 +111,9 @@ verifies, and commits only when asked. This routine ends at the handoff.
|
|
|
252
111
|
|
|
253
112
|
## Notes
|
|
254
113
|
|
|
255
|
-
- **Verification reality is per-module - establish it, do not assume it.**
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
only. Never trust a piped build's exit code - a pipe reports the tail's status. Record the
|
|
259
|
-
module's actual verification command in the plan.
|
|
114
|
+
- **Verification reality is per-module - establish it, do not assume it.** Never trust a piped
|
|
115
|
+
build's exit code. Record the module's actual verification command in the plan
|
|
116
|
+
(`resolve-and-scan.md`, "Verification reality").
|
|
260
117
|
- One module per run. Several modules means several runs and several plans, never one
|
|
261
118
|
cross-module churn commit.
|
|
262
119
|
- If the audit wants a rule the registry lacks, add it to the skill's `references/rules.yml` as `status: proposed` with a
|
|
@@ -14,7 +14,7 @@ confirm: none
|
|
|
14
14
|
|
|
15
15
|
**Input**: $ARGUMENTS
|
|
16
16
|
|
|
17
|
-
Fully interactive
|
|
17
|
+
Fully interactive; one optional flag: `autopilot`.
|
|
18
18
|
|
|
19
19
|
## Flow
|
|
20
20
|
|
|
@@ -56,35 +56,20 @@ printf 'Authorization: Bearer %s\n' "$TOKEN" | curl -s -H @- \
|
|
|
56
56
|
2. `status` → "In Progress" > "In Review" > "To Do" > others
|
|
57
57
|
3. `created` → newest first
|
|
58
58
|
|
|
59
|
-
**Format
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
> [Blocker] PROJ-12345 - Login crash on iOS 17 (In Progress)
|
|
63
|
-
[Critical] PROJ-12340 - Payment fails for refunds (In Review)
|
|
64
|
-
[High] PROJ-12338 - Dark mode polish (To Do)
|
|
65
|
-
[Medium] PROJ-12330 - Add empty state (To Do)
|
|
66
|
-
[ - ] PROJ-12300 - Refactor LoginViewModel (To Do)
|
|
67
|
-
```
|
|
59
|
+
**Format**: priority badge prefix, status suffix. Example list and the
|
|
60
|
+
maturity shape: `$HOME/.claude/multi-agent-refs/jira/picker-detail.md`; read it
|
|
61
|
+
before rendering the list.
|
|
68
62
|
|
|
69
63
|
- AskUserQuestion (multiSelect=false)
|
|
70
64
|
- Output: selected `KEY` (e.g. `PROJ-12345`)
|
|
71
65
|
|
|
72
|
-
> **Rule**:
|
|
66
|
+
> **Rule**: the sort signals priority; it never forces a pick.
|
|
73
67
|
|
|
74
68
|
### [3.5/4] Maturity check (auto)
|
|
75
69
|
|
|
76
|
-
After issue selection, inspect `maturity` from `~/.claude/lib/issue-fetcher.sh
|
|
70
|
+
After issue selection, inspect `maturity` (`score`, `blockers`, `warnings`, `summary`) from `~/.claude/lib/issue-fetcher.sh`.
|
|
77
71
|
|
|
78
|
-
|
|
79
|
-
"maturity": {
|
|
80
|
-
"score": 0..100,
|
|
81
|
-
"blockers": ["status_closed", "already_resolved", "description_empty"],
|
|
82
|
-
"warnings": ["short_description", "no_repro_steps", "no_acceptance_criteria", "description_empty_parent_available"],
|
|
83
|
-
"summary": "..."
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
> **Empty description → parent candidate**: development sub-tasks are often filed with no description of their own, with the real requirements on the parent issue. Before scoring, `issue-fetcher.sh` fetches the issue's `parent` (single hop, no chasing the parent's parent). If the issue's own description is empty and the parent's isn't, it does **not** auto-substitute - it exposes `descriptor.parentKey` + `descriptor.parentDescription` as a candidate and adds `description_empty_parent_available` to `warnings` (not `blockers`) instead of the plain `description_empty` blocker. If the parent is also empty or unreachable, `description_empty` still blocks exactly as before.
|
|
72
|
+
> **Empty description → parent candidate**: the fetcher never auto-substitutes a parent's description; it offers it as `description_empty_parent_available` (a warning). How the candidate is found: `jira/picker-detail.md`.
|
|
88
73
|
>
|
|
89
74
|
> When `description_empty_parent_available` is present, ask a tailored question instead of the generic "Continue?" below:
|
|
90
75
|
> - `question` (outputLanguage): "Bu issue'nun (`{KEY}`) açıklaması boş, ama parent'ın (`{parentKey}`) açıklaması var. Parent'ın açıklamasından devam edilsin mi?" / "This issue's (`{KEY}`) description is empty, but its parent (`{parentKey}`) has one. Continue using the parent's description?" - show a short excerpt of `parentDescription` for context.
|
|
@@ -94,7 +79,7 @@ After issue selection, inspect `maturity` from `~/.claude/lib/issue-fetcher.sh`:
|
|
|
94
79
|
> - **Decline** → same as a `description_empty` blocker: halt, advise fixing the issue's own description.
|
|
95
80
|
> - **Autopilot**: auto-accepts "Use parent's description" (same "warnings auto-continue" rule as any other warning), logs the auto-accept + parent key to `agent-log.md`.
|
|
96
81
|
>
|
|
97
|
-
> **Sibling sub-tasks**: the fetcher also reads the parent's other sub-tasks into `descriptor.relatedIssues[]`. Show them as their own labelled block, never substituted into `description`.
|
|
82
|
+
> **Sibling sub-tasks**: the fetcher also reads the parent's other sub-tasks into `descriptor.relatedIssues[]`. Show them as their own labelled block, never substituted into `description`. Both descriptions empty but a sibling has content: `description_empty_sibling_available` replaces the blocker - same question, sibling key. Contract: `$HOME/.claude/multi-agent-refs/features/jira-context.md`.
|
|
98
83
|
|
|
99
84
|
| Outcome | Behavior |
|
|
100
85
|
|---|---|
|
|
@@ -111,14 +96,12 @@ with a summary; an autopilot run with `prefs.global.maturityFollowup.autopilotCo
|
|
|
111
96
|
on posts ONE comment on the item asking for what is missing, then halts on the circuit
|
|
112
97
|
breaker with `state.waitingFor = "maturity"` so `resume` re-enters THIS step with the item
|
|
113
98
|
re-fetched. Both defaults keep today's behaviour: the comment is off, the halt is the halt.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
comments FIRST and derive the prior ask from the newest one of ours (`priorFromComments`):
|
|
117
|
-
a scan is a new run with a fresh state file, so state alone would make every scan a first ask.
|
|
99
|
+
Only a DIFFERENT gap set ever earns a second comment; read the item's existing comments
|
|
100
|
+
first (`priorFromComments`, detail in `jira/picker-detail.md`).
|
|
118
101
|
|
|
119
|
-
> **Resolution check**:
|
|
102
|
+
> **Resolution check**: any set Jira `resolution` (`Fixed`, `Done`, `Won't Do`...) adds `already_resolved`. To reopen, clear `resolution` in Jira first.
|
|
120
103
|
|
|
121
|
-
> **fixVersions**: When `descriptor.fixVersions` is non-empty
|
|
104
|
+
> **fixVersions**: When `descriptor.fixVersions` is non-empty and a matching `release/<version>` branch exists in `prefs.projects[*].branches`, suggest that branch. Otherwise fall back to `develop`/cwd current.
|
|
122
105
|
|
|
123
106
|
The fetcher renders `maturity.summary` in `prefs.global.outputLanguage`; every other descriptor field is machine-readable and stays English.
|
|
124
107
|
|
|
@@ -128,21 +111,9 @@ The fetcher renders `maturity.summary` in `prefs.global.outputLanguage`; every o
|
|
|
128
111
|
|
|
129
112
|
## Pipeline launch
|
|
130
113
|
|
|
131
|
-
1. **Write picker state** to `/tmp/multi-agent-picker-{taskId}.json
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
"taskId":"PROJ-12345-{timestamp}",
|
|
135
|
-
"shortId":<int>,
|
|
136
|
-
"branch":"<feature|bugfix>/PROJ-12345",
|
|
137
|
-
"baseBranch":"develop",
|
|
138
|
-
"issueRef":{...},
|
|
139
|
-
"primary":{"name":"...","cloneUrl":"...","provider":"github|bitbucket"},
|
|
140
|
-
"extras":[{...}],
|
|
141
|
-
"worktreeRoot":"~/.worktrees/PROJ-12345-{timestamp}",
|
|
142
|
-
"commitType":"<feat|fix>",
|
|
143
|
-
"identity":{"name":"...","email":"..."}
|
|
144
|
-
}
|
|
145
|
-
```
|
|
114
|
+
1. **Write picker state** to `/tmp/multi-agent-picker-{taskId}.json` (`taskId`,
|
|
115
|
+
`shortId`, `branch`, `baseBranch`, `issueRef`, `primary`, `extras`,
|
|
116
|
+
`worktreeRoot`, `commitType`, `identity`; full shape in `jira/picker-detail.md`).
|
|
146
117
|
|
|
147
118
|
2. **Bridge to agent-state.json v2.1.0** - picker → Phase 0:
|
|
148
119
|
```bash
|
|
@@ -155,8 +126,7 @@ The fetcher renders `maturity.summary` in `prefs.global.outputLanguage`; every o
|
|
|
155
126
|
~/.claude/lib/multi-repo-pipeline.sh prepare /tmp/multi-agent-picker-{taskId}.json
|
|
156
127
|
```
|
|
157
128
|
|
|
158
|
-
4. **Phase 0 entry** -
|
|
159
|
-
redundant Jira/GitHub fetches.
|
|
129
|
+
4. **Phase 0 entry** - reads the bridged `agent-state.json`, no refetch.
|
|
160
130
|
|
|
161
131
|
`autopilot` arg → start with `MULTI_AGENT_AUTOPILOT=1`.
|
|
162
132
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Pair a phone with the office: QR, wait, compare the code with the user, enrol. Use when the office should be reachable from a phone."
|
|
3
|
+
description-tr: "Telefonu ofise eşler: QR'ı gösterir, telefonu bekler, karşılaştırma kodunu kullanıcıyla doğrular ve cihazı kaydeder. Ofise telefondan erişmek için kullan."
|
|
4
|
+
argument-hint: "[--relay <url>]"
|
|
5
|
+
parameters: [{"name":"--relay","kind":"text"}]
|
|
6
|
+
gui: button
|
|
7
|
+
destructive: false
|
|
8
|
+
confirm: none
|
|
9
|
+
allowed-tools: Bash, AskUserQuestion
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# multi-agent office-pair - pair a phone
|
|
13
|
+
|
|
14
|
+
One flow over `office-pair.mjs` (`start`, `wait`, `confirm`, `cancel`). The
|
|
15
|
+
device is enrolled with `read,answer` only after the user has compared the code
|
|
16
|
+
on both screens. An unattended run is refused by the script itself.
|
|
17
|
+
|
|
18
|
+
## Steps
|
|
19
|
+
|
|
20
|
+
1. **Show the QR.**
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
node "$HOME/.claude/scripts/office-pair.mjs" start # add --relay <url> when one was given
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The QR opens as a local page in the browser (`opened`). It is never drawn in
|
|
27
|
+
this conversation: it carries the pairing's one-time secret, and tool output
|
|
28
|
+
is kept in the transcript. When `no relay is set` comes back, stop and tell
|
|
29
|
+
the user to set `global.office.remote.relayUrl` in the preferences, or to
|
|
30
|
+
run the command again with `--relay <url>`.
|
|
31
|
+
|
|
32
|
+
To see the QR in a terminal instead, the user runs
|
|
33
|
+
`node ~/.claude/scripts/office-pair.mjs start --terminal` in a terminal
|
|
34
|
+
window of their own. It draws only when its output is a terminal; captured
|
|
35
|
+
output gets the page instead.
|
|
36
|
+
|
|
37
|
+
2. **Tell the user** (in `outputLanguage`): scan the code with the phone, signed
|
|
38
|
+
in to the site; finish the passkey step there; the code expires at
|
|
39
|
+
`expiresAt` (10 minutes).
|
|
40
|
+
|
|
41
|
+
3. **Wait for the phone** (it blocks until the phone answers or the pairing
|
|
42
|
+
expires; give the call a 600000 ms timeout):
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
node "$HOME/.claude/scripts/office-pair.mjs" wait
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
4. **Compare the code with the user.** Ask with AskUserQuestion, following
|
|
49
|
+
`$HOME/.claude/multi-agent-refs/picker-contract.md`: the question (in
|
|
50
|
+
`outputLanguage`) names `deviceName` and `code` and asks whether the phone
|
|
51
|
+
shows the same code. Options (English labels): `Same code` / `Different
|
|
52
|
+
code`; branch on the option chosen. Never answer it yourself.
|
|
53
|
+
|
|
54
|
+
5. **Finish.**
|
|
55
|
+
- Same code: `node "$HOME/.claude/scripts/office-pair.mjs" confirm <code>`,
|
|
56
|
+
then report the enrolled device (`id`, `name`, `scopes`).
|
|
57
|
+
- Different code, or no answer: `node "$HOME/.claude/scripts/office-pair.mjs" cancel`,
|
|
58
|
+
and report that nothing was enrolled. A different code means the pairing
|
|
59
|
+
message did not come from the user's phone.
|
|
60
|
+
|
|
61
|
+
## Errors
|
|
62
|
+
|
|
63
|
+
Report the script's message as given, with its fix: `expired` -> run the
|
|
64
|
+
command again; `did not open` or `origin` -> the message was not sealed for
|
|
65
|
+
this pairing, nothing was kept; `the relay answered` -> check the relay site.
|
|
66
|
+
Revoking a paired phone later is `phone-devices.mjs revoke`.
|
|
@@ -18,7 +18,7 @@ node "$HOME/.claude/scripts/office-control.mjs" status --json
|
|
|
18
18
|
Report in `outputLanguage`:
|
|
19
19
|
|
|
20
20
|
- `running`, and when it is, `url` and `idleMinutes` (0 means it runs until `office-off`);
|
|
21
|
-
- `remote`: "off" until a phone is paired with
|
|
21
|
+
- `remote`: "off" until a phone is paired with `/multi-agent:office-pair`, "configured"
|
|
22
22
|
when only the prefs block is set, "paired" once a device is; report the line
|
|
23
23
|
as given;
|
|
24
24
|
- `pairedDevices`: the devices the phone registry lists; revoking one is
|