agentic-team 0.0.0-stage → 6.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.
- package/LICENSE +21 -0
- package/README.md +189 -2
- package/bin/build-template.js +208 -0
- package/bin/index.js +1334 -0
- package/bin/platforms.js +510 -0
- package/package.json +41 -4
- package/template/.claude-plugin/plugin.json +10 -0
- package/template/.orchestra/README.md +391 -0
- package/template/.orchestra/blueprints/README.md +87 -0
- package/template/.orchestra/blueprints/api-only.md +46 -0
- package/template/.orchestra/blueprints/component-crud-resource.md +25 -0
- package/template/.orchestra/blueprints/saas-starter.md +69 -0
- package/template/.orchestra/config.yml +293 -0
- package/template/.orchestra/roles/orchestrator.md +105 -0
- package/template/.orchestra/roles/product-manager.md +439 -0
- package/template/.orchestra/scripts/compact-diff.awk +45 -0
- package/template/.orchestra/scripts/context.mjs +373 -0
- package/template/.orchestra/stacks/README.md +81 -0
- package/template/.orchestra/stacks/_lib/common.sh +3095 -0
- package/template/.orchestra/stacks/_repo/setup.sh +1113 -0
- package/template/.orchestra/stacks/backend-hono/claude/commands/endpoint.md +13 -0
- package/template/.orchestra/stacks/backend-hono/claude/skills/api-endpoint/SKILL.md +111 -0
- package/template/.orchestra/stacks/backend-hono/claude/skills/testing/SKILL.md +75 -0
- package/template/.orchestra/stacks/backend-hono/setup.sh +5945 -0
- package/template/.orchestra/stacks/backend-hono/stack.md +195 -0
- package/template/.orchestra/stacks/mobile-android-native/claude/commands/component.md +13 -0
- package/template/.orchestra/stacks/mobile-android-native/claude/skills/design-component/SKILL.md +58 -0
- package/template/.orchestra/stacks/mobile-android-native/setup.sh +607 -0
- package/template/.orchestra/stacks/mobile-android-native/stack.md +138 -0
- package/template/.orchestra/stacks/mobile-expo/claude/commands/component.md +12 -0
- package/template/.orchestra/stacks/mobile-expo/claude/skills/design-component/SKILL.md +92 -0
- package/template/.orchestra/stacks/mobile-expo/setup.sh +470 -0
- package/template/.orchestra/stacks/mobile-expo/stack.md +141 -0
- package/template/.orchestra/stacks/mobile-ios-native/claude/commands/component.md +12 -0
- package/template/.orchestra/stacks/mobile-ios-native/claude/skills/design-component/SKILL.md +58 -0
- package/template/.orchestra/stacks/mobile-ios-native/setup.sh +468 -0
- package/template/.orchestra/stacks/mobile-ios-native/stack.md +130 -0
- package/template/.orchestra/stacks/web-nextjs/claude/commands/component.md +12 -0
- package/template/.orchestra/stacks/web-nextjs/claude/skills/design-component/SKILL.md +100 -0
- package/template/.orchestra/stacks/web-nextjs/claude/skills/design-tokens/SKILL.md +61 -0
- package/template/.orchestra/stacks/web-nextjs/setup.sh +128 -0
- package/template/.orchestra/stacks/web-nextjs/stack.md +170 -0
- package/template/.orchestra/stacks/web-vite-react/claude/commands/component.md +12 -0
- package/template/.orchestra/stacks/web-vite-react/claude/skills/design-component/SKILL.md +100 -0
- package/template/.orchestra/stacks/web-vite-react/claude/skills/design-tokens/SKILL.md +61 -0
- package/template/.orchestra/stacks/web-vite-react/setup.sh +185 -0
- package/template/.orchestra/stacks/web-vite-react/stack.md +177 -0
- package/template/.orchestra/trackers/github.sh +467 -0
- package/template/CLAUDE.md +54 -0
- package/template/agents/architect.md +83 -0
- package/template/agents/engineer-high.md +17 -0
- package/template/agents/engineer-low.md +17 -0
- package/template/agents/engineer-max.md +17 -0
- package/template/agents/engineer-medium.md +17 -0
- package/template/agents/engineer-xhigh.md +17 -0
- package/template/agents/lead.md +925 -0
- package/template/agents/milestone-reviewer.md +65 -0
- package/template/agents/orchestrator.md +105 -0
- package/template/agents/product-manager.md +439 -0
- package/template/agents/re-reviewer.md +25 -0
- package/template/agents/reviewer.md +303 -0
- package/template/agents/scaffolder.md +206 -0
- package/template/agents/tracker.md +202 -0
- package/template/commands/blueprint.md +23 -0
- package/template/commands/create-role.md +64 -0
- package/template/commands/export.md +45 -0
- package/template/commands/help.md +56 -0
- package/template/commands/hotfix.md +14 -0
- package/template/commands/orchestrator.md +12 -0
- package/template/commands/pm.md +18 -0
- package/template/commands/rewind.md +63 -0
- package/template/commands/setup.md +15 -0
- package/template/commands/start.md +29 -0
- package/template/commands/status.md +11 -0
- package/template/commands/sync.md +76 -0
- package/template/commands/verifier.md +53 -0
- package/template/hooks/audit-context.sh +166 -0
- package/template/hooks/enforce-role.sh +193 -0
- package/template/hooks/protect-system-files.sh +123 -0
- package/template/hooks/review-rounds.sh +172 -0
- package/template/rules/acceptance-check.orchestra.md +11 -0
- package/template/rules/analytics-kpi.orchestra.md +56 -0
- package/template/rules/code-standards.orchestra.md +35 -0
- package/template/rules/comments.orchestra.md +77 -0
- package/template/rules/commit-format.orchestra.md +20 -0
- package/template/rules/dependency-upgrade.orchestra.md +112 -0
- package/template/rules/design-parity.orchestra.md +181 -0
- package/template/rules/observability.orchestra.md +121 -0
- package/template/rules/performance.orchestra.md +190 -0
- package/template/rules/phase-limits.orchestra.md +3 -0
- package/template/rules/pull-request.orchestra.md +218 -0
- package/template/rules/role-boundaries.orchestra.md +132 -0
- package/template/rules/security.orchestra.md +106 -0
- package/template/rules/stuck-detection.orchestra.md +25 -0
- package/template/rules/testing-standards.orchestra.md +219 -0
- package/template/rules/tracker-authority.orchestra.md +198 -0
- package/template/rules/verification-gate.orchestra.md +56 -0
- package/template/skills/accessibility/SKILL.md +31 -0
- package/template/skills/android-testing/SKILL.md +112 -0
- package/template/skills/architecture/SKILL.md +175 -0
- package/template/skills/auth-setup/SKILL.md +105 -0
- package/template/skills/best-practices/SKILL.md +29 -0
- package/template/skills/code-optimizer/SKILL.md +27 -0
- package/template/skills/core-web-vitals/SKILL.md +32 -0
- package/template/skills/crud-api/SKILL.md +32 -0
- package/template/skills/debug/SKILL.md +28 -0
- package/template/skills/deployment/SKILL.md +104 -0
- package/template/skills/error-handling/SKILL.md +154 -0
- package/template/skills/frontend-design/SKILL.md +30 -0
- package/template/skills/fullstack-infrastructure/SKILL.md +108 -0
- package/template/skills/ios-testing/SKILL.md +100 -0
- package/template/skills/mobile-testing/SKILL.md +102 -0
- package/template/skills/observability/SKILL.md +91 -0
- package/template/skills/project-structure/SKILL.md +114 -0
- package/template/skills/push-notifications/SKILL.md +146 -0
- package/template/skills/react-best-practices/SKILL.md +31 -0
- package/template/skills/realtime/SKILL.md +146 -0
- package/template/skills/review/SKILL.md +82 -0
- package/template/skills/testing/SKILL.md +45 -0
- package/template/skills/web-quality-audit/SKILL.md +47 -0
- package/template/skills/web-testing/SKILL.md +120 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Mobile — Native Android (Kotlin)
|
|
2
|
+
|
|
3
|
+
## Who you are
|
|
4
|
+
|
|
5
|
+
You are a **senior native Android engineer**. Not a web developer writing
|
|
6
|
+
Kotlin. You know the lifecycle, you know configuration changes will happen,
|
|
7
|
+
and you know process death is a normal event your app must survive.
|
|
8
|
+
|
|
9
|
+
You treat leaked coroutines, blocked main threads, and state that dies on
|
|
10
|
+
rotation as bugs you catch yourself.
|
|
11
|
+
|
|
12
|
+
SOLID, KISS, YAGNI. No overengineering: no use-case class that forwards one
|
|
13
|
+
call, no DI module for a single object.
|
|
14
|
+
|
|
15
|
+
## Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
app/ # features, screens, navigation
|
|
19
|
+
└── src/{main,test,androidTest}/kotlin/
|
|
20
|
+
designsystem/ # the UI kit. no business logic. ever.
|
|
21
|
+
└── src/{main,test}/kotlin/
|
|
22
|
+
├── Tokens.kt
|
|
23
|
+
└── button/
|
|
24
|
+
└── Button.kt
|
|
25
|
+
gradle/libs.versions.toml # every dependency version, one file
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`designsystem` is a separate Gradle module so the boundary is enforced by
|
|
29
|
+
the build, not by discipline. It cannot import from `app`.
|
|
30
|
+
|
|
31
|
+
Every component gets its own package, mirroring the web, Expo, and iOS
|
|
32
|
+
stacks — one mental model across the repo.
|
|
33
|
+
|
|
34
|
+
## Versions are explicit here
|
|
35
|
+
|
|
36
|
+
Unlike the npm stacks, dependency versions live in
|
|
37
|
+
`gradle/libs.versions.toml` and are written out in full. Gradle has no safe
|
|
38
|
+
`@latest`: dynamic versions (`1.+`) destroy build reproducibility and fail
|
|
39
|
+
in ways that are painful to debug.
|
|
40
|
+
|
|
41
|
+
The version catalog is exactly what Dependabot updates, so upgrades still
|
|
42
|
+
arrive as reviewable PRs — the mechanism differs from npm, the outcome does
|
|
43
|
+
not.
|
|
44
|
+
|
|
45
|
+
## Order of work
|
|
46
|
+
|
|
47
|
+
Tokens before composables. Extract every axis from the design source —
|
|
48
|
+
color, spacing, typography, radii, elevation, motion — into `Tokens.kt` and
|
|
49
|
+
the Compose theme. Composables reference the theme, never a raw `Color(0xFF…)`
|
|
50
|
+
or a bare `16.dp`.
|
|
51
|
+
|
|
52
|
+
A composable with a hardcoded color or dimension is a bug.
|
|
53
|
+
|
|
54
|
+
## No ready-made components
|
|
55
|
+
|
|
56
|
+
The kit is built from `androidx.compose.foundation` — `Box`, `Row`,
|
|
57
|
+
`Text`, `Modifier.clickable`, `LazyColumn`. Material3 components are not
|
|
58
|
+
used; we do not inherit someone else's design language.
|
|
59
|
+
|
|
60
|
+
Foundation is the substrate, not a UI kit. Wrapping it in our own
|
|
61
|
+
components is the job.
|
|
62
|
+
|
|
63
|
+
## Kotlin rules
|
|
64
|
+
|
|
65
|
+
- Immutable by default. `val` unless mutation is required.
|
|
66
|
+
- Null safety is a design tool. `!!` outside tests is a defect.
|
|
67
|
+
- Structured concurrency: every coroutine has an owning scope. No
|
|
68
|
+
`GlobalScope`.
|
|
69
|
+
- Main thread does no I/O and no parsing. Ever.
|
|
70
|
+
- Sealed types for state that has a fixed set of shapes.
|
|
71
|
+
|
|
72
|
+
## Compose
|
|
73
|
+
|
|
74
|
+
- Small composables. State hoisted to the lowest owner that can hold it.
|
|
75
|
+
- Survive configuration change and process death — `rememberSaveable` or a
|
|
76
|
+
`ViewModel` with `SavedStateHandle`, not bare `remember`.
|
|
77
|
+
- `LazyColumn` for lists, with stable keys. A `Column` over server data
|
|
78
|
+
will jank.
|
|
79
|
+
- No side effects in composition. Use the effect APIs.
|
|
80
|
+
|
|
81
|
+
## Memory — the JVM collects, and still leaks
|
|
82
|
+
|
|
83
|
+
The collector frees what nothing references. What leaks on Android is a
|
|
84
|
+
reference held past its lifetime, and the usual holder is a `Context`:
|
|
85
|
+
|
|
86
|
+
- A `ViewModel`, a singleton or a companion object never holds an
|
|
87
|
+
`Activity`, a `View`, a `Fragment`, or a `Context` that is not the
|
|
88
|
+
application's. It outlives them; they cannot be freed.
|
|
89
|
+
- A `Flow` is collected inside `repeatOnLifecycle` or `collectAsStateWithLifecycle`,
|
|
90
|
+
never from a scope that survives the screen. Structured concurrency — the
|
|
91
|
+
rule above — is what ends the coroutine when the owner goes.
|
|
92
|
+
- Listeners registered on a system service, a sensor, a broadcast — are
|
|
93
|
+
unregistered in the matching lifecycle callback. Registration without the
|
|
94
|
+
pair is a leak.
|
|
95
|
+
- In composition, allocation is the recomposition cost. An object built in
|
|
96
|
+
a composable body is rebuilt every recomposition; `remember` it. A lambda
|
|
97
|
+
that captures unstable state recomposes its caller. Nothing is created
|
|
98
|
+
inside a `LazyColumn` item that could be created once outside it.
|
|
99
|
+
- **LeakCanary is in the debug build.** It watches destroyed activities,
|
|
100
|
+
fragments, view models and views, and reports a retained one with the
|
|
101
|
+
chain that holds it — so a leak shows up while the screen is being built,
|
|
102
|
+
not in a crash report. A LeakCanary notification is a defect to fix, not
|
|
103
|
+
to dismiss.
|
|
104
|
+
|
|
105
|
+
## Testing
|
|
106
|
+
|
|
107
|
+
Coverage target is effectively total. The deciding rule:
|
|
108
|
+
|
|
109
|
+
> If one of our functions calls into a third-party library, that function
|
|
110
|
+
> has a test. When Dependabot bumps the library and behavior changes, the
|
|
111
|
+
> test must fail.
|
|
112
|
+
|
|
113
|
+
- JUnit for logic, Compose UI tests for behavior.
|
|
114
|
+
- Paparazzi for screenshot tests — they run on the JVM, so no emulator is
|
|
115
|
+
needed in CI.
|
|
116
|
+
- Screenshots catch visual drift only. Behavior needs its own tests.
|
|
117
|
+
- Test light and dark, and the largest font scale.
|
|
118
|
+
|
|
119
|
+
## Accessibility
|
|
120
|
+
|
|
121
|
+
Structural. Content descriptions on anything meaningful, `null` on anything
|
|
122
|
+
purely decorative — a described decoration is noise to a TalkBack user.
|
|
123
|
+
Minimum touch target 48×48dp. Layout survives the largest font scale.
|
|
124
|
+
TalkBack order must be sensible, not just complete.
|
|
125
|
+
|
|
126
|
+
## Tooling
|
|
127
|
+
|
|
128
|
+
Gradle Kotlin DSL — everything is text and reviewable. Verification runs
|
|
129
|
+
through `./gradlew`, not npm; `.orchestra/config.yml` reflects that.
|
|
130
|
+
|
|
131
|
+
## Toolchain
|
|
132
|
+
|
|
133
|
+
Gradle (`brew install gradle`), the Android SDK, and `ANDROID_HOME` set.
|
|
134
|
+
The scaffold assembles and tests as generated — `./verify.sh` runs compile,
|
|
135
|
+
test, and lint. Verified against a real build.
|
|
136
|
+
|
|
137
|
+
Note: AGP 9 has built-in Kotlin support. Do **not** add the
|
|
138
|
+
`org.jetbrains.kotlin.android` plugin — it fails the build.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Scaffold a new design system component.
|
|
2
|
+
|
|
3
|
+
Usage: `/web:component {Name}`
|
|
4
|
+
|
|
5
|
+
1. Load the `design-component` skill and follow it exactly.
|
|
6
|
+
2. Confirm every value the component needs has a token. If one is missing,
|
|
7
|
+
add it to `src/design/tokens.css` first — do not hardcode.
|
|
8
|
+
3. Create `src/design/{Name}/` with the component, types, tests, fixture,
|
|
9
|
+
and `index.ts`.
|
|
10
|
+
4. Export it from `src/design/index.ts`.
|
|
11
|
+
5. Run `npm run typecheck && npm test && npm run lint`.
|
|
12
|
+
6. Report the a11y checklist with each item explicitly checked or flagged.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-component
|
|
3
|
+
description: "Author a component in the design system — folder layout, API shape, tests, fixture, a11y. Use when adding or changing anything under src/design/."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring a design system component
|
|
7
|
+
|
|
8
|
+
## Folder
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
src/design/{Name}/
|
|
12
|
+
├── {Name}.tsx # the component, nothing else
|
|
13
|
+
├── {Name}.test.tsx # interaction tests + one snapshot
|
|
14
|
+
├── types.ts # props and any type this component owns
|
|
15
|
+
└── index.ts # public exports
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Then add the component to `src/design/index.ts`.
|
|
19
|
+
|
|
20
|
+
## Before writing
|
|
21
|
+
|
|
22
|
+
1. Does a token exist for every value you are about to use? If not, add the
|
|
23
|
+
token first. Never hardcode a color, radius, spacing, or duration.
|
|
24
|
+
2. Are you using the right primitive? `Pressable` over `TouchableOpacity`,
|
|
25
|
+
`FlatList` over a mapped array. A `View` with an onPress is a defect.
|
|
26
|
+
3. Does this component need to know anything about the product? If yes, it
|
|
27
|
+
does not belong in `src/design/`.
|
|
28
|
+
|
|
29
|
+
## API
|
|
30
|
+
|
|
31
|
+
- `forwardRef` to the root element
|
|
32
|
+
- merge `className` in, do not overwrite the caller's
|
|
33
|
+
- spread remaining props onto the root
|
|
34
|
+
- variants and sizes are unions (`"primary" | "danger"`), never independent
|
|
35
|
+
booleans that can contradict each other
|
|
36
|
+
- no default that hides a required decision
|
|
37
|
+
|
|
38
|
+
## Tests
|
|
39
|
+
|
|
40
|
+
Interaction first, snapshot second.
|
|
41
|
+
|
|
42
|
+
React Native Testing Library 14 — verified working shape. `render` is
|
|
43
|
+
**async** and queries come from `screen`, not from render's return value:
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
import { render, screen, userEvent } from "@testing-library/react-native";
|
|
47
|
+
import { Button } from "./Button";
|
|
48
|
+
|
|
49
|
+
test("fires onPress when pressed", async () => {
|
|
50
|
+
const user = userEvent.setup();
|
|
51
|
+
const onPress = jest.fn();
|
|
52
|
+
await render(<Button onPress={onPress} />);
|
|
53
|
+
|
|
54
|
+
await user.press(screen.getByRole("button"));
|
|
55
|
+
|
|
56
|
+
expect(onPress).toHaveBeenCalledTimes(1);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("does not fire when disabled", async () => {
|
|
60
|
+
const user = userEvent.setup();
|
|
61
|
+
const onPress = jest.fn();
|
|
62
|
+
await render(<Button onPress={onPress} disabled />);
|
|
63
|
+
|
|
64
|
+
await user.press(screen.getByRole("button"));
|
|
65
|
+
|
|
66
|
+
expect(onPress).not.toHaveBeenCalled();
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`const { getByRole } = render(...)` does not work in v14 — render returns a
|
|
71
|
+
promise, and destructuring it silently yields undefined queries.
|
|
72
|
+
|
|
73
|
+
Also cover: accessibilityState for disabled/selected, and one snapshot per
|
|
74
|
+
component for markup drift.
|
|
75
|
+
|
|
76
|
+
If the component wraps a third-party library, test *our* wrapper. A
|
|
77
|
+
Dependabot bump that changes the library's behavior has to turn this suite
|
|
78
|
+
red — that is the entire reason the suite exists.
|
|
79
|
+
|
|
80
|
+
## Accessibility checklist
|
|
81
|
+
|
|
82
|
+
- [ ] `accessibilityRole` set correctly
|
|
83
|
+
- [ ] `accessibilityLabel` present and meaningful
|
|
84
|
+
- [ ] `accessibilityState` reflects disabled/selected/checked
|
|
85
|
+
- [ ] touch target at least 44x44pt
|
|
86
|
+
- [ ] layout survives the largest system font scale
|
|
87
|
+
- [ ] contrast holds in both themes
|
|
88
|
+
|
|
89
|
+
## Done means
|
|
90
|
+
|
|
91
|
+
Component, types, tests, barrel export, and the a11y checklist — all of
|
|
92
|
+
it. Verified on both iOS and Android; one platform is half an answer.
|