@mmerterden/multi-agent-pipeline 20.0.0 → 20.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +5 -5
  3. package/README.tr.md +5 -5
  4. package/SECURITY.md +3 -3
  5. package/docs/adr/0011-dormant-ci.md +10 -1
  6. package/docs/architecture.md +2 -2
  7. package/docs/ecosystem.md +5 -5
  8. package/docs/facts.json +8 -7
  9. package/install/_codex-agents.mjs +1 -1
  10. package/manifest.json +92 -64
  11. package/package.json +1 -1
  12. package/pipeline/agents/code-reviewer.md +2 -2
  13. package/pipeline/agents/dev-critic.md +5 -5
  14. package/pipeline/agents/security-auditor.md +80 -72
  15. package/pipeline/commands/figma-to-swiftui.md +1 -1
  16. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  17. package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
  18. package/pipeline/commands/multi-agent/diff-explain/SKILL.md +1 -1
  19. package/pipeline/commands/multi-agent/help/SKILL.md +2 -0
  20. package/pipeline/commands/multi-agent/scan/SKILL.md +2 -2
  21. package/pipeline/commands/multi-agent/security-review/SKILL.md +52 -0
  22. package/pipeline/commands/multi-agent/sync/SKILL.md +3 -3
  23. package/pipeline/multi-agent-refs/component-dispatch.md +5 -5
  24. package/pipeline/multi-agent-refs/cross-cli-contract.md +6 -6
  25. package/pipeline/multi-agent-refs/features/security-audit.md +55 -0
  26. package/pipeline/multi-agent-refs/phases/modes.md +1 -1
  27. package/pipeline/multi-agent-refs/phases/phase-3-review.md +9 -15
  28. package/pipeline/multi-agent-refs/phases/phase-5-report.md +1 -1
  29. package/pipeline/multi-agent-refs/threat-model.md +39 -0
  30. package/pipeline/schemas/agent-state.schema.json +23 -0
  31. package/pipeline/schemas/phases.json +1 -2
  32. package/pipeline/schemas/prefs.schema.json +0 -4
  33. package/pipeline/schemas/reviewer-output.schema.json +99 -2
  34. package/pipeline/schemas/security-finding.schema.json +144 -0
  35. package/pipeline/scripts/_stack-routing.mjs +1 -0
  36. package/pipeline/scripts/gc-abandoned.sh +16 -9
  37. package/pipeline/scripts/render-work-summary.sh +7 -4
  38. package/pipeline/skills/.skill-manifest.json +47 -23
  39. package/pipeline/skills/.skills-index.json +75 -9
  40. package/pipeline/skills/shared/README.md +13 -7
  41. package/pipeline/skills/shared/core/multi-agent/SKILL.md +3 -4
  42. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -2
  43. package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +29 -0
  44. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
  45. package/pipeline/skills/shared/external/android-architecture/SKILL.md +71 -0
  46. package/pipeline/skills/shared/external/android-architecture/references/patterns.md +142 -0
  47. package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +314 -0
  48. package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +432 -0
  49. package/pipeline/skills/shared/external/android-datastore/SKILL.md +236 -0
  50. package/pipeline/skills/shared/external/android-datastore/references/patterns.md +297 -0
  51. package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +249 -0
  52. package/pipeline/skills/shared/external/android-design-tokens-codegen/references/patterns.md +270 -0
  53. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +62 -0
  54. package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +255 -0
  55. package/pipeline/skills/shared/external/android-mvi-viewmodel/references/patterns.md +257 -0
  56. package/pipeline/skills/shared/external/android-performance/SKILL.md +86 -602
  57. package/pipeline/skills/shared/external/android-performance/references/patterns.md +659 -0
  58. package/pipeline/skills/shared/external/android-security/SKILL.md +117 -430
  59. package/pipeline/skills/shared/external/android-security/references/patterns.md +690 -0
  60. package/pipeline/skills/shared/external/{android_ui_verification → android-ui-verification}/SKILL.md +1 -1
  61. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +35 -733
  62. package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +299 -0
  63. package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +255 -0
  64. package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +167 -0
  65. package/pipeline/skills/shared/external/app-intents/SKILL.md +39 -174
  66. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +178 -0
  67. package/pipeline/skills/shared/external/compose-components/SKILL.md +48 -0
  68. package/pipeline/skills/shared/external/compose-components/references/patterns.md +200 -0
  69. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +66 -3
  70. package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +191 -0
  71. package/pipeline/skills/shared/external/compose-testing/SKILL.md +107 -397
  72. package/pipeline/skills/shared/external/compose-testing/references/patterns.md +631 -0
  73. package/pipeline/skills/shared/external/gradle-kotlin-dsl/SKILL.md +121 -449
  74. package/pipeline/skills/shared/external/gradle-kotlin-dsl/references/patterns.md +715 -0
  75. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +143 -0
  76. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +27 -102
  77. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +42 -0
  78. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +94 -383
  79. package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +640 -0
  80. package/pipeline/skills/shared/external/room-database/SKILL.md +101 -440
  81. package/pipeline/skills/shared/external/room-database/references/patterns.md +614 -0
  82. package/pipeline/skills/shared/external/security-review/SKILL.md +64 -0
  83. package/pipeline/skills/shared/external/security-review/references/owasp-mobile-top10-2024.md +53 -0
  84. package/pipeline/skills/shared/external/security-review/references/owasp-web-api-top10-2021.md +56 -0
  85. package/pipeline/skills/shared/external/storekit/SKILL.md +69 -343
  86. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +371 -0
  87. package/pipeline/skills/shared/external/widgetkit/SKILL.md +25 -101
  88. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +107 -0
  89. package/pipeline/skills/skills-index.md +8 -2
  90. package/pipeline/commands/security-review.md +0 -6
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "skillCount": 213,
3
+ "skillCount": 219,
4
4
  "entries": [
5
5
  {
6
6
  "name": "accessibility-compliance-accessibility-audit",
@@ -47,26 +47,48 @@
47
47
  "relativePath": "shared/external/alarmkit/SKILL.md"
48
48
  },
49
49
  {
50
- "name": "android_ui_verification",
51
- "description": "Automated end-to-end UI testing and verification on an Android Emulator using ADB. Use when an Android build needs driving on an emulator to verify its UI end to end.",
50
+ "name": "android-architecture",
51
+ "description": "Design and implement Clean Architecture with multi-module structure on Android. Covers domain/data/presentation layers, Hilt dependency injection with @Module/@Provides/@Binds, UseCase pattern with operator invoke, Repository pattern with Kotlin Flow, and mapper pattern between layers. Use when stru",
52
52
  "platform": null,
53
53
  "group": "external",
54
54
  "plugin": "ai-android-toolkit",
55
- "invokeAs": "ai-android-toolkit:android_ui_verification",
55
+ "invokeAs": "ai-android-toolkit:android-architecture",
56
56
  "triggerKeywords": [],
57
57
  "triggerPaths": [],
58
- "relativePath": "shared/external/android_ui_verification/SKILL.md"
58
+ "relativePath": "shared/external/android-architecture/SKILL.md"
59
59
  },
60
60
  {
61
- "name": "android-architecture",
62
- "description": "Design and implement Clean Architecture with multi-module structure on Android. Covers domain/data/presentation layers, Hilt dependency injection with @Module/@Provides/@Binds, UseCase pattern with operator invoke, Repository pattern with Kotlin Flow, and mapper pattern between layers. Use when stru",
61
+ "name": "android-build-quality-gates",
62
+ "description": "Encode Android module and quality rules as build-failing Gradle tasks: layer-dependency checks, coverage floors, a Compose-stability gate, lint-on-diff and screenshot validation. Use when a multi-module app needs enforceable boundaries and quality gates in the build, not in review.",
63
63
  "platform": null,
64
64
  "group": "external",
65
65
  "plugin": "ai-android-toolkit",
66
- "invokeAs": "ai-android-toolkit:android-architecture",
66
+ "invokeAs": "ai-android-toolkit:android-build-quality-gates",
67
67
  "triggerKeywords": [],
68
68
  "triggerPaths": [],
69
- "relativePath": "shared/external/android-architecture/SKILL.md"
69
+ "relativePath": "shared/external/android-build-quality-gates/SKILL.md"
70
+ },
71
+ {
72
+ "name": "android-datastore",
73
+ "description": "Typed Jetpack DataStore as the modern SharedPreferences replacement: Preferences and typed stores, serializer-layer encryption, and migration. Use when persisting settings, session or tokens, encrypting key-value state, or migrating off EncryptedSharedPreferences.",
74
+ "platform": null,
75
+ "group": "external",
76
+ "plugin": "ai-android-toolkit",
77
+ "invokeAs": "ai-android-toolkit:android-datastore",
78
+ "triggerKeywords": [],
79
+ "triggerPaths": [],
80
+ "relativePath": "shared/external/android-datastore/SKILL.md"
81
+ },
82
+ {
83
+ "name": "android-design-tokens-codegen",
84
+ "description": "A single-source JSON to typed-Kotlin codegen pipeline for design tokens, UI-test ids, analytics events and deeplink manifests, run as Gradle tasks with a --check CI freshness gate. Use when a design system or cross-platform app needs one source of truth that generates typed code.",
85
+ "platform": null,
86
+ "group": "external",
87
+ "plugin": "ai-android-toolkit",
88
+ "invokeAs": "ai-android-toolkit:android-design-tokens-codegen",
89
+ "triggerKeywords": [],
90
+ "triggerPaths": [],
91
+ "relativePath": "shared/external/android-design-tokens-codegen/SKILL.md"
70
92
  },
71
93
  {
72
94
  "name": "android-jetpack-compose-expert",
@@ -79,6 +101,17 @@
79
101
  "triggerPaths": [],
80
102
  "relativePath": "shared/external/android-jetpack-compose-expert/SKILL.md"
81
103
  },
104
+ {
105
+ "name": "android-mvi-viewmodel",
106
+ "description": "A reusable generic BaseViewModel<State, Intent, Event> for MVI Compose apps: StateFlow state, one-shot events over a rendezvous Channel, a single intent dispatch, and a use-case executor with shared loading and error routing. Use when building or reviewing an MVI ViewModel base, intent-to-state redu",
107
+ "platform": null,
108
+ "group": "external",
109
+ "plugin": "ai-android-toolkit",
110
+ "invokeAs": "ai-android-toolkit:android-mvi-viewmodel",
111
+ "triggerKeywords": [],
112
+ "triggerPaths": [],
113
+ "relativePath": "shared/external/android-mvi-viewmodel/SKILL.md"
114
+ },
82
115
  {
83
116
  "name": "android-performance",
84
117
  "description": "Optimize Android app performance with Baseline Profiles for startup, Compose stability annotations (@Stable, @Immutable, strong skipping), recomposition debugging (Layout Inspector, recomposition counts), R8 optimization, LeakCanary memory leak detection, Macrobenchmark startup tracing, Coil image l",
@@ -101,6 +134,17 @@
101
134
  "triggerPaths": [],
102
135
  "relativePath": "shared/external/android-security/SKILL.md"
103
136
  },
137
+ {
138
+ "name": "android-ui-verification",
139
+ "description": "Automated end-to-end UI testing and verification on an Android Emulator using ADB. Use when an Android build needs driving on an emulator to verify its UI end to end.",
140
+ "platform": null,
141
+ "group": "external",
142
+ "plugin": "ai-android-toolkit",
143
+ "invokeAs": "ai-android-toolkit:android-ui-verification",
144
+ "triggerKeywords": [],
145
+ "triggerPaths": [],
146
+ "relativePath": "shared/external/android-ui-verification/SKILL.md"
147
+ },
104
148
  {
105
149
  "name": "api-patterns",
106
150
  "description": "API design principles and decision-making. REST vs GraphQL vs tRPC selection, response formats, versioning, pagination. Use when choosing between REST, GraphQL and tRPC, or shaping response formats, versioning and pagination.",
@@ -1421,6 +1465,17 @@
1421
1465
  "triggerPaths": [],
1422
1466
  "relativePath": "shared/core/multi-agent-search/SKILL.md"
1423
1467
  },
1468
+ {
1469
+ "name": "multi-agent-security-review",
1470
+ "description": "Run a standalone defensive, static security review of a diff, branch or repo: run-scoped threat model, reviewer-shaped findings joined to OWASP + CWE with CVSS scoring, evidence and before/after fixes, plus an offline dependency inventory. No live target, no payloads. Use when reviewing code for sec",
1471
+ "platform": null,
1472
+ "group": "core",
1473
+ "plugin": null,
1474
+ "invokeAs": "multi-agent-security-review",
1475
+ "triggerKeywords": [],
1476
+ "triggerPaths": [],
1477
+ "relativePath": "shared/core/multi-agent-security-review/SKILL.md"
1478
+ },
1424
1479
  {
1425
1480
  "name": "multi-agent-setup",
1426
1481
  "description": "First-run setup wizard: keychain token discovery, Git Identity onboarding, and pipeline preparation. Use when the pipeline is being set up for the first time, or tokens and git identity need onboarding.",
@@ -1784,6 +1839,17 @@
1784
1839
  "triggerPaths": [],
1785
1840
  "relativePath": "shared/external/search-first/SKILL.md"
1786
1841
  },
1842
+ {
1843
+ "name": "security-review",
1844
+ "description": "Run a defensive, static security review of a diff or a repo: build a run-scoped threat model, find vulnerabilities joined to OWASP + CWE with CVSS scoring and evidence, and emit reviewer-shaped findings with before/after fixes. Use when reviewing code for security, auditing a dependency set, prepari",
1845
+ "platform": null,
1846
+ "group": "external",
1847
+ "plugin": "ai-common-toolkit",
1848
+ "invokeAs": "ai-common-toolkit:security-review",
1849
+ "triggerKeywords": [],
1850
+ "triggerPaths": [],
1851
+ "relativePath": "shared/external/security-review/SKILL.md"
1852
+ },
1787
1853
  {
1788
1854
  "name": "shareplay-activities",
1789
1855
  "description": "Build shared real-time experiences using GroupActivities and SharePlay. Use when implementing shared media playback, collaborative app features, synchronized game state, or any FaceTime, Messages, AirDrop, or nearby visionOS group activity on iOS, macOS, tvOS, or visionOS.",
@@ -2,24 +2,24 @@
2
2
 
3
3
  Single source of truth for skills delivered to both Claude Code (`~/.claude/skills/`) and Copilot CLI (`~/.copilot/skills/`) by the installer.
4
4
 
5
- **Total:** 213 skills (60 core + 153 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
5
+ **Total:** 219 skills (61 core + 158 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
6
6
 
7
7
  ## Directory layout
8
8
 
9
- - **`core/`** - 60 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
10
- - **`external/`** - 153 iOS / Android / generic skills imported from the upstream skill library. Mirrors of third-party guidance.
9
+ - **`core/`** - 61 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
10
+ - **`external/`** - 158 iOS / Android / generic skills imported from the upstream skill library. Mirrors of third-party guidance.
11
11
  - Install destinations (ADR-0009): Claude Code gets NO local copy of `external/` - it loads those skills from the `multi-agent-plugins` marketplace, namespaced (`ai-<stack>-toolkit:<name>`); only the two compliance catalogs from `core/` land in `~/.claude/skills/`. Copilot CLI and Codex CLI receive a flat copy filtered to the enabled stacks. `external/` remains the single authoring source that `build-stack-plugins.mjs` publishes from.
12
12
 
13
13
  Source layout is logical grouping only - skill discovery at runtime is unchanged.
14
14
 
15
15
  ## Categories
16
16
 
17
- - [Pipeline Orchestration](#pipeline-orchestration) - 60
17
+ - [Pipeline Orchestration](#pipeline-orchestration) - 61
18
18
  - [iOS / Apple Ecosystem](#ios-apple-ecosystem) - 90
19
- - [Android / Kotlin](#android-kotlin) - 13
19
+ - [Android / Kotlin](#android-kotlin) - 17
20
20
  - [Web](#web) - 10
21
21
  - [Backend / API](#backend-api) - 11
22
- - [Cross-cutting](#cross-cutting) - 29
22
+ - [Cross-cutting](#cross-cutting) - 30
23
23
 
24
24
  ## Pipeline Orchestration
25
25
 
@@ -71,6 +71,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
71
71
  | [`multi-agent-save`](./core/multi-agent-save/) | `core` | Save a recurring job as a reusable /multi-agent:<name> command. Reviews the conversation + your CLAUDE.md for candidate routines, you pick o |
72
72
  | [`multi-agent-scan`](./core/multi-agent-scan/) | `core` | Skill security scan: walks local skill directories against a tiered pattern catalog. Use when local skill directories need checking for unsa |
73
73
  | [`multi-agent-search`](./core/multi-agent-search/) | `core` | Log search across every agent-log.md with smart ranking and filters. Optional --semantic flag queries the per-repo triage corpus. Use when s |
74
+ | [`multi-agent-security-review`](./core/multi-agent-security-review/) | `core` | Run a standalone defensive, static security review of a diff, branch or repo: run-scoped threat model, reviewer-shaped findings joined to OW |
74
75
  | [`multi-agent-setup`](./core/multi-agent-setup/) | `core` | First-run setup wizard: keychain token discovery, Git Identity onboarding, and pipeline preparation. Use when the pipeline is being set up f |
75
76
  | [`multi-agent-stack`](./core/multi-agent-stack/) | `core` | Select the active stack(s) for this repo by enabling the matching marketplace plugin(s) in .claude/settings.json. Multi-select: pass several |
76
77
  | [`multi-agent-status`](./core/multi-agent-status/) | `core` | Show every multi-agent task's ID, phase, branch, and status. Use when asked what is running, or for an overview of every task. |
@@ -185,11 +186,15 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
185
186
 
186
187
  | Skill | Group | Description |
187
188
  |-------|-------|-------------|
188
- | [`android_ui_verification`](./external/android_ui_verification/) | `external` | Automated end-to-end UI testing and verification on an Android Emulator using ADB. Use when an Android build needs driving on an emulator to |
189
189
  | [`android-architecture`](./external/android-architecture/) | `external` | Design and implement Clean Architecture with multi-module structure on Android. Covers domain/data/presentation layers, Hilt dependency inje |
190
+ | [`android-build-quality-gates`](./external/android-build-quality-gates/) | `external` | Encode Android module and quality rules as build-failing Gradle tasks: layer-dependency checks, coverage floors, a Compose-stability gate, l |
191
+ | [`android-datastore`](./external/android-datastore/) | `external` | Typed Jetpack DataStore as the modern SharedPreferences replacement: Preferences and typed stores, serializer-layer encryption, and migratio |
192
+ | [`android-design-tokens-codegen`](./external/android-design-tokens-codegen/) | `external` | A single-source JSON to typed-Kotlin codegen pipeline for design tokens, UI-test ids, analytics events and deeplink manifests, run as Gradle |
190
193
  | [`android-jetpack-compose-expert`](./external/android-jetpack-compose-expert/) | `external` | Expert guidance for building modern Android UIs with Jetpack Compose, covering state management, navigation, performance, and Material Desig |
194
+ | [`android-mvi-viewmodel`](./external/android-mvi-viewmodel/) | `external` | A reusable generic BaseViewModel<State, Intent, Event> for MVI Compose apps: StateFlow state, one-shot events over a rendezvous Channel, a s |
191
195
  | [`android-performance`](./external/android-performance/) | `external` | Optimize Android app performance with Baseline Profiles for startup, Compose stability annotations (@Stable, @Immutable, strong skipping), r |
192
196
  | [`android-security`](./external/android-security/) | `external` | Secure Android apps with ProGuard/R8 obfuscation, OkHttp certificate pinning, BiometricPrompt authentication, EncryptedSharedPreferences, Pl |
197
+ | [`android-ui-verification`](./external/android-ui-verification/) | `external` | Automated end-to-end UI testing and verification on an Android Emulator using ADB. Use when an Android build needs driving on an emulator to |
193
198
  | [`compose-components`](./external/compose-components/) | `external` | Build Material 3 UI components and custom composables with Jetpack Compose. Covers TopAppBar, Scaffold, BottomSheet, SnackbarHost, slot-base |
194
199
  | [`compose-navigation`](./external/compose-navigation/) | `external` | Implement type-safe navigation in Jetpack Compose using Navigation 2.8+ with @Serializable routes, NavHost, composable<Route>, nested naviga |
195
200
  | [`compose-testing`](./external/compose-testing/) | `external` | Test Jetpack Compose UI with createComposeRule, semantic matchers (onNodeWithText, onNodeWithTag, onNodeWithContentDescription), actions (pe |
@@ -255,6 +260,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
255
260
  | [`localization-reuse-map`](./external/localization-reuse-map/) | `external` | >- |
256
261
  | [`pdfkit`](./external/pdfkit/) | `external` | Display and manipulate PDF documents using PDFKit. Use when embedding PDFView to show PDF files, creating or modifying PDFDocument instances |
257
262
  | [`search-first`](./external/search-first/) | `external` | \| |
263
+ | [`security-review`](./external/security-review/) | `external` | Run a defensive, static security review of a diff or a repo: build a run-scoped threat model, find vulnerabilities joined to OWASP + CWE wit |
258
264
  | [`signal-community`](./external/signal-community/) | `external` | Check whether other people hit the same problem, via Stack Overflow and Hacker News (keyless) plus opt-in Reddit and X. Use when a bug repor |
259
265
  | [`skill-creator`](./external/skill-creator/) | `external` | Author and refine skills for a plugin/toolkit efficiently. Use when creating a new skill, trimming or splitting an existing one, writing a s |
260
266
  | [`spm-build-analysis`](./external/spm-build-analysis/) | `external` | Analyze Swift Package Manager dependencies, package plugins, module variants, and CI-oriented build overhead that slow Xcode builds. Use whe |
@@ -422,9 +422,8 @@ Two halves, one phase, one approval gate (Phases 1 and 2 until 19.0.0).
422
422
 
423
423
  **1a - Analysis** (claude-sonnet-5, `explorer` persona)
424
424
  1. Launch **explore agents** (parallel) to scan the codebase: related files, existing patterns and conventions, potential impact areas
425
- 2. Optionally launch **security-auditor** agent for pre-check
426
- 3. Summarize findings
427
- 4. Log: `📊 Phase 1: Plan (analysis) - {N} files identified, {summary}`
425
+ 2. Summarize findings
426
+ 3. Log: `📊 Phase 1: Plan (analysis) - {N} files identified, {summary}`
428
427
 
429
428
  **1b - Planning** (claude-fable-5)
430
429
  1. Create task breakdown → todos with dependencies
@@ -633,7 +632,7 @@ Sub-agents have embedded skills in their `.agent.md` files. Each agent is pre-lo
633
632
  |-------|----------------|----------------|
634
633
  | **code-reviewer** | Code Review Excellence, Security Audit, Performance Review, TDD Verification, Error Detective | Phase 3: Review |
635
634
  | **ios-architect** | Spec-Driven Architecture, Context Management, Multi-Agent Coordination, API Design, Performance Architecture, Design System Governance | Phase 1: Plan |
636
- | **security-auditor** | iOS Security Deep Dive, App Store Review Gates, Third-Party SDK Risk, Error Detective (Security) | Phase 1: Plan (analysis half, pre-check) + Phase 3: Review |
635
+ | **security-auditor** | iOS Security Deep Dive, App Store Review Gates, Third-Party SDK Risk, Error Detective (Security) | Phase 3: Review |
637
636
 
638
637
  ### Phase → Agent → Skills Flow
639
638
 
@@ -3,7 +3,7 @@ name: multi-agent-scan
3
3
  language: en
4
4
  description: "Skill security scan: walks local skill directories against a tiered pattern catalog. Use when local skill directories need checking for unsafe or unexpected content."
5
5
  user-invocable: true
6
- argument-hint: "[--strict] [--target <path>] - optional: --strict enables CI failure mode, --target picks a custom directory"
6
+ argument-hint: "[--strict] [--root PATH] - optional: --strict enables strict exit codes, --root picks a custom directory"
7
7
  ---
8
8
 
9
9
  # multi-agent-scan
@@ -55,7 +55,7 @@ multi-agent-scan --root ~/.copilot/skills
55
55
  ## Integration
56
56
 
57
57
  - **install.js** pre-deploy hook (automatic, warn-only high-threshold)
58
- - **CI** `.github/workflows/smoke.yml` step (strict)
58
+ - **Smoke suite** `smoke-skill-scan.sh` runs it in strict mode under `npm test`
59
59
  - **Standalone** this skill
60
60
 
61
61
  Cross-CLI parity: `/multi-agent:scan` on Claude Code, `multi-agent-scan` on Copilot CLI. Same source script, same behavior.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: multi-agent-security-review
3
+ language: en
4
+ description: "Run a standalone defensive, static security review of a diff, branch or repo: run-scoped threat model, reviewer-shaped findings joined to OWASP + CWE with CVSS scoring, evidence and before/after fixes, plus an offline dependency inventory. No live target, no payloads. Use when reviewing code for security outside a full pipeline run, auditing dependencies, or preparing a branch for a security sign-off."
5
+ user-invocable: true
6
+ argument-hint: "[#N | repo#N | PR-URL | branch | path] - a PR, a local branch, or a path to scope the review. If omitted: the current branch diff against its base."
7
+ ---
8
+
9
+ # multi-agent security-review - standalone defensive static review
10
+
11
+ **Input**: `$ARGUMENTS`
12
+
13
+ The same security audit Phase 3 runs at Step 2.7, invoked on its own. Defensive and static: reads code, config and dependency manifests; never runs the target, fires a payload, or reaches a live host.
14
+
15
+ ## Scope
16
+
17
+ Resolve from `$ARGUMENTS`, same shapes as `/multi-agent:review`: `#N` / `repo#N` / PR URL → that PR's diff; a branch → its diff against base; a path → files under it; omitted → the current branch diff. Cap the diff as Phase 3 Step 1.9 does.
18
+
19
+ ## Steps
20
+
21
+ 1. **Threat model** - produce `.pipeline/threat-model.md` (four sections) if absent, else read it; mirror to `state.threatModel`. Contract: `threat-model.md`.
22
+ 2. **Method** - load `ai-common-toolkit:security-review` for the OWASP walk (Web/API Top 10 2021, Mobile Top 10 2024) + CWE join. This command orchestrates, it does not re-derive the method.
23
+ 3. **Findings** - dispatch the `security-auditor`; it returns a `reviewer-output.schema.json` object whose `findings[]` carry the `security` envelope (`security-finding.schema.json`). Score every vector with the toolkit `security_cvss_score`; validate with `validate-reviewer.mjs` (one rework then halt).
24
+ 4. **Dependencies** - run `security_dep_inventory` on the lockfiles; hand the inventory to `ai-analyst-toolkit:evidence-registry` for known CVEs when it is registered. A vulnerable dependency is an `A06:2021` finding with the advisory CWE + CVE. This command contacts nothing itself.
25
+ 5. **Report** - write `.pipeline/security-findings.json` and a human summary (count by severity; each blocking/important finding with OWASP id, CWE, CVSS band, evidence, before/after fix). An empty list with `approved: true` is a clean review.
26
+
27
+ ## Boundaries
28
+
29
+ Inside a run the same audit is Phase 3 Step 2.7 (`features/security-audit.md`), triggered by the `security_path` signal; this is the standalone entry point. Not the `store-ready` device pass, not a secret scanner (`pre-commit-check.sh` covers secrets). No writes to Jira / GitHub / Confluence. Autopilot reviews the current branch, writes the report, opens no PR.
@@ -32,7 +32,7 @@ Run all steps automatically:
32
32
  ```
33
33
  Step 0: DOCTOR node $HOME/.claude/scripts/doctor.mjs - exit 2 or 4 STOPS the sync
34
34
  Step 1: DETECT Compare timestamps, find stale targets
35
- Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 57 sub-command skills)
35
+ Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 58 sub-command skills)
36
36
  Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + 57 specs as refs + 8 agent TOML)
37
37
  Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
38
38
  Step 3d: DEV-TOOLKIT Companion MCP server -> detect movement, ship gates, commit + publish
@@ -228,7 +228,7 @@ When invoked with the `release` argument:
228
228
  |-------------|-------------|
229
229
  | `~/.claude/commands/multi-agent/{cmd}/SKILL.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
230
230
 
231
- **57 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
231
+ **58 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
232
232
 
233
233
  ```
234
234
  analysis, analysis-jira, analysis-resolve, autopilot, autopilot-off,
@@ -239,7 +239,7 @@ language, log, manual-test, model, prune-logs,
239
239
  prune-prompts, purge, refactor, resume, review,
240
240
  review-analysis, review-issue, review-jira, route-off, route-on,
241
241
  route-status, routines, save, scan, search,
242
- setup, stack, status, steer, store-ready, sync, test, test-accessibility,
242
+ security-review, setup, stack, status, steer, store-ready, sync, test, test-accessibility,
243
243
  test-dark-mode, test-dynamic-type, test-screenshots, testflight-validation,
244
244
  uninstall, update
245
245
  ```
@@ -12,10 +12,12 @@ and Jetpack libraries from 2024-2025.
12
12
  ## Contents
13
13
 
14
14
  - [Multi-Module Structure](#multi-module-structure)
15
+ - [Feature api/impl Split](#feature-apiimpl-split)
15
16
  - [Domain Layer](#domain-layer)
16
17
  - [Data Layer](#data-layer)
17
18
  - [Presentation Layer](#presentation-layer)
18
19
  - [Hilt Dependency Injection](#hilt-dependency-injection)
20
+ - [Cross-Module Navigation Graph Aggregation](#cross-module-navigation-graph-aggregation)
19
21
  - [Mapper Pattern](#mapper-pattern)
20
22
  - [Do's and Don'ts](#dos-and-donts)
21
23
  - [Troubleshooting](#troubleshooting)
@@ -77,6 +79,33 @@ include(":feature:search")
77
79
  include(":feature:detail")
78
80
  ```
79
81
 
82
+ ## Feature api/impl Split
83
+
84
+ For features that navigate to each other, split each one into two modules:
85
+
86
+ - `:feature:x:api` -- only the cross-feature contract: `@Serializable` route
87
+ definitions and the entry-param models a caller needs to launch the feature.
88
+ - `:feature:x:impl` -- screens, ViewModels, UI state, and DI wiring.
89
+
90
+ A feature depends only on the `:api` of the features it navigates to, never
91
+ their `:impl`:
92
+
93
+ ```kotlin
94
+ // feature:home:impl/build.gradle.kts
95
+ dependencies {
96
+ implementation(project(":feature:home:api"))
97
+ implementation(project(":feature:detail:api")) // route + entry params only
98
+ // NEVER depend on :feature:detail:impl
99
+ }
100
+ ```
101
+
102
+ Because no `impl` module can see another `impl`, they stay mutually invisible,
103
+ compile in parallel, and cannot form dependency cycles. The `:app` module wires
104
+ them together (see
105
+ [Cross-Module Navigation Graph Aggregation](#cross-module-navigation-graph-aggregation)).
106
+ Full module layout and route contract:
107
+ [references/patterns.md#feature-apiimpl-split](references/patterns.md#feature-apiimpl-split).
108
+
80
109
  ## Domain Layer
81
110
 
82
111
  The domain layer contains business logic with zero Android dependencies. It
@@ -231,6 +260,11 @@ sealed interface HomeUiState {
231
260
  }
232
261
  ```
233
262
 
263
+ For the reusable base ViewModel seam these screen ViewModels extend -- immutable
264
+ state as `StateFlow`, one-shot events, a single intent entry point, and
265
+ centralized use-case execution -- see the `android-mvi-viewmodel` skill. Do not
266
+ reimplement that base class here.
267
+
234
268
  ## Hilt Dependency Injection
235
269
 
236
270
  ### Application Setup
@@ -324,6 +358,36 @@ abstract class DispatcherModule {
324
358
  }
325
359
  ```
326
360
 
361
+ ## Cross-Module Navigation Graph Aggregation
362
+
363
+ Each `:impl` module contributes its destinations to a shared `Set<NavGraph>` via
364
+ Hilt multibinding; the host registers the whole set into one `NavHost`. The
365
+ `:app` module never depends on any `:impl`.
366
+
367
+ ```kotlin
368
+ fun interface NavGraph {
369
+ fun NavGraphBuilder.build(navController: NavHostController)
370
+ }
371
+
372
+ // In each :impl module
373
+ @Module
374
+ @InstallIn(SingletonComponent::class)
375
+ abstract class HomeNavModule {
376
+ @Binds
377
+ @IntoSet
378
+ abstract fun bindHomeNavGraph(impl: HomeNavGraph): NavGraph
379
+ }
380
+
381
+ // In :app -- register every contributed graph, naming no feature
382
+ NavHost(navController, startDestination = HomeRoute) {
383
+ navGraphs.forEach { graph -> with(graph) { build(navController) } }
384
+ }
385
+ ```
386
+
387
+ This wires many feature modules into a single `NavHost` without the app module
388
+ depending on every `impl`. Full host injection and per-feature contribution:
389
+ [references/patterns.md#cross-module-navigation-graph-aggregation](references/patterns.md#cross-module-navigation-graph-aggregation).
390
+
327
391
  ## Mapper Pattern
328
392
 
329
393
  Mappers isolate layer boundaries. Each layer has its own model type.
@@ -372,9 +436,13 @@ class FlightMapper @Inject constructor() {
372
436
  - Define a `DispatcherProvider` interface for testable coroutine dispatchers
373
437
  - One use case per business operation
374
438
  - Use `sealed interface` for UI state to guarantee exhaustive `when` handling
439
+ - Split each feature into `:api` (routes + entry params) and `:impl` (screens, ViewModels, DI)
440
+ - Aggregate feature nav graphs into the host with Hilt `@IntoSet` multibinding
375
441
 
376
442
  ### Don'ts
377
443
  - Do not let feature modules depend on each other directly
444
+ - Do not depend on another feature's `:impl` module -- depend on its `:api` only
445
+ - Do not make the `:app` module reference feature `impl` modules in code
378
446
  - Do not put Android framework classes in the domain layer
379
447
  - Do not expose `MutableStateFlow` from ViewModels (expose read-only `StateFlow`)
380
448
  - Do not inject `Activity` or `Fragment` into ViewModels
@@ -402,6 +470,9 @@ class FlightMapper @Inject constructor() {
402
470
  - [ ] UI state is a `sealed interface` with Loading/Success/Error
403
471
  - [ ] Hilt modules use `@Binds` for interfaces, `@Provides` for instances
404
472
  - [ ] Feature modules do not depend on each other
473
+ - [ ] Each feature is split into `:api` (routes/entry params) and `:impl` (screens/ViewModels/DI)
474
+ - [ ] Feature `impl` modules depend only on other features' `api`, never their `impl`
475
+ - [ ] Feature nav graphs aggregate into the host via Hilt `@IntoSet` multibinding
405
476
  - [ ] Mappers separate DTO/Entity/Domain models
406
477
  - [ ] Coroutine dispatchers are injectable via `DispatcherProvider`
407
478
  - [ ] No `GlobalScope` usage; all coroutines use structured concurrency
@@ -0,0 +1,142 @@
1
+ # Android Clean Architecture -- Reference Patterns
2
+
3
+ Full code for the patterns summarized in `SKILL.md`. Load the section you need
4
+ when implementing that specific structure.
5
+
6
+ ## Contents
7
+
8
+ - [Feature api/impl Split](#feature-apiimpl-split)
9
+ - [Cross-Module Navigation Graph Aggregation](#cross-module-navigation-graph-aggregation)
10
+
11
+ ## Feature api/impl Split
12
+
13
+ Split every feature into an `:api` module (the cross-feature contract) and an
14
+ `:impl` module (everything private to the feature).
15
+
16
+ ```
17
+ :feature:home:api # Serializable routes + entry-param models only
18
+ :feature:home:impl # Screens, ViewModels, UI state, DI
19
+ :feature:search:api
20
+ :feature:search:impl
21
+ :feature:detail:api
22
+ :feature:detail:impl
23
+ ```
24
+
25
+ ### The api module holds only the contract
26
+
27
+ ```kotlin
28
+ // :feature:detail:api
29
+ @Serializable
30
+ data class DetailRoute(val id: String)
31
+
32
+ @Serializable
33
+ data class DetailEntryParams(val id: String, val source: String)
34
+ ```
35
+
36
+ No screens, no ViewModels, no Compose dependency -- just the route and the
37
+ models a caller needs to launch the feature.
38
+
39
+ ### The impl module holds everything private
40
+
41
+ ```kotlin
42
+ // :feature:detail:impl -- not visible to any other feature
43
+ @HiltViewModel
44
+ class DetailViewModel @Inject constructor(
45
+ savedStateHandle: SavedStateHandle,
46
+ private val getDetailUseCase: GetDetailUseCase,
47
+ ) : ViewModel() {
48
+ private val route = savedStateHandle.toRoute<DetailRoute>()
49
+ // ... state, intents, events
50
+ }
51
+
52
+ @Composable
53
+ internal fun DetailScreen(viewModel: DetailViewModel = hiltViewModel()) { /* ... */ }
54
+ ```
55
+
56
+ ### Dependency direction
57
+
58
+ ```kotlin
59
+ // feature:home:impl/build.gradle.kts
60
+ dependencies {
61
+ implementation(project(":feature:home:api"))
62
+ implementation(project(":feature:detail:api")) // route + entry params only
63
+ implementation(project(":core:model"))
64
+ implementation(project(":core:ui"))
65
+ // NEVER implementation(project(":feature:detail:impl"))
66
+ }
67
+ ```
68
+
69
+ Because no `impl` module can see another `impl`, the graph of feature modules is
70
+ acyclic by construction, the modules compile in parallel, and a caller can only
71
+ couple to a feature through its published route and entry params.
72
+
73
+ ## Cross-Module Navigation Graph Aggregation
74
+
75
+ Each `:impl` module contributes its destinations to a shared `Set<NavGraph>` via
76
+ Hilt multibinding. The host module (`:app`) injects the full set and registers
77
+ every contribution into one `NavHost`, without depending on any `:impl`.
78
+
79
+ ### The contribution contract
80
+
81
+ ```kotlin
82
+ // :core:ui (or a :core:navigation module)
83
+ fun interface NavGraph {
84
+ fun NavGraphBuilder.build(navController: NavHostController)
85
+ }
86
+ ```
87
+
88
+ ### Each feature contributes its graph
89
+
90
+ ```kotlin
91
+ // :feature:home:impl
92
+ class HomeNavGraph @Inject constructor() : NavGraph {
93
+ override fun NavGraphBuilder.build(navController: NavHostController) {
94
+ composable<HomeRoute> {
95
+ HomeScreen()
96
+ }
97
+ }
98
+ }
99
+
100
+ @Module
101
+ @InstallIn(SingletonComponent::class)
102
+ abstract class HomeNavModule {
103
+ @Binds
104
+ @IntoSet
105
+ abstract fun bindHomeNavGraph(impl: HomeNavGraph): NavGraph
106
+ }
107
+ ```
108
+
109
+ ### The host registers the whole set
110
+
111
+ ```kotlin
112
+ // :app
113
+ @Composable
114
+ fun AppNavHost(
115
+ navGraphs: Set<@JvmSuppressWildcards NavGraph>,
116
+ navController: NavHostController = rememberNavController(),
117
+ startDestination: Any = HomeRoute,
118
+ ) {
119
+ NavHost(navController = navController, startDestination = startDestination) {
120
+ navGraphs.forEach { graph -> with(graph) { build(navController) } }
121
+ }
122
+ }
123
+ ```
124
+
125
+ Injecting the set into the composable is done with a Hilt entry point or by
126
+ passing it from an `@AndroidEntryPoint` activity:
127
+
128
+ ```kotlin
129
+ @AndroidEntryPoint
130
+ class MainActivity : ComponentActivity() {
131
+ @Inject lateinit var navGraphs: Set<@JvmSuppressWildcards NavGraph>
132
+
133
+ override fun onCreate(savedInstanceState: Bundle?) {
134
+ super.onCreate(savedInstanceState)
135
+ setContent { AppNavHost(navGraphs = navGraphs) }
136
+ }
137
+ }
138
+ ```
139
+
140
+ Adding a feature to the app is now: add its `:impl` to the `:app` runtime
141
+ classpath and its `@IntoSet` binding registers automatically. The `:app` module
142
+ never names the feature in code.